우아한 테크 코스 Pro, 1주차 과제 - 로또 TDD
TDD란?
- TDD: TFD(Test First Development) + 리팩토링
- 프로그래밍 의사 결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술
( 테스트 기술이 아니다. 설계 기술이며, 분석 기술이다. )
도입 배경
- 디버깅 시간을 줄여준다.
- 동작하는 문서 역할을 한다.
- 리팩토링에 대한 두려움을 없애준다.
( 개인적으로 가장 큰 장점이 아닐까 싶음.. )
구현 싸이클
- 실패하는 테스트를 먼저 구현한다.
- 실패하는 단위 테스트를 작성할 때까지 프로덕션 코드(production code)를 작성하지 않는다.
- 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 테스트가 성공하도록 프로덕션 코드를 작성한다.
- 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
- 테스트 코드와 프로덕션 코드를 리팩토링한다.
미션 진행 회고
- 가장 중요한 건 테스트가 쉬운 코드가 작성되는게 아닐까 싶다.
- Service Layer에 있는 기존의 로직들은 테스트하기 어렵다.
( 비즈니스 로직과 각종 인프라 스트럭처 로직등이 뒤섞여 있음 ) - 따라서 비즈니스 로직이 Domain에 위치하는 것이 좋다.
- Service Layer에 있는 기존의 로직들은 테스트하기 어렵다.
- 테스트 불가능한 영역과 가능한 영역 파악
- Random, shuffle, 날짜, 콘솔 입력 등은 테스트 불가능한 영역
( 비즈니스 로직에서 분리가 되어야한다. )
- Random, shuffle, 날짜, 콘솔 입력 등은 테스트 불가능한 영역
- 원시값(primitive)과 컬렉션(일급 컬렉션) Wrapping 하자!!
- 불필요하게 오픈되는 메서드를 방지할 수 있으며, Wrapping된 클래스 내부에 응집도가 높은 비즈니스 로직을 넣을 수 있다.
- 일급 컬렉션을 사용하는 이유
- 일급 컬렉션 소개와 써야할 이유
피드백
- 동료 개발자들과 컨벤션을 맞춰 가독성 및 코드 이해도를 높이자
https://naver.github.io/hackday-conventions-java/ - NPE를 유발하는 코드를 지양하자.
- NULL을 바로 리턴 ( Default value 혹은 Optional을 활용하자 )
- 매직 넘버, 매직 스트링을 그 자체로 쓰는 것은 의미를 알아보기 힘들다.
- 상수화(final static), Enum을 통한 의미 부여를 하자
( 1을 그대로 쓰기보다, MIN이라는 네이밍을 주는 것 자체로 명확해진다. )
- 상수화(final static), Enum을 통한 의미 부여를 하자