본문 바로가기
Study

[우아한 테크 캠프 Pro 2기] 1주차. 로또-TDD

by Jordy-torvalds 2021. 10. 1.
반응형

코드 경로

https://github.com/next-step/java-lotto/pulls?q=is%3Apr+is%3Aclosed+author%3Ajordy-torvalds 

 

GitHub - next-step/java-lotto: 로또 게임 구현을 관리하는 저장소

로또 게임 구현을 관리하는 저장소. Contribute to next-step/java-lotto development by creating an account on GitHub.

github.com

 

주요 내용

자동/수동 로또 구매 및 당첨 및 당첨금액 확인을 하는 간단한 프로그램을 짜보는 미션이었습니다. 구현 도메인 자체는 쉬웠으나 요구되는 요구사항들을 준수하며 개발하는 것이 어려웠습니다. 요구된 요구사항은 대략 아래와 같습니다.

  • TDD로 모든 기능을 구현
    • 비즈니스 로직와 UI 로직 분리
  • 들여쓰기는 1단계 까지 가능
  • 함수 길이는 15라인 이상 금지
  • 자바 코드 컨벤션 준수
  • else 예약어를 쓰지 않는다.
    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
  • 기능 단위 커밋
  • AngularJS Commit Message Conventions 준수

코드 리뷰 내용

아래와 같은 코드 리뷰를 받았습니다.

  • 생성사 내 유효성 검사 로직을 별도 메소드로 분리할 것 & 커스텀 예외를 통해 예외를 좀 더 명확히 표현할 것

 

  • 컬렉션 참조 변수의 변수명을 List 접미사 대신 복수형으로 표현할 것

 

  • validate 메소드에서 boolean 반환 보단 Exception을 throw 할 것

 

  • 팩토리 클래스 별도 선언을 지양하고 해당 클래스에게 위임할 것

 

  • 직접적인 List 대신 1급 컬렉션을 사용할 것

 

  • 1급 컬렉션인 LottoGames에 매번 add해주는게 아닌 한 번에 주입해줄 것
    • 도메인 특성상 생성자로 한 번에 주입시 add 메소드를 없애도 됩니다.
    • 결론적으로 LottoGames를 불변 객체로 만들 수 있어, 사이드 이펙트를 줄일 수 있습니다.

 

  • 원시값 대신 객체로 주고 받을 것

 

  • View와 Domain의 분리할 것

 

피드백 내용 외

  • 로또 번호는 1에서 45까지 있어 Flyweight 패턴을 사용해서 미리 선언을 해놓은 후에 가져다 쓰는 식으로 비즈니스 로직을 작성함으로써 불필요한 객체 선언을 막을 수 있었다.

 

느낀점

제가 특정 객체를 생성해주는 팩토리를 별도로 만드는 심각한 팩토리 클래스 충(?)이란 것을 깨달을 수 있었습니다. 또한 좋은 코드는 객체와 객체간의 대화이며, 원시값을 직접 쓰기 보단 객체를 선언해서 명확하게 의도를 표현하는 것이 좋다는 것을 깨달을 수 있는 미션이었습니다.

 

전체적으로 중점적으로 강조하는 것은 주석이 아닌 코드로 의도를 들어내고, 코드로 미래의 개발자에게 메시지를 전달할 수 있는 코드를 작성하는 것이 중요하다는 것을 깨달았습니다.

 

이 미션은 처음부터 끝까지 TDD로 진행했는데 백문이불여일타라는말이 있듯 많이 하다보니 TDD가 많이 늘었다는 것을 알 수 있었습니다.

반응형