TDD, Clean Code with Java 14기 4, 5주차 회고 [2022. 04. 26 ~ 2022. 05. 09]
4주 차를 스킵해버려서.. 4, 5주 차 회고를 한 번에 작성하도록 하겠습니다. 4, 5주 차에는 사다리 타기 미션 하나만을 완전히 클리어하는데 목표를 삼았습니다. 미션을 하면서 정말 많은 피드백을 주셨고, 그 과정에서 많이 성장한 것을 느꼈습니다. step 1은 자바 8 스트림, 람다, Optional 관련 미션, step 2, 3, 4는 사다리 타기 미션을 진행하였고 피드백받은 내용과 미션을 수행하면서 했던 내용은 다음과 같습니다.
먼저 미션을 하면서 공통적으로 신경 썼던 부분은 다음과 같습니다.
- 원시 값, 문자열 분리 및 포장
- 메서드 분리 및 클래스 분리
- getter의 사용 대신 클래스에 메시지를 보내자
- 자바 8의 스트림, 람다를 사용해보자
- 모든 엔티티를 작게 유지하자 (인스턴스 변수의 개수를 줄이고, 메서드의 인자를 줄이려는 노력을 해보자)
[4, 5주 차에 한 일]
1. step 1
- @FuntinoalInterface 애노테이션 사용
- stream의 findFirst와 findAny의 차이점
- ofNullable 자체가 null에 대한 안정성을 보장한다
자바 8의 핵심 기능인 스트림, 람다, Optional의 기본 사용법을 배웠습니다. 그 과정에서 위와 같은 피드백을 받았고, 아무래도 이번 강의의 핵심은 TDD, Clean Code이기 때문에 자바 8의 핵심 기능은 "모던 자바 인 액션" 책을 통해서 더 공부하도록 하겠습니다.
2. step 2
- 정적 팩토리 메서드 방식의 장단점 파악
- 외부에 영향이 없는 불변 객체로 설계하는 습관을 기르자
- new ArrayList<>()를 사용한 방어적 복사와 Collections.unmodifiableList를 사용한 방어적 복사, 이 두 개의 차이
- "-1"과 같이 코드 내에 존재하는 값도 의미 있는 상수로 빼내 보자
- 무의식적으로 사용하던 int i 대신에 좀 더 이름이 명확한 변수 명을 사용하자
- 어떤 값이 잘못되었는지(ex. 사용자가 입력한 값) 예외 메시지에 함께 넘겨주면 원인을 파악하기 더 쉬움
step 2를 진행하면서 꽤 많은 시간이 소요됐습니다. 아마 4주 차는 step 1, 2를 하는데 많은 시간을 쏟았습니다. 사다리 타기를 어떻게 구현해야 할지, 객체를 어떻게 설계하고, 역할과 책임을 어떻게 분리할지 고민을 많이 했습니다. 그리고 이 미션은 특히나 리뷰어님께 많은 리뷰와 피드백을 요청드렸고 리뷰어님께서 세심하고 좋은 리뷰를 정말 많이 해주셨습니다. 이 강의에서 리뷰해주시는 리뷰어님들 모두 세심하고 정성 있는 피드백을 정말 많이 해주셨습니다. 정말 감사했습니다.
3. step 3
- String[] 보다는 List를 적극적으로 사용하자
- 팩토리 메서드 네이밍 컨벤션 만들기
- IntStream.rangeClosed, IntStream.range를 사용해보자
=> .rangeClosed(int startInclusive, int endInclusive)는 두 번째 매개 변수의 값을 포함해서 loop를 돕니다
=> .range(int startInclusive, int endExclusive)는 두 번째 매개 변수의 값을 포함하지 않고 loop를 돕니다
- stream을 이용한 클래스 생성과 동시에 List 형태로의 초기화
4. step 4
- Boxing, auto boxing, auto unboxing에 대해서 다시 한번 복기
- 나만의 클래스 메서드 오더링 컨벤션
- 유틸성 클래스의 경우, 외부에서 직접 인스턴스를 생성하지 못하도록 (private 생성자 사용!)
- Map을 출력할 때 forEach를 사용하면 더 가독성이 좋아진다!
- 검증 항목이 여러 개 일 경우 assertAll을 사용해보자
- JUnit에서 isZero(), isOne() 메서드가 존재한다
- Factory 클래스를 도입하여 객체 생성을 담당하는 역할을 Factory 클래스에게 위임해줬다.
step 4의 경우는 이전에 작성했던 step 2, 3을 힌트를 참고하고, 이미 기존에 짜인 코드를 참고하여 처음부터 다시 작성하는 것이 목표였습니다. 그 과정에서 다시 작성할 때 TDD 방식으로 작성하는 것을 최우선으로 하였고 확실히 미션을 진행하면서 피드백받은 내용을 반영하고 작성해보니 처음 작성했던 코드와는 다른 코드가 나왔습니다.
이 강의를 통해서 저 스스로 키울 수 없는 역량을 키우고 있는 거 같아서 정말 뿌듯하고 정말 협업하는 느낌이 생겨서 좋았습니다. 특히나 이전 회사에서 약 5, 6개월을 혼자 코딩하면서 개발이 재미없어지고 있었는데, 이 강의를 들으면서 코드를 작성하고 리뷰어님과 티키타카를 하면서 더 좋은 코드를 만들어 가는 것을 보면서 다시 개발이 재밌어지고 있습니다. ㅎㅎㅎㅎ
강의 종료가 1달 남은 시점인 현재 남은 미션은 1개입니다. 비록 기간이 길긴 하지만 남은 미션은 최종 보스라서 이전과 마찬가지로 열과 성을 다해서 클리어할 수 있도록 노력해보겠습니다