첫날에는 과제의 요구사항이 얼마나 어려운지 먼저 파악했습니다.
여러 입력을 받고 계산한 후 출력하는 시나리오는 동일했습니다.
추가번호라는 하나의 예외적인 번호가 있는데 해당 번호와 당첨 조건에 대한 로직 작성에 심여를 기울여야 겠다라는 생각을 했습니다.
또한 이번 주차에 받은 중요한 목표가 단위 테스트 작성 입니다.
도메인 객체를 만들 때 validate
하나당 하나의 테스트를 꼭 만들어 사용자의 여러가지 입력에 대한 오류를 잘 잡는지 모든 케이스를 대입하여 만들 예정입니다.
다른 우테코 회고 글들을 보면 중간 쯤에 힘들어 진다고 하였는데 딱 지금인 것 같았습니다.
2주차의 최종 목표가 코드 리뷰를 서로 해보자 였고 이를 위해서 README
도 굉장히 열심히 작성하였다 생각했습니다.
하지만 코드리뷰를 전혀 하지 못하였고 이로 인해 약간의 회의감이 들며 3주차에 이틀 동안은 잠시 쉬었던 것 같습니다.
이틀 동안 충분히 쉬어 완벽하게 다시 충전하였습니다.
더욱 열심히 하겠다라는 마음으로 시작을 해보았습니다.
Markdown
의 체크 기능을 사용하여 하나의 기능이 구현될 때 마다 체크를 하고 이후에 어떤 기능을 만들어야 할지 바로 인지할 수 있도록 하였습니다.
기본적으로 사용할 클래스들을 모두 구현하고 제공된 Lotto
domain class
의 위치를 MVC패턴
을 적용하며 만든 폴더 내부로 이동하였습니다.
오늘은 앞으로 만들어질 모든 domain
클래스의 단위 테스트를 만들기 위해 사용자의 입력을 받아 만들어지는 두 가지 클래스 BuyPrice
와 Lotto
에 대한 단위 테스트를 만들어 보는 것에 집중하였습니다.
JUnit 5
에 대한 기본 작성 방법을 공부할 수 있었습니다.
이렇게 사용자의 입력으로 만들어지는 도메인 객체들의 validate
코드를 모두 작성한 후 단위 테스트 작성까지 완료하였습니다.
오늘부터 제출이 시작되지만 아직 완성도는 한참 떨어지기에 발등에 불이 붙었습니다.
오전부터 자기전까지 하루만에 41
개의 Commit
을 생성하는 벼락치기를 하게 되었습니다.
우테코 5기에서는 java 11
버전을 사용하여 record
를 사용할 수 없었습니다.
6기 부터는 java 17
버전을 사용하기 때문에 class
대신 record
를 사용할 수 있었고, 이것 또한 2주차 코드 리뷰 때 다른사람들의 코드를 리뷰하며 공부할 수 있었습니다.
readonly
느낌으로 사용할 수 있는 record
는 class
대신 doamin
객체의 불변성을 더욱 보장해주며 생성자나 Getter
를 따로 만들 필요도 없어서 편리했습니다.
하지만 실제 비지니스 로직에서 외부에서 해당 객체의 필드를 Getter
로 접근하는 것을 제한하려면 class
를 다시 사용해야 한다는 것도 인지하였습니다.
Record
하나가 만들어질 때 마다 모든 validation
마다와 기능 하나 마다의 단위 테스트를 만들며 제작하니 제가 만든 객체에 대한 신뢰도가 더욱 상승하였고 런타임 테스트에서의 큰 오류없이 잘 동작할 수 있었습니다.
또한 런타임에서 문제가 발생하였을 때 테스트를 간단하게 복사 후 여러 값을 대입하며 편하게 문제 해결을 할 수 있었습니다.
이번 주차부터 달리진 것 중 하나가 사용자가 잘못된 정보를 입력할 경우 프로그램 종료가 아닌 오류메세지를 출력한 후 다시 입력을 받도록 하는 것이었습니다.
이를 하기 위해 Controller
에서 try ~ catch
문으로 처리하려했고 단순히 run()
함수 내부에서 전부 처리하니 코딩 컨벤션의 한 함수가 15
줄이 넘지 않도록 하는 규칙을 지키지 못하였습니다.
반복되는 부분을 함수로 뺄 수 있지 않을까 고민을 하였고 아래와 같이 학창시절의 어렴풋한 기억속에 있는 제네릭을 활용한 requestUntilValidated(...)
함수를 만들어 사용할 수 있었습니다.
오늘 아침부터 자기 전까지 코딩을 하니 매우 많은 것을 할 수 있었고, 미리 작성해 놓은 구현할 기능 목록 덕분에 빠르게 다음 구현해야할 사항을 파악할 수 있었고 끊기지 않는 개발을 할 수 있었습니다.
또한 제네릭 함수를 거의 이론만 알다시피 하고 있었는데 직접 제작하여 사용하는 것으로 뿌듯함 또한 느낄 수 있었습니다.
제출 가능 기간이 시작되었지만 제출을 하지 못한 것으로 인해 마음이 살짝 조급한 것 같지만 내일 당첨 결과 로직만 구성하면 끝나기 때문에 푹 잘 수 있을 것 같습니다.
Rank
record
의 인자로 결과를 검증하는 TriFunction
함수형 인터페이스를 사용하였습니다.
이 record
는 RankMachine
이라는 controller
에서 당첨 결과를 계산할 때 사용되며 메인 컨트롤러인 SlotMachine
에서 Rank
리스트를 생성하고 이를 바탕으로 RankMachine
에 대입하여 사용 하도록 구성하였습니다.
이로 인해 추후 당첨 로직이 변경되면 RankMachine
에서만 수정하여 변경이 유연합니다.
공통 피드백에서 document
는 프로그램이 어떤 프로그램인지 알려주는 것이라며 사용자에게 매우 중요한 정보들을 담고 있다고 하였고 사용자 입력에서 제 프로그램을 사용 또는 보기 위하여 어떤 것이 더 필요할까 생각하다가 실행 예시와 동작 과정을 떠올렸으며 실행 결과 코드를 복사하여 사용 후 동작 과정 다이어그램을 draw.io
에서 작성하였습니다.
이전 주차와 비교가 안될 정도로 테스트에 진심이였던 것 같습니다.
기능 또는 검증 하나 마다의 단위 테스트를 만들어 모든 domain
이 적상 작동하는지 육안으로 쉽게 확인할 수 있었습니다.
드디어 처음으로 제 Pull Request
에 4명의 코드리뷰어가 생겼습니다.
README
를 정말 심여를 기울여 작성하기도 하였으며 Discord
에서 리뷰 요청 게시글을 작성하는 것이 아니라 다른 요청에 리뷰를 해드리면서 제 것 요청도 같이 하였습니다.
확실히 다른 사람의 코드를 보는 것이 정말 쉽지 않았던 것 같습니다.
협업의 기본이 타인의 코드를 제 코드와 잘 녹여 사용하는 것일 텐데 타인의 코드 읽는 것 부터 굉장히 힘들었고 대학생 시절 기피하던 것을 여기서는 제대로 해보기 위해 제출 이후 대부분의 시간은 타인의 코드를 해석하는 것에 쏟았습니다.
또한 제가 가진 지식을 알려주는 것에 오랜 기간 재미를 느끼며 지내왔는데 코드 리뷰 덕분에 제 지식을 쉽게 알려줄 수 있고 코드 작성자 또한 자신이 작성한 코드의 어느 부분을 세세하게 지적받으면 훨씬 빠르고 정확하게 학습할 수 있으니 작성자는 학습해서 기분 좋고 리뷰어는 감사 인사를 받아 기분이 좋아 서로 윈윈 인 것 같습니다.
코드 리뷰를 하다보면 이렇게 작성할 수도 있겠구나 라고 생각한 적이 많은데 이를 통해 계속해서 학습할 수 있었습니다.
같은 주제로 다른 코드를 작성하면 좀 더 유연하고 좋은 코드를 작성하는 쪽이 반드시 생기게 되고 이번 과제 또한 Enum
을 굉장히 잘 쓰신분의 코드를 보며 또 한번 성장할 수 있었습니다.
저는 함수형 인터페이스를 사용해 domain
1개, controller
1개를 생성하여 당첨 결과를 계산한 반면 좀 더 변경에 용의하며 상수의 느낌을 주는 Enum
1개 만 사용하여 당첨 결과를 계산할 수 있도록 설계한 다른 사람의 코드가 굉장히 놀라왔습니다.
Enum
의 능력에 대해 더 정확히 알 수 있었고 앞으로 로직을 구성할 때 변경에 더욱 용의할 수 있도록 적극적으로 Enum
을 심화하여 활용할 것 같습니다.
이번 3주차는 이틀을 쉬며 기력을 충전하였고 이로 인해 마감일에 제출하는 점이 조금 아쉬웠지만 그만큼 더 많은 것을 녹여낼 수 있었고 정말 진심으로 많은 시간을 쏟아부었던 것 같습니다.
정말 많은 노력을 쏟아 부었는데 코드 리뷰에서 그것을 알아보시고 칭찬해주시기도 하여 뿌듯함이 굉장히 컸습니다.
총 74
개의 Commit
으로 이번 주차를 마쳤고 매주 커밋 갯수가 증가하고 있습니다.
열정이 무르익은 지금 이 순간 저는 마지막 주차에 일주일이란 시간 모두를 쏟아부어 최선을 다해 임할 것 같습니다.