본문 바로가기
Memo/우테코 4기

[우테코] 프리코스 3주차 회고 - 자판기

by 연로그 2021. 12. 14.
반응형

1주차 회고: https://yeonyeon.tistory.com/165

2주차 회고: https://yeonyeon.tistory.com/170

 


3주차 과제 안내 메일

👩‍💻 3주 차 진행 과정

3주 차 과제에 대한 설명은 링크로 대체하겠다.
  1. 다른 사람 코드 분석 (2주 차)
  2. 코딩
  3. 리팩토링
  4. 작업 흐름도 작성
  5. 리팩토링

 

분석

 2주 차때는 과제를 받자마자 빠르게 코딩을 시작했다면 3주 차는 최대한 천천히 시작했다.

2주 차의 다른 사람들 과제를 보며 실력의 격차가 느껴졌기 때문이고 이를 기회로 삼아 다른 사람들의 좋은 코드 스타일을 내 것으로 삼기 위함이었다. 사소하게는 메소드 이름, 변수명부터 매직 넘버를 처리하는 방법, MVC 패턴을 적용하기까지 많은 코드를 보고 이해하려고 노력했다. 그래도 나름 컴공을 전공했고 우수한 성적으로 졸업했으니 다른 사람들 하는 만큼은 하지 않을까 했는데 이것 역시 자만이었다니...^.T...

 

진행

 코딩을 진행하며 최대한 1, 2주 차 피드백을 반영하려고 노력하였으나...

정작 개발을 진행하니 내가 짠 로직인데도 미친듯이 헷갈리고 순서가 막 꼬이기 시작했다. 😵

그래서 1주 차 때의 나를 떠올리며... 일단 개발했다.

1주 차의 나

코드부터 일단 작성하고 부가적인건 나중에 생각했다.

그래서 이번엔 유난히 리팩토링을 하는 시간이 길었고 진행하며 사용 안하는 메소드를 발견하기도 했다. (왜 작성했던건지.......😅)

 

🚀 발전한 점

MVC 패턴의 도입

 MVC의 각 기능에 대해서는 뚜렷하게 알고 있다고 생각했는데 막상 개발을 시작하니 여기저기 코드가 꼬이고 Controller와 Model의 기능을 헷갈리기 시작했다. Model은 객체의 상태변화를 위주로, Controller는 실행 로직에 대한 메소드를 작성한다 생각하고 일단 돌아가게끔 개발을 진행했다. 다만 리팩토링을 앞두고 로직이 막막하게 느껴졌다. 이때 가장 먼저 풀리퀘를 남겨주셨던 최ㅈㅎ님이 공유해주신 글의 도움을 많이 받았다. '프로세스 도식화'를 그리고 눈에 보이게끔 실행 과정을 정리하자 복잡했던 머릿속이 정리되고 리팩토링을 진행할 수 있었다.

프로세스 도식화

 

유저 주문 취소 기능 Java 전환기

29CM 백엔드팀은 Python + Django 기반의 모놀리틱 서비스를 Java + Spring 기반의 MSA(Microservices Architecture) 로 전환을 진행하고 있습니다. 그 중 저희 스쿼드에서 담당하고 있는 취소/교환/반품…

medium.com

 

Enum 사용

Enum의 존재에 대해서는 알고 있었지만 실제로 사용해본 적이 없었다. 이번 기회에 Enum에 대해 알아보고 사용해보는 시간을 가졌다. (관련 포스팅: https://yeonyeon.tistory.com/171)

 

[Java] Enum에 대해

목차 1. Enum이란? 2. 사용 방법 3. 주요 메소드 4. Singleton과 Enum 1. Enum이란? 🤔 enumerance type = 열거형 JDK 1.5부터 생겨난 기능으로 열거체를 정의할 수 있는 클래스 비교 시 실제 값 뿐만 아니라..

yeonyeon.tistory.com

 

stream 사용

 다른 사람들의 코드를 보다가 stream을 사용한 분들의 코드가 정말 깔끔해보였다. 기존에는 stream을 굳이 사용할 이유을 못느꼈는데 이번에 연습삼아 반복문을 사용할 일이 있으면 최대한 stream을 사용하도록 노력했다. 이때 놀랐던 점 하나는 IntelliJ의 리팩토링 기능이었다.

 

  Products  객체는 모든  Product 가 재고 소진이 되었는지 확인하는 로직이 있다. 기존에는  filter() 를 통해 재고가 소진되었는지 확인하고 재고가 소진되지 않은  Product 가 하나라도 있으면 true/false를 반환하도록 했다. 하지만 IntelliJ가 노란 전구를 띄우며 한 가지 메소드를 추천해주었는데 바로  noneMatch() 였다. 아래 코드를 비교해보면 훨씬 더 깔끔해진 것을 확인할 수 있다.

 

AS-IS

public boolean isAllSoldOut() {
    return !products.stream()
            .filter(product -> product.isNotSoldOut())
            .findFirst()
            .isPresent();
}

 

TO-BE

public boolean isAllSoldOut() {
    return products.stream()
            .noneMatch(Product::isNotSoldOut);
}

 

🌟 아쉬운 점 & 진행중인 고민

getter의 사용

 2주 차 피드백에 의하면 객체에서 값을 꺼내지 않고 객체에 메시지를 보내는 방향이 좋다. 그래서 최대한 사용하지 않으려고 했으나... Product 객체 목록에서 price가 최소값을 찾아야했다. 어쩔 수 없이 getPrice()를 선언해서 값을 빼서 사용했는데... 이를 get하지 않고 내부에서 사용하는 방법이 있을지 궁금하다.

 

 처음에는 Comparator나 Comparable을 implements해서 price 기준으로 정렬한 뒤, 첫번째 요소를 가져오는 방법을 생각했었다. 다만 이 경우에는 정렬에 소요되는 시간복잡도가 O(nlogn)이었다. price를 직접 get해서 계산하면 O(n)이고 코드도 더 직관적일텐데 문제를 너무 어렵게 꼬는 듯한 생각이 들었다.

 

Constants의 적절한 사용

 보통 하드 코딩을 피하기 위해 private static final 키워드를 이용해 클래스 상단에 변수로 선언한다. 다른 분들의 코드를 봤을 때 따로 파일을 분리해서 해당 클래스에 private static final 변수의 목록을 나열하시는 분들이 많았다. (편의상 Constants라고 부르겠다.) 이 부분에 대해서는 많은 고민을 해보았는데... 내가 작업한 로직 내에서는 같은 문자열/넘버를 중복으로 사용되는 경우가 거의 없었고 Constants로 따로 관리하는 필요성에 대해 못 느껴서 적용했다가 롤백했다.

 

 다만 이 회고를 작성하면서 추가로 다른 사람들의 코드를 분석하다 깨달은건데 관리하기 편하기 때문에 분리한 것 같다. 상품명 입력 시 나타나는 오류 메시지를 변경하고 싶다면 상품명을 입력하는 로직이 실행되는 클래스를 찾아야하지만... Constants로 분리했다면 해당 로직을 찾을 필요 없이 Constants 파일만 찾으면 된다.

 

순서 있는 Map

 Map<Coin, Integer> 형태의 변수를 선언해서 거스름돈을 저장했다. (Coin은 Enum 클래스) 해당 Map에 존재하는 모든 데이터 값들을 출력할 때 문제가 있었다. 500원, 100원, 50원, 10원 순서대로 문자열을 만들어야 했고 Map은 순서를 보장하는 기능이 없었기 때문이다. TreeMap과 LinkedHashMap 중에서 고민이 되었다. TreeMap은 넣는 순서와 상관없이 자동으로 key 기준 정렬된다. LinkedHashMap내가 넣은 순서를 유지한다. 나중에 정렬을 커스텀할 일이 있을까 하는 마음으로 LinkedHashMap을 선택했지만 좋은 결정이었는지는 아직 의문으로 남아있다.

 

🐱‍👓 프리코스를 마치며...

정말 아쉽게도.. 벌써 3주차 프리코스가 완료되었다.😢

친구들끼리 코드 리뷰를 한 번 진행해본 적은 있었는데 나보다 더 전문가이신! 현업 개발자분들에게 코드 리뷰를 받는게 가장 즐거웠다.

비록 인원이 많아서 1:1 코멘트를 받지는 못했지만 공통 피드백만으로도 생각할 여지가 많았다.

매주 성장하는 자신을 발견하는 기회가 되어 기쁘게 생각한다.

 

최종 코테는 18일에 진행하는데 그 전까지는 1, 2주차 과제들을 리팩토링 할 생각이다.

원래는 과제 제출했던 Pull Request에 추가적으로 커밋/푸시가 일어나면 안되니까 못 건드렸는데...

생각해보니 브랜치를 새로 생성하면 되는거 아닌가? 뒤늦게 깨달았다😅

 

좋은 기회 얻게 되어 감사하고 앞으로도 우테코의 다른 참여자분들과 함께 성장할 수 있었으면 좋겠다.

 

+

이번 회고는 최종 과제 제출 시 함께 첨부하기 위해 미리 작성하였다.

이후 3주 차 피드백을 받는다면 포스트 하단에 추가로 첨부하겠다.

반응형