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

[우아한테크캠프 Pro] 3주차 미션 후기 (Subway - ATDD)

PI.314 2023. 1. 1. 23:05

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

 

미션 저장소

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

 

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

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

github.com

학습 내용

  • 미션 수행 방법 문서를 참고하여 실습 환경을 구축한다.
  • 지하철 노선도를 관리할 수 있는 어드민 서비스를 단계별로 구현하세요.
  • 인수 테스트 주도 개발 프로세스를 단계별로 경험하세요.

단계별 요구사항 및 PR 리뷰

1단계 - 지하철역 인수 테스트 작성

  • 지하철역 관련 인수 테스트를 완성하세요.
    • 지하철역 목록 조회 인수 테스트 작성하기
    • 지하철역 삭제 인수 테스트 작성하기

https://github.com/next-step/atdd-subway-admin/pull/837

 

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

안녕하세요 리뷰어님, 1단계 지하철역의 인수 테스트 작성 PR입니다. 잘 부탁드립니다 :)

github.com

  • 리뷰어님께서 인수테스트의 동작들을 분리해보는 것을 제안해주셨고 샘플 예제까지 링크를 공유해주셨다.
    @DisplayName("지하철 노선 생성하면 응답상태 201을 반환한다.")
    @Test
    void createLine() {
        // given
        StationResponse 종각역 = 등록된_지하철역("종각역").as(StationResponse.class);
        StationResponse 역삼역 = 등록된_지하철역("역삼역").as(StationResponse.class);

        // when
        ExtractableResponse<Response> response =
                지하철노선_생성_요청("1호선", "indigo darken-2", 종각역.getId(), 역삼역.getId(), 10);

        // then
        지하철노선_생성_응답상태_201_검증(response);
    }
  • 피드백을 수용하여 위 코드와 같이 Given - When - Then 의 각 구문을 함수로 리팩토링했더니 코드가 깔끔해졌고, 테스트코드로 API 문서를 대체할 수 있다는게 어떤 느낌인지 알 수 있었다.

2단계 - 지하철 노선 기능

  • 기능 구현 전에 인수 조건을 만족하는지 검증하는 인수 테스트를 먼저 만들고 기능구현을 해보세요.
    • 지하철 노선 생성
    • 지하철 노선 목록 조회
    • 지하철 노선 조회
    • 지하철 노선 수정
    • 지하철 노선 삭제

https://github.com/next-step/atdd-subway-admin/pull/854

 

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

안녕하세요 리뷰어님, 2단계 - 지하철 노선 기능 PR 입니다. 이번에도 잘 부탁드립니다 :)

github.com

  • 각 테스트 간에 격리를 위해 DatabaseCleanup 클래스를 활용했다.

  • 평소에도 많이 고민을 했던 부분이지만 의존성 방향에 대해서는 생각하지 못했던 것 같다. 이 부분에 대해 짚어주셔서 관련 Case에 대한 컨벤션을 어떻게 잡아갈 지 방향성이 확고해졌다.

  • 더티 체킹이 일어나면서 데이트 업데이트가 이뤄지지만 save 코드를 작성함으로써 명확하고 읽기 쉬운코드를 작성할 수 있다고 생각했는데, 불필요한 로직이 수행 될 수 있는 지에 대해 파악이 필요할 것 같다.

3단계 - 구간 추가 기능

  • 기능 구현 전에 인수 조건을 만족하는지 검증하는 인수 테스트를 먼저 만들고 기능구현을 해보세요.
    • 역 사이에 새로운 역을 등록할 경우
    • 새로운 역을 상행 종점으로 등록할 경우
    • 새로운 역을 하행 종점으로 등록할 경우
    • 역 사이에 새로운 역을 등록할 경우 기존 역 사이 길이보다 크거나 같으면 등록을 할 수 없음
    • 상행역과 하행역이 이미 노선에 모두 등록되어 있다면 추가할 수 없음
    • 상행역과 하행역 둘 중 하나도 포함되어있지 않으면 추가할 수 없음

https://github.com/next-step/atdd-subway-admin/pull/881

 

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

안녕하세요 리뷰어님, 3단계 구간 추가 기능 PR 입니다. 이번에도 잘 부탁드립니다 :)

github.com

  • 의존성이 양방향이라면 결국 하나의 서비스라는 것을 의미하기도 한다. 하지만, Line과 Section은 같은 서비스가 아니기 때문에 단방향을 향하도록 변경이 필요하다. 처음에는 의존성 개념에 대해 이해하기 어려웠지만, 미션을 수행하면서 리뷰어님이 지속적으로 피드백을 제공해주고 코드를 작성하면서 비슷한 상황을 반복해서 접하다보니 자연스럽게 이해할 수 있었다.
  • 의존성 방향은 단방향을 향해야 한다.

  • getter 사용을 지양하자. getter를 사용하기 전에 다른 클래스를 통해 책임을 위임할 수는 없을 지에 대해 고민하자.

미션 회고

이번 미션을 진행하면서 인수 테스트 주도 개발 프로세스를 단계별로 경험할 수 있었고, 인수테스트의 동작들을 분리에 대한 좋은 인사이트를 얻을 수 있었다. 특히, 이번 미션을 진행하면서 의존성 개념에 대해 명확하게 이해할 수 있었다. 처음에는 의존성 개념이 어렵게 느껴졌는데, 리뷰어님의 피드백을 시작으로 조영호님의 우아한 객체지향 강의를 통해 의존성의 필요성에 대해 명확하게 이해할 수 있었다.