📌 Intro
우테코 프리코스 3주차가 지나갔다. 그간 프리코스를 진행하면서 항상 시간에 쫓겼었는데 이번에야말로 시간적으로 여유를 두고 진행을 해보자는 생각이었지만 역시나 해야할 일이 많았다..(보고서 작성, 가족 여행, TA채점 등...ㅠㅠ) 그래서인지 이번주는 부족한 점도 굉장히 많았고, 나중에야 알았지만 소감문도 작성하지 못한 상태로 제출되었다. 이게 어떻게 반영될지는 모르겠지만 아직 4주차가 남았고 지나간건 잊고 해야할 일에 집중해보려 한다.
📌 추가된 요구 사항
3주차 미션에서는 2주차에서 학습한 것에 목표 2가지가 추가되었다.
1. 클래스 (객체)를 분리하는 연습
2. 도메인 로직에 대한 단위 테스트를 작성하는 연습
또 추가된 프로그래밍 요구사항을 살펴보면 2주차와는 다르게 더 많아졌고 굉장히 까다로워졌다고 느껴졌다. 추가된 요구 사항은 다음과 같다.
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
- else를 지양한다.
- Enum 클래스를 적용해 프로그래밍을 구현한다.
- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
- 단위 테스트 작성이 익숙하지 않다면 test/kotlin/lotto/LottoTest를 참고하여 학습한 후 테스트를 구현한다.
요구사항을 보고나서 큰일났다는 생각이 들었던 것 같다. 도메인 로직이라는 단어를 처음 들어봤고 Enum class도 수업시간에 잠깐 다뤘던 기억만 있고 어떠한 것인지 정확히 몰랐기 때문이다. 게다가 시간도 충분하지 않았고. (아무래도 시간이 여유롭지 않았던 것이 가장 큰 문제이지 않았을까)
그래도 일단 README를 나름 열심히 작성해봤고, 구현해야 하는 기능들을 목록화했다. 그리고 2주차에 진행했던 코드 피어리뷰를 진행하면서 눈여겨봤던 READMD 내용이 있었는데 구현을 마치고 최종적으로 확인해야 하는 것들이 많기 때문에 이를 위한 체크리스트를 만들고 하나씩 확인하면서 진행한 부분이다. 그래서 해당 부분을 참고해서 체크리스트를 작성했고, 발생할 수 있는 예외사항도 함께 정리했다.
3주차 목표가 클래스를 분리하는 연습이었기 때문에 README에서 클래스를 구분하고 각 클래스에서 해야하는 기능추가
📌 구현 내용
아래 링크를 통해 우테코에 제출한 PR을 확인할 수 있다.(혹시라도 궁금하신 분들이 계실까봐..)
[로또] 강석진 미션 제출합니다. by krrong · Pull Request #60 · woowacourse-precourse/kotlin-lotto
github.com
우테코에서 제공해준 프로젝트에는 기본적으로 Lotto라는 클래스가 있고, 이 Lotto 클래스는 다음과 같은 제약사항을 가진다. 제공된 Lotto 클래스를 활용해 구현해야 한다.
- Lotto에 매개 변수가 없는 생성자를 추가할 수 없다.
- numbers의 접근 제어자인 private을 변경할 수 없다.
- Lotto에 필드를 추가할 수 없다.
- Lotto의 패키지 변경은 가능하다.
이 글을 쓰는 지금도 계속 드는 생각이지만 너무 생각의 깊이가 얕았던 것 같다.(왜 그랬지?) 아직도 잘 모르겠지만 Lotto 클래스와 더불어 사용자의 입력을 받았을 때 예외를 처리하는 클래스, 요구사항에 명시되어 있는 enum 클래스만 추가하면 되겠다고 생각했다.
1. 예외를 처리하는 클래스
로또 구입 금액, 당첨 번호, 보너스 번호를 입력했을 때 발생할 수 있는 예외를 처리하는 역할을 한다.
2. enum 클래스
1등부터 5등까지의 당첨 금액과 조건을 관리한다.
이외 로또를 발행하는 기능, 수익률을 계산하는 기능, 출력하는 기능을 모두 Application.kt에 몰아 넣었고 지금와서 보면 2주차와 똑같이 진행한 것 처럼 보여서 아쉬운 마음이 든다.
3주차 목표가 클래스를 분리하는 연습이었기 때문에 클래스를 조금 더 세분화하고
함수의 길이를 15라인 이하로 줄일 수 있도록 노력하기
📌 Code Review
사실 2주차 과제를 진행하면서 "생각보다 어렵지는 않네?" 라며 너무 안일하게 생각했고 그로 인해서 3주차의 결과가 좋지 않게 나온 것 같다. 이 생각이 클래스를 나눌때도 작용했고 Exception을 처리해주는 클래스, enum class 이렇게만 있으면 되지 않을까 하며 깊은 고민을 하지 않았던 것 같다. 이러한 부분을 스스로 리팩토링을 진행하면서 개선해나가야겠다.
2주차부터 7명 정도가 모여 자신의 코드에 대해 설명하고, 서로 부족한 부분이나 잘했다고 생각되는 부분에 대해 이야기를 나누는 시간을 갖고있는데 모두 배울 점이 가득 가득한 분들이라 함께하는 2시간이 너무나도 금방 지나가는 것 같다.
말씀해주신 부분들과 배울점을 내 언어로 정리하면 다음과 같다.
- Application.kt에 있는 함수들을 클래스 단위로 구분하여 포함하도록 수정
- try-catch 부분이 반복되는 부분 수정
- 컨트롤러를 생성하여 전체적인 프로세스를 관리하도록 함
- 함수의 길이를 15라인이 넘지 않도록 수정
- 도메인 로직에 단위 테스트를 진행
- 에러 메시지의 상수화
위 내용을 기반으로 리팩토링을 진행해보고 해당 내용도 정리하도록 해야겠다.
📌 느낀점
그래도 매주 새로운 미션을 진행하면서 아주 조금이라도 성장하고 있는듯한 느낌이 든다. 혼자였다면 전혀 고려하지 않았을 부분들이 요구사항으로 주어지고 이를 지키기 위해 깊은 고민을 하는 것이 성장의 계기가 되는 것이 아닐까 한다. 더불어 저번주부터 진행하고 있는 코드리뷰를 통해 같은 요구사항에 대해 다른사람들이 어떻게 생각하고 구현했는지 그 분들과 생각을 교류하는 시간을 가짐으로써 전체적인 시야가 넓어지는 느낌이 든다.
이외에도 git commit 메시지 컨벤션을 지키는 것이 나름 익숙해졌고, README 작성 요령 또한 생겼다. 함수를 기능 단위로 나누어 구현하고 커밋하는 나름의 습관화가 되었고, 코틀린 언어에 익숙해졌다고 느껴진다. 하지만 더 많은 기능이 있기 때문에 더 학습이 필요한 것은 사실인 것 같다.
이제 프리코스 마지막 미션이다. 갈수록 어려워져서 힘든 부분도 있지만 재미도 있고 다른 사람들은 어떻게 구현했는지 소통하는 시간을 가지는 것이 정말 기대된다. 다소 미흡한 3주차 프리코스였지만 이를 계기로 더 성장한 4주차의 내가 될 수 있기를.