4주 차 미션 : ATDD (인수 테스트 주도 개발)
저장소: github.com/next-step/atdd-subway-admin/tree/jhhj424
ATDD 1차 리뷰: github.com/next-step/atdd-subway-admin/pull/10
ATDD 2차 리뷰: github.com/next-step/atdd-subway-admin/pull/21
ATDD 3차 리뷰: github.com/next-step/atdd-subway-admin/pull/51
ATDD 4차 리뷰: github.com/next-step/atdd-subway-admin/pull/70
후기
- ATDD(인수 테스트)를 통한 TDD의 재미를 알게 되었다😁
- 인수 테스트를 먼저 구현하고, 이후 단위 테스트를 통해 기능을 완성해 가는 과정으로 애플리케이션을 개발할 수 있다.
- 단위 테스트, 통합 테스트, 인수 테스트를 나눌 수 있고, 작성할 수 있다.
- 어떻게 하면 가독성이 좋은(유지보수성이 좋은) 테스트를 작성할 수 있을지에 대한 고민을 하게 되었다.
이번 과정의 목표
- 인수 테스트 학습
- 인수 테스트 도구 학습
- 인수 테스트 기반 기능 구현 경험
내 코드 피드백
Optional의 get 사용은 지양하자 -> 확실한 예외처리를 해주는 편이 좋다.
무작정 구글링 해서 붙여 넣기 했는데.. 반성하자 😅
앞으로는 build.gradle에서 implementation, api 등을 활용하자.
알고 있으면 도움될 내용!
테스트를 위한 공통 메서드에서도 어떤 값을 인자로 받을지 명확하지 않기 때문에, 따로 지정된 객체가 있다면 사용하는 편이 좋을 듯하다.
일급 컬렉션을 사용하여 도메인 로직을 숨길 수 있고, 엔티티 간의 결합도를 낮출 수 있다.
일급 컬렉션을 엔티티에서 사용할 때 JPA의 임베디드 타입을 사용할 수 있겠다.
해당 코드처럼 원시 값 필드를 가지는 경우, 래핑 한 클래스를 사용할 수 있다.
이 코드에서 처럼 int distance를 Distance distance로 사용하게 되면, distance에 대한 예외 처리나, 로직을 전부 Distance 클래스에서 처리할 수 있다.
다른 곳에서 중복적으로 distance에 대한 처리를 하지 않아도 되는 것이다.
위에서 언급된 일급 컬렉션(일급 객체), 래핑 클래스는 적극 활용하는 게 조금 더 객체지향적인 설계를 도와줄 것 같다.
일단 해당 피드백에서 언급된 링크.. blog.kingbbode.com/27
이 부분은 확실하게 알고 넘어가야 하고, 알고 있던 내용이지만 코드를 작성하면서 놓쳤던 부분이다.
이런 실수는 위험할 수 있기 때문에 항상 꼼꼼히 체크해야 할 것 같다.
위의 경우에는 Station 객체를 return 하지 말고 StationResponse 등의 객체를 return 해야 한다.
또 메서드 명명을 실수했다 ㅠ 고민을 항상 하면서 작성해야겠다.
메서드 명명 관련해서는 m.blog.naver.com/reona7140/221306141987 를 참고하면 적어도 실수는 줄일 수 있겠다.
Arrays.asList로 반환을 하고 해당 반환 값에서 add 작업을 진행하는 흐름의 코드를 작성해버렸다 ㅠ
Arrays.asList는 fixed size인걸 알고 있었는데 실수가 있었다. 마찬가지로 좀 더 꼼꼼하게 코드를 작성해야 한다.
해당 부분은 알고 있는 내용이지만 Test Code를 통해 다시 한번 확실하게 확인할 수 있었다.
친절한 예외 처리를 하자👊 ( 꼼꼼하게 확인!! )
도메인이 복잡해지고 코드들이 많아지면서 가독성을 떨어뜨리는 코드들이 많이 생겨나고 있었다.
해당 부분은 따로 의미를 가지는 메서드로 분리를 진행할 수 있었다.
인수 테스트를 작성하고 코드를 작성하였지만, 도메인의 복잡한 비즈니스 로직에 대한 테스트는 따로 단위 테스트로 분리하여 진행하는 게 좀 더 확실하고 세이프티 한 코드를 작성하는데 도움이 되겠다.
앞에서 분기 처리를 하지 않고 각각의 메서드에서 검증하도록 진행했었던 부분이다.
리팩터링을 진행하면서 각각의 조건에 대해 명시하고 해당 조건을 만족하는 경우에만 각각의 메서드로 진입할 수 있도록 변경했다.
입이 마르도록 얘기했다. 네이밍 규칙, 의미 있는 네이밍!
확실하게 하자👊 ( 나 자신에게.. )
마지막 피드백으로, 조금 더 고민을 할 수 있는 코드에 대한 내용이었다.
이렇게 이번 ATDD 미션을 마무리했다.
끝으로...
사실 이번 ATDD 미션이 지금까지 미션 중에 제일 힘들고 어려웠다고 생각한다.
아직도 많이 공부해야 할 JPA, TDD 그리고 새로운 개념인 ATDD(인수 테스트 주도 개발) 등등.. 여러 가지의 내용들이 복합적으로 나오면서 헷갈리고 혼란이 되는 부분이 많았다.
하지만 더욱 많은 걸 배울 수 있었고, 제일 열심히 했던 미션이 아닌가 싶다.
미션을 진행하면서 모르는 부분들이 많았기에 JPA에 대해서는 인프런에서 김영한 님 강의를 일주일 내내 달고 살면서 학습을 진행할 수 있었고, 여러 가지 궁금 사항에 대해서는 같이 우테캠pro 과정을 진행하시는 분들, 리뷰어분들의 도움을 많이 받았다.
그럼에도 이번 미션을 진행하면서 정말 좋았다고 생각했던 건, 인수 테스트를 작성함으로써 얻게 된 코드 작성의 즐거움이다.
이전엔 인수 테스트 자체를 아예 몰랐었는데, 배우고 직접 작성해보고 인수 테스트를 기반으로 기능 개발, 리팩터링을 진행하다 보니 인수 테스트를 작성하지 않고 단위별로 기능을 개발해나가던 때보다 비즈니스 로직을 이해하는데 도움이 많이 되고, 그러다 보니 흐름에 따라 코드를 작성하는데 재미가 있다는 걸 알게 되었다.
이번 미션 덕분에 많은 걸 배울 수 있었고, 개발에 대한 마음가짐이나 테스트 코드의 중요성을 인지하고 적용해 나가는 데에 있어서 어떻게 보면 나의 개발 인생에서의 조금의 전환점이 되지 않았을까? 하는 가르침이 많은 미션이었다고 생각한다😁😁😁
2020년이 지나고, 2021년 새해가 밝았는데 이런 좋은 교육과 함께 할 수 있어서 좋은 것 같다.
올해 나는 얼마큼의 성장을 이룰 수 있을지 기대가 되고,
지금 생각하는 내 기대보다 더 많은 성장을 이룬다면 좋겠다😊
2021. 01. 04
댓글