본문 바로가기
우아한테크캠프pro

[우아한테크캠프pro] 5주차 미션 : 인수 테스트 기반 TDD 후기, 코드리뷰 (자바 백엔드, NextStep, 우아한형제들, 우테캠pro, 우테캠프로)

by 개발하는 지토 2021. 1. 14.

5주 차 미션 : 인수 테스트 기반 TDD

 

저장소: github.com/next-step/atdd-subway-service/tree/jhhj424

1차 리뷰: github.com/next-step/atdd-subway-service/pull/11

2차 리뷰: github.com/next-step/atdd-subway-service/pull/22

3차 리뷰: github.com/next-step/atdd-subway-service/pull/33

4차 리뷰: github.com/next-step/atdd-subway-service/pull/47

 


후기

  • 인수 테스트 기반의 TDD를 진행하여 TC 기반의 요구사항 기능 구현 및 리팩토링에 익숙해지고 있다.
  • Mock을 사용해서 Stubbing 테스트를 작성할 수 있게 되었다.
  • 토큰 기반 인증 프로세스를 경험할 수 있었다. (Bearer Token을 사용)
  • BDD를 접할 수 있었다. (woogri.tistory.com/entry/BDD-BDD)

이번 과정의 목표

  • 단위 테스트와 도구 학습
  • 인수 테스트 기반의 TDD 경험
  • 인증과 인증 도구 학습

내 코드 피드백

뷰와 도메인을 확실히 분리하자!! (기본)

 

직접 초기화해주는 것은 지양하고, 기본 생성자의 경우는 임베디드 타입으로 선언해줌으로써  처리가 되고, 나머지 생성자에서는 Sections를 할당해주는 방식으로 작성하자.

 

인스턴스 변수에 바로 초기화하면 추가적인 처리가 필요할 경우엔 코드가 복잡해질 수 있으니 생성자에서 유효성검사 및 인스턴스변수 초기화까지 처리해주는 걸 권장한다고 한다.

 

이 부분에 대해선 무조건적으로 사용하라는 건 아니고, 때에 맞춰서 잘 고려해보는 게 좋을 듯하다.

 

이전까지 getter를 오히려 가장 상단에 두었었는데, 생각해보니 getter가 있다면 메서드 중 가장 하단에 위치하는 게 맞는 것 같다고 생각한다. 

 

해당 도메인의 주요 기능을 위로 올려서 잘 파악할 수 있게 하는 편이 좋겠다👌

 

1. getter에 혹시라도 다른 로직이 추가될 경우, if 절에 영향을 미치 수 있으니 의도한 값을 직접 처리하는 편이 좋겠다✔

2. Collections.emptyList()는 처음 알았다. 빈 List 객체를 공유해서 사용하므로 불필요한 객체 생성을 하지 않는다, 적극 활용하자 :)

 

되도록이면 항상 코드 중복을 피하자👊

 

가독성을 고려 한 코드를 작성하자 -> 메서드 분리😉

 

헷갈리게 작성된 코드가 있었다, 협업하는 개발자도 코드를 한눈에 파악할 수 있도록 확실한 의도가 드러나게, 헷갈리지 않게, 메서드 명을 작성하자✔

 

객체 생성을 위한 팩토리 메서드를 제공할 때, 생성자는 외부에서 차단하자✔

 

자체적으로 nullable 하지 않도록 프리미티브 타입을 사용하는 편이 좋겠다😉

 

일급 컬렉션을 적극! 활용하도록👊

일급컬렉션을 사용하게 되면 이후에 추가적인 요구사항들도 일급 컬렉션에서 처리할 수 있고, List를 사용했을 때 발생하는 중복 로직(코드)들을 줄일 수 있다.

 

코드를 더 꼼꼼히 들여다보고, 불필요한 객체 생성을 하지 않도록 체크하자✔

 

무작정 숏 코딩은 지양하고, 읽기 좋은 코드를 항상 고민하자 👌

 

한번 더 언급하는, 일급 컬렉션 사용! 😁

 

위 코드에서는 StationResponse에서 favorite의 source, target station을 찾는 `도메인 로직`이 들어가는데, 확실하게 도메인과 뷰를 분리할 수 있도록 하는 게 좋겠다 😀

 

절대로 null을 리턴하는 코드를 작성하지 말자👊

 

정책을 어디서 관리할지, 어느 클래스에 위임할지 고민을 하는 편이 좋겠다.

 

여기서는 요금계산에 사용되는 정책들이니 요금 관련 도메인에서 처리하도록 했고,

정책들은 각각의 enum으로 분리해서 관리할 수 있도록 리팩토링했다. 👍

 


끝으로...

뒤로 갈수록 나날이 어려워지는 미션과, 그에 따른 시간 배분의 어려움이 있었다.

그래도 매번 리뷰를 받을 때마다, 알게 되는 것과 눈이 뜨여지는 피드백들에 재미를 느끼며 진행했던 미션이었다.

 

처음 생각보다 더 어렵게 느껴졌던 요구사항들, 아직도 배울게 산더미인 좋은 구조의 객체 설계와 테스트 코드 등.. 여러모로 어려운 게 많은 미션이었지만, 그만큼 많은 걸 학습하고 싶게 만들어줘서 좋았던 것 같다.

 

덕분에 인수 테스트, 통합 테스트, 단위 테스트,, 이런저런 테스트들과 조금씩 더 친해질 수 있었고, TDD 도 거부감 없이 할 수 있게 되었다.

 

이번 미션도 어려운 만큼 정말 많은 가르침과 배움이 있었고, 매일같이 잠을 포기하며 진행했던 미션에 힘이 들 때도 있었지만 리뷰 요청을 했을 때 첫 번째 뿌듯함, 그리고 Merge 된 미션을 받았을 때의 두 번째 뿌듯함이 있어서 좋았다 😁

 

다음 미션을 진행할 때는 이번 미션에서 받았던 피드백들을 중심적으로 생각해서 더 좋은 퀄리티의 코드를 작성할 수 있도록 해야겠다 👊


클린 코드, 객체지향에 대한 갈증을 가지고 더욱 정진하여

코드 퀄리티와 생산성을 UP 시켜보자!

 

2021. 01. 14

 

댓글