우테코 3주차 미션은 로또 게임이 주제였다.
코로나에 걸려서 2주차 미션을 아쉽게 마무리하고 3주차때도 컨디션이 좋지 않아서 걱정했는데 그래도 시간이 지나면서 조금씩 괜찮아지는 것 같았고 미션 진행에 대한 만족도도 저번보다 높게 마무리 지을 수 있었다.
3주차의 주요 목표는 클래스를 분리하는 연습과 도메인 단위 테스트를 작성하는 것이었고 로또 게임은 금액을 입력하면 랜덤 번호가 생성이 되고 당첨 번호를 직접 입력해서 당첨 결과와 수익률을 보여주면 된다.
기능 목록도 몇번 작성해보면서 점점 감이 잡히는데 저번 주차 피드백을 보고 이번에는 체크 박스를 써서 체크를 해가면서 하나씩 차근차근 구현을 해나갔다. 체크 박스가 별거 아닌거 같았는데 진행 상황도 눈에 확 들어오고 개인적으로 효과가 좋았다.
이전에는 기능 목록을 작성하는 과정을 생략해왔는데 프로젝트를 할때 이렇게 기능 목록을 만들고 하나씩 해나가면서 진행했다면 벅차다고 느꼈던 부분들도 잘 해결하지 않았을까 하는 아쉬움도 들었다. 다음 프로젝트를 한다면 이렇게 기능 목록을 정리하고 작게 쪼개서 풀어나가는 식으로 진행을 해봐야겠다.
먼저 로또 번호를 LottoNumber 클래스로 만들어서 로또 번호 자체적으로 생성을 할 때 검증을 하도록 하였다. 이렇게 함으로서 로또 번호를 안심하고 사용할 수 있는 이점이 있지만 번호 하나 하나를 클래스로 생성하니 무겁다는 느낌도 받았고 불편한 부분도 있었다. 이번에는 연습을 하면서 클래스를 최대한 분리해보려고 노력하였다.
로또 클래스는 LottoNumber의 리스트를 가진 일급 컬렉션으로 생성을 할 때 로또에 대한 유효성 검증을 하는데 다시 보니 검증에 대한 처리밖에 없어서 다음에는 일급 컬렉션에 행위를 추가해보면 좋을 것 같다. 원래는 파싱하는 로직도 들어가 있었는데 값을 파싱하는 건 Lotto클래스의 역할이 아닌 것 같아서 분리를 해버렸다.
테스트 코드는 @ParameterizedTest를 사용해서 중복을 제거하고 효율적으로 작성하려고 노력을 했다. 이전에 ValueSource로 간단한 입력값을 테스트한 적은 있었는데 이번에는 MethodSource를 사용해서 더 복잡한 입력값도 간단하게 반복 테스트 해볼 수가 있었고 개인적으로 너무 만족스러웠다. (이렇게 테스트 하는게 맞는지는 아직 잘 모르겠다)
이번 미션에서는 도메인 클래스로 분리를 많이 해보고 테스트 코드를 작성을 열심히 해봤는데 회고를 쓰면서 다시 코드를 쭉 보니 메서드 분리나 네이밍 처리에서 아쉬운 점들이 많이 보였다. 다음 미션에는 메서드 분리와 네이밍 처리에도 신경을 써보고 일급 컬렉션의 이점도 더 활용해봐야겠다.