우아한테크캠프 PRO/우아한테크캠프 회고록

[우아한테크캠프 Pro] 5주차 미션 후기 (Subway - ATDD & 단위테스트)

PI.314 2023. 1. 1. 23:54

우아한테크캠프 Pro 5주차 ATDD & 단위테스트 미션을 진행한 내용과 후기를 정리해보았습니다.

 

미션 저장소

https://github.com/Gyeom/atdd-subway-service

 

GitHub - Gyeom/atdd-subway-service: 우아한테크캠프 pro ATDD 과정 저장소

우아한테크캠프 pro ATDD 과정 저장소. Contribute to Gyeom/atdd-subway-service development by creating an account on GitHub.

github.com

 

학습 내용

  • ATDD를 기반으로 지하철 노선도 서비스를 단계별 구현한다.

단계별 요구사항 및 PR 리뷰

🚀 1단계 - 인수 테스트 기반 리팩터링

  • LineService의 비즈니스 로직을 도메인으로 옮기기
  • 한번에 많은 부분을 고치려 하지 말고 나눠서 부분부분 리팩터링하기
  • 전체 기능은 인수 테스트로 보호한 뒤 세부 기능을 TDD로 리팩터링하기

https://github.com/next-step/atdd-subway-service/pull/756

 

[김대겸] Step1 PR by Gyeom · Pull Request #756 · next-step/atdd-subway-service

안녕하세요 리뷰어님 😄 Step1 인수 테스트 기반 리팩터링 PR 리뷰 요청 드립니다. 잘 부탁드립니다 :)

github.com

  • @BeforeEach에서 테스트 픽스쳐를 사용하게 되면 테스트 간 결합도가 높아진다.
  • 클래스 외부에 static 팩토리 메소드를 만들어서 사용하자.
  • 테스트 픽스처 올바르게 사용하기

  • Optional은 비싸다. 그리고 컬렉션은 null이 아니라 비어있는 컬렉션을 반환하는 것이 좋을 때가 많다. 따라서 컬렉션은 Optional로 감싸서 반환하지 말고 비어있는 컬렉션을 반환하자.
  • Java Optional 바르게 쓰기

  • 주생성자는 하나 뿐이고, 나머지는 secondary constructor다. secondary constructor는 this(..)를 통해서 주생성자를 호출하는 것이 역할이다. 잘 구성된 클래스는 반드시 하나의 주생성자만 가지고 있어야하고, 모든 secondary constructor 이후에 선언되어야 한다. 그 이유는 코드의 중복을 줄여주기 때문이다.
  • 주생성자, 부생성자

🚀 2단계 - 경로 조회 기능

 

  • 최단 경로 조회 인수 테스트 만들기
  • 최단 경로 조회 기능 구현하기

https://github.com/next-step/atdd-subway-service/pull/765

 

[김대겸] Step2 PR by Gyeom · Pull Request #765 · next-step/atdd-subway-service

안녕하세요 리뷰어님, 2단계 - 경로 조회 기능 PR 입니다. 이번 리뷰도 잘 부탁드립니다 🙏 🙏 🙏

github.com

  • 매직넘버 상수화를 생활화 하자.

🚀 3단계 - 인증을 통한 기능 구현

 

  • 토큰 발급 기능 (로그인) 인수 테스트 만들기
  • 인증 - 내 정보 조회 기능 완성하기
  • 인증 - 즐겨 찾기 기능 완성하기

https://github.com/next-step/atdd-subway-service/pull/803

 

[김대겸] Step3 PR by Gyeom · Pull Request #803 · next-step/atdd-subway-service

안녕하세요 리뷰어님, 3단계 - 인증을 통한 기능 구현 PR 입니다. 이번 리뷰도 잘 부탁드립니다 :)

github.com


🚀 4단계 - 요금 조회

  • 경로 조회 시 거리 기준 요금 정보 포함하기
  • 노선별 추가 요금 정책 추가
  • 연령별 할인 정책 추가

  • age를 0으로 관리하다보면 나중에 side effect가 존재할 것 같아서 null은 null로 관리하는게 맞다고 판단했다. 물론 정답은 없겠지만, Enum을 통해 default 값을 관리하면 보다 명확하고 이해하기 쉬워서 유지보수에 용이할 것 같다. 
  • 리뷰어님이 말씀해주신 것처럼 null 체크를 계속해야 하는 이슈도 해결된다.

  • LoginMember를 상속받아서 GuestMember 클래스를 따로 관리하면 보다 명확해진다.
  • 뿐 만 아니라, GUEST는 어차피 동일한 값을 유지하기 때문에 static final로 관리하는 것은 좋은 인사이트다.

미션 회고

이번 미션의 주제는 'ATDD & 단위테스트' 였지만 테스트 픽스처, Optional, 주생성자&부생성자, Enum Default값 활용 등 코드를 관리하는데 용이한 TIP들을 많이 공유받을 수 있었다. ATDD는 3주차 때도 진행해서 그런지 이번 미션에서는 보다 수월하게 진행할 수 있었다.