우아한테크캠프 Pro 5주차 ATDD & 단위테스트 미션을 진행한 내용과 후기를 정리해보았습니다.
미션 저장소
https://github.com/Gyeom/atdd-subway-service
학습 내용
- ATDD를 기반으로 지하철 노선도 서비스를 단계별 구현한다.
단계별 요구사항 및 PR 리뷰
🚀 1단계 - 인수 테스트 기반 리팩터링
- LineService의 비즈니스 로직을 도메인으로 옮기기
- 한번에 많은 부분을 고치려 하지 말고 나눠서 부분부분 리팩터링하기
- 전체 기능은 인수 테스트로 보호한 뒤 세부 기능을 TDD로 리팩터링하기
https://github.com/next-step/atdd-subway-service/pull/756
- @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
- 매직넘버 상수화를 생활화 하자.
🚀 3단계 - 인증을 통한 기능 구현
- 토큰 발급 기능 (로그인) 인수 테스트 만들기
- 인증 - 내 정보 조회 기능 완성하기
- 인증 - 즐겨 찾기 기능 완성하기
https://github.com/next-step/atdd-subway-service/pull/803
🚀 4단계 - 요금 조회
- 경로 조회 시 거리 기준 요금 정보 포함하기
- 노선별 추가 요금 정책 추가
- 연령별 할인 정책 추가
- age를 0으로 관리하다보면 나중에 side effect가 존재할 것 같아서 null은 null로 관리하는게 맞다고 판단했다. 물론 정답은 없겠지만, Enum을 통해 default 값을 관리하면 보다 명확하고 이해하기 쉬워서 유지보수에 용이할 것 같다.
- 리뷰어님이 말씀해주신 것처럼 null 체크를 계속해야 하는 이슈도 해결된다.
- LoginMember를 상속받아서 GuestMember 클래스를 따로 관리하면 보다 명확해진다.
- 뿐 만 아니라, GUEST는 어차피 동일한 값을 유지하기 때문에 static final로 관리하는 것은 좋은 인사이트다.
미션 회고
이번 미션의 주제는 'ATDD & 단위테스트' 였지만 테스트 픽스처, Optional, 주생성자&부생성자, Enum Default값 활용 등 코드를 관리하는데 용이한 TIP들을 많이 공유받을 수 있었다. ATDD는 3주차 때도 진행해서 그런지 이번 미션에서는 보다 수월하게 진행할 수 있었다.
'우아한테크캠프 PRO > 우아한테크캠프 회고록' 카테고리의 다른 글
[우아한테크캠프 Pro] 7주차 미션 후기 (레거시 코드 리팩터링) (0) | 2023.01.02 |
---|---|
[우아한테크캠프 Pro] 6주차 미션 후기 (서비스 진단하기) (0) | 2023.01.02 |
[우아한테크캠프 Pro] 3주차 미션 후기 (Subway - ATDD) (0) | 2023.01.01 |
[우아한테크캠프 Pro] 4주차 미션 후기 (그럴듯한 서비스 만들기 - AWS) (0) | 2023.01.01 |
[우아한테크캠프 Pro] 2주차 미션 후기 (QnA - JPA) (0) | 2022.12.31 |