우아한테크캠프 Pro 1주차 TDD
미션을 진행한 내용과 후기를 정리해본다.
이번 미션의 목표
- TDD 기반으로 프로그래밍하는 경험
- 메서드 분리 + 클래스를 분리하는 리팩터링 경험
- 점진적으로 리팩터링 하는 경험
경험할 객체지향 생활 체조 원칙
- 규칙 1: 한 메서드에 오직 한 단계의 들여 쓰기만 한다.
- 규칙 2: else 예약어를 쓰지 않는다.
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 5: 줄여쓰지 않는다. (축약 금지)
- 규칙 8: 일급 콜렉션을 쓴다.
저장소 및 PR
- 저장소: https://github.com/jsyang-dev/java-lotto-pro
- 1단계 PR: https://github.com/next-step/java-lotto-pro/pull/17
- 2단계 PR: https://github.com/next-step/java-lotto-pro/pull/71
- 3단계 PR: https://github.com/next-step/java-lotto-pro/pull/147
- 4단계 PR: https://github.com/next-step/java-lotto-pro/pull/172
- 5단계 PR: https://github.com/next-step/java-lotto-pro/pull/212
내 코드 피드백
프리코스 미션에서 @ParameterizedTest
@CsvSource
를 많이 활용하였는데, 파라미터를 바꿔가면서 반복적인 테스트가 필요한 경우 유용했다. name 속성을 추가하여 테스트 결과를 좀 더 가독성 있게 표시할 수 있었다.
참고: https://www.baeldung.com/parameterized-tests-junit-5
한 개의 클래스가 무려 3가지의 책임을 갖고 있었다. 나름 리팩터링을 한다고 메서드로 분리하였지만, 책임이 여러 개 일 경우에는 클래스를 분리해야 된다는 것을 간과했다.
미션을 수행하기 전에 to-do 리스트를 만들고 정리된 요구 사항에 맞춰서 테스트를 작성해 나가면 좋을 것 같다.
좀 더 구체적인 예외를 사용해야 예외의 의미가 잘 전달될 수 있을 것 같다.
static 메서드만 있는 클래스의 경우 private 생성자를 만들어서 인스턴스화를 막자!
참고: https://github.com/jsyang-dev/TIL/blob/master/Java/EffectiveJava/item_04.md
GitHub - jsyang-dev/TIL: Today I Learned
Today I Learned. Contribute to jsyang-dev/TIL development by creating an account on GitHub.
github.com
다른 매직넘버들은 상수로 추출을 했는데, 이 부분은 매직넘버라고 생각하지 못했던 것 같다.
정적 팩터리 메서드를 사용하게 되면 여러 가지 이점을 얻을 수 있다.
참고: https://github.com/jsyang-dev/TIL/blob/master/Java/EffectiveJava/item_01.md
GitHub - jsyang-dev/TIL: Today I Learned
Today I Learned. Contribute to jsyang-dev/TIL development by creating an account on GitHub.
github.com
enum에 타입을 추가하여 매칭이 안 되는 결과들을 처리항 수 있었는데, 고민이 부족했던 것 같다.
참고: http://amazingguni.github.io/blog/2016/05/Clean-Code-7-오류-처리
클린코드 7장 - 오류 처리
CleanCode 7장 오류 처리 에 대해 정리한 포스트입니다. Overview 상당수 코드 기반은 전적으로 오류 처리 코드에 좌우되기 때문에 깨끗한 코드와 연관성이 있습니다. 여기저기 흩어진 오류 처리 코드
amazingguni.github.io
테스트가 구현되어 있는 클래스가 분리가 될 경우 분리된 클래스에 대한 테스트 구현을 고려해보자. 더 작아진 클래스이기에 테스트 구현이 더 쉬워질 수 있는 것 같다.
불변 컬렉션을 만들기 위해서 Collections.unmodifiableList()
을 사용할 수 있다는 것을 배웠다.
Domain 영역에 View 로직이 섞이는 참사가 발생하였다. Dto를 생각하고 Prints라는 클래스를 만들었는데, Prints에 값을 넣는 로직이 Domain 클래스에 위치하다 보니 명확한 분리가 이루어지지 못했다.
당첨 결과도 별도의 책임을 갖는 클래스로 분리해 볼 수 있다.
구현에만 집중하다 보니 비효율적인 로직을 만들어내게 되는 것 같다. 시간이 더 걸리더라도 효율적이고 안정적인 코드를 만들도록 해보자.
리뷰어님이 IntStream.range()
Collectors.collectingAndThen()
을 활용하는 좋은 팁을 알려주셨다.
현재 주어진 요구사항에 맞게 구현해야 될 것 같다. 아직 정해지지 않은 요구사항을 예측해서 개발하는 것은 오버엔지니어링이다.
느낀 점
- 클래스의 역할과 책임을 명확히 나누는 것이 쉽지 않았다. (view 로직을 나누는 것도 쉽지 않았다)
- 원시값과 문자열을 포장하는데 어디까지 포장을 해야 될지 고민이 되었다.
- 일급 컬렉션을 만들었을 때 관련 로직들이 모이게 됨으로써 높은 응집도의 클래스가 만들어지는 것을 경험했다.
- 첫 미션이라 중요한 피드백이 많았다. 다음 미션에서는 실수하지 말자!
- 객체 지향 생활 체조와 프로그래밍 요구사항을 지키면서 개발을 하는 것이 쉽지는 않았지만, 미션을 진행하면서 점차 체득이 될 것이라 믿는다.
'우아한테크캠프 Pro' 카테고리의 다른 글
우아한테크캠프 Pro 7주차 미션 후기 (0) | 2021.12.28 |
---|---|
우아한테크캠프 Pro 5주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 4주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 3주차 미션 후기 (0) | 2021.12.26 |
우아한테크캠프 Pro 2주차 미션 후기 (0) | 2021.12.25 |
댓글