프리코스 3주차 시작
프리코스 3주차를 진행하면서
이번 3주 차 때는 지난 주차를 수행하면서 실수했던 부분을 최대한 보완하기 위해서 많은 노력들을 기울였습니다. 지난 2주 차 때 부주의로 인해서 함수명에 불용어를 쓰거나 테스트에 있어서 작은 단위 테스트를 진행하지 못했던 실수들이 잦았기에 이번 주차에는 그런 점들을 보완하여 최대한 신경을 많이 썼습니다.
우선 기능명세서 부분부터 다시 공부를 시작하였습니다. Todo 형식으로 작성하여, 피드백에 맞게 처음에는 크게 작성하려고 노력하였습니다. 이후에 미션을 수행하면서 충분히 고쳐나갈 수 있다고 생각하였기 때문입니다. 이후에는 객체로 나누어 프로그램의 진행 과정에 맞춰서 기능 명세서를 작성하였습니다. 이는 블로그와 우아한테크코스 디스코드에 많은 지원자분들 올려주신 좋은 글들을 통해서 개인 학습을 진행할 수 있었습니다. 학습을 진행하면서 제가 완벽하게는 알고 있지는 않았구나라고 생각했고, 이러한 빈틈 또한 다시금 채워나가는 한주 였습니다.
이후 미션을 다시 읽어보면서 요구사항에 대해서 분석하였습니다. 처음에 대강 훓었을 때는 간단하다고 생각했지만, 주어진 요구사항을 더하니 상당히 어려운 미션이라는 생각이 들었습니다. 그래서 미션을 진행하면서 이번에는 머릿속으로 주어진 요구사항과 입출력을 바탕으로 예외 사항에 대해서 생각하며 고민하였고, 이를 바탕으로 또한 정리하여 기능 명세서에 담기 위해서 노력했습니다. 이 고민하는 과정이 정말 제가 성장하는 느낌이 들었던 것 같습니다.
이후에는 앞서 고민하며 나누었던 클래스를 단위로 프로그램 작성을 시작하였습니다. 이번에는 지난 주차와 다르게 커밋메세지에 대해서도 영문으로 작성하고, 최대한 간결하고 누구나 읽어도 바로 읽히는 그런 커밋메세지를 작성하기 위해서 노력하였습니다. 이번 미션에서의 핵심은 "한 함수가 한 가지 기능만 담당하게 한다"와 "테스트 코드"라고 생각했습니다. 이를 지키기 위해서 최대한 클래스를 작게 나누려고 노력했지만, 우선적으로 진행하면서 수정을 해도 된다고 생각하여, 큰 범위부터 잡고 기능을 구현해 보면서 함수를 최대한 의식적으로 코딩을 했습니다. 처음에는 5개의 클래스가 나왔습니다. 처음에 주어진 Lotto와 그리고 Presenter, Game, Printer, Message였습니다. Presenter의 경우 사용자의 입력을 받는 역할을 함과 동시에 Printer에서 선언한 게임 진행 안내문구를 출력하는 역할을 맡습니다. 그리고 Game class는 게임에서 진행에 필요한 역할을 맡았습니다. Message의 경우 Object로 선언하여, String 부분을 변수화 해서 가지고 있는 역할을 하였습니다. 이후에는 Game의 클래스의 역할이 너무 많아져서 다시 Calculator Class와 분립을 하였습니다.
사실 주어진 Lotto Class의 역할이 정확히는 무엇을 의미하는 것일까 에 대해 정말 많은 고민을 하였습니다.
사용자의 입력을 받아 예외를 처리하는 것까지는 쉬웠지만, Lotto로 객체화한다면 이후에 필요한 변수를 제대로 사용할 수 없었기 때문입니다. 그래서 사용자의 입력을 List<Int> 로 묶어서 변수화 하였지만, 이 부분에서 제가 원했던 그림이 나오지 않아서 계속 찜찜한 기분을 들고 미션을 수행했던 것 같습니다. 하지만 몰입이라는 경험에서 제가 계속해서 생각하다보니 의외의 상황에서 data class로 bonus번화 변수와 user입력 로또 번호를 묶어서 같이 예외처리도 하고, 변수화 시키면 되지않을까? 라는 생각으로 풀리게 되었고, 사실 이러한 부분에서 저번에 주였던 공통 피드백 "한 함수가 한 가지 기능만 담당하게 한다" 라는 것이 정말 많은 고민을 하라는 뜻이라고 생각했던 것 같습니다. 그래서 최대한 함수가 한가지의 기능만을 담당할수 있도록 코드에 대해서 한줄 한줄 고민을 많이 했습니다. 사실 이러한 부분에서는 코틀린이 자바보다는 장점이 있다고 생각합니다. 코틀린답고 코틀린스럽게 짠다면 이러한 부분이 훨씬 쉽게 느껴질 수 있었기 때문입니다. 코틀린과 자바는 유사한 점이 많지만 그래도 코틀린의 간결함은 자바보다 훨씬 뛰어나고 좋다고 생각합니다. 그래서 flatMap이나, Map에 대한 사용을 아끼지 않았고, 이번에 주어진 요구사항에서 당첨내역은 enum class를 사용함으로써 충분히 깔끔하고 좋은 코드가 나올 수 있었습니다. 또한 enum class를 활용할 때는 when의 사용도 적용하였습니다.
사실 이러한 부분에서는 정말 많은 시간을 들였다면, 두 번째로 가장 많이 시간을 들인 것이 바로 함수명과 클래스명 그리고 변수명에 대한 작명이었습니다. 2주차 때 이러한 부분이 정말 아쉬움이 많았습니다. 지난 날 제 잘못된 습관을 짧은 시간내에 고칠순 없었기 때문에 최대한 이 부분을 의식하면서 코드를 짜려고 하였고, 제출하는 마지막 까지 이러한 부분에서 고민을 하고 리팩토링을 진행하였습니다. 그리고 또한 번역기를 최대한 사용하며 불용어는 최대한 사용하지 않는 방향으로 작명을 하려고 하였고, 동기들과 후배들의 도움을 받아서 이러한 함수명에 대한 피드백을 끊임없이 받으려고 노력했습니다. 사실 이전에는 좋은 변수명과 함수명이 무엇인지는 정확하게 설명하는 것은 어려웠지만, 이 프리코스를 통해서 제가 느낀 것은 프로그램의 코드를 처음보는 사람도 바로 이해할 수 있는 것이 좋은 것 이구나 라는 것을 몸소 많이 느끼고 있습니다.
마지막으로 테스팅 또한 정말 많은 시간을 할애를 하였습니다. 우선적으로는 바로 코드를 짜기보다는 예외처리에 대한 생각 정리를 하고 나서 제가 실제로 이러한 프로그램을 사용한다면 어떠한 부분에서 에러가 발생할까에 대해서 많은 고민을 하였습니다. 그래서 요구사항에서는 주어지지 않았지만 로또를 1장이라도 구매하기 위해서는 1000원 이상의 금액을 투입해야한다. 라는 예외도 넣었으며, 당연하게도 사용자 당첨 번호 입력과 보너스 번호 입력에서의 예외처리 또한 진행을 하였습니다. 이러한 부분에서 조금 더 프로그래밍이라는 것이 정말 논리가 중요하다는 것을 많이 느꼈던 것 같습니다. 이후에는 앞서 테스트 코드를 스터디한 것을 기반으로 테스트 코드를 짜려고 노력하였습니다. 사실 과거에 안드로이드 프로젝트를 진행하면서 UI에 대한 테스트를 어깨너머로 배운 적은 있지만 제가 실제로 테스트 코드를 이렇게 짜면서 공부한 것은 이번이 처음이였기에 테스트에 대한 흥미와 테스트 코드를 짜는 방법에 대해서도 피드백을 통해서 공부를 할 수 있었던 것이 정말 좋은 시간이였습니다.
사실 이번 프리코스를 진행하면서 드는 생각은 매주 하나의 미션이 모두 다 아쉽고, 이렇게 몰입하고 토론하고, 코드리뷰를 받는 기회가 더 있으면 좋겠다는 생각이 정말 많이 들고 있습니다. 프리코스를 진행하면서 제가 부족했던 점에 대해서도 조금이라도 알게되고, 또한 이러한 미션이 제게는 정말 재미있고 제가 성장하는 기분이 들기 때문에 이러한 과정들을 조금 더 할 수 있는 기회가 주어졌으면 좋겠습니다. 그래서 우아한테크코스가 제게는 조금 더 절실하게 느껴지고, 이미 지난 미션에 대해서도 정말 많은 아쉬움이 듭니다. 하지만 그러한 아쉬움을 씻어내고 남은 주차 동안 최선을 다하겠습니다.
긴 회고록 읽어주셔서 감사합니다.
내 우테코 레포
https://github.com/ois0886/kotlin-lotto-6/tree/ois0886
'회고록' 카테고리의 다른 글
[우아한테크코스] 최종코테 후기(1차 합격 후기) (0) | 2023.12.19 |
---|---|
[우아한테크코스 6기 안드로이드] 프리코스 4주차 회고록 (0) | 2023.11.16 |
[우아한테크코스 6기 안드로이드] 프리코스 2주차 회고록 (0) | 2023.11.03 |
2023년 8 ~ 10월까지의 회고록 (0) | 2023.10.26 |
[우아한테크코스 6기 안드로이드] 프리코스 1주차 회고록 (0) | 2023.10.26 |