우테코 7기 프리코스 3주차 - 자동차 경주
간단한 로또 발매기를 구현한다.
IllegalArgumentException
을 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.Exception
이 아닌 IllegalArgumentException
, IllegalStateException
등과 같은 명확한 유형을 처리한다.14000
1,2,3,4,5,6
7
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
총 수익률은 62.5%입니다.
[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.
구입금액을 입력해 주세요.
8000
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
당첨 번호를 입력해 주세요.
1,2,3,4,5,6
보너스 번호를 입력해 주세요.
7
당첨 통계
---
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
총 수익률은 62.5%입니다.
“다른 사람과 비교해서 조바심을 갖지 말고, 어제의 나와 비교해서 성장하라”
2주 차 공통 피드백에 이런 내용의 글이 있었는데요, 프리코스를 시작하기 전부터 다짐했던 내용인데 돌아보니 어느새 조바심을 느끼고 있었던 것 같습니다. 특히, 코드 리뷰 과정에서 다양한 처음 보는 기술을 사용한 코드들을 보면서 저도 모르게 불안함을 느꼈던 것 같습니다. 하지만 오늘의 목표는 어제의 나를 이기는 것이라 생각하며 이번 미션에 몰입하였고, 결과적으로 정말 “스스로의 성장”에 집중하고 있는 것이 맞는지 방향성을 끊임없이 확인할 수 있었습니다.
README.md는 소스 코드 이전에 프로젝트의 개요를 소개하는 문서이다.
지금까지 프리코스에서 리드미는 기능 구현 목록을 적어놓는 용도로만 사용했는데요, 이 피드백을 보고 이번 미션에서는 프로젝트에 대한 설명을 조금 더 추가해보았습니다!
값을 하드코딩하지 않는다.
사실 이 피드백에 대해서는 고민이 많았는데요, 저는 그 자체만으로도 의미를 알 수 있다면 굳이 상수화시키지 않는 쪽으로 생각했었습니다.
private void printResult() {
outputView.printLottoResultHeader();
for (Object lotto : LottoRank.values()) {
outputView.printMessage(lotto.toString());
}
outputView.printRateOfReturn(LottoRank.getTotalPrize() * 100.0 / moneyInput);
}
예를 들어 이 코드에서 100.0
은 코드를 처음 보는 사람이라도 그 의미를 알 수 있을 것이라 생각하여 처음에 상수화하지 않았습니다. 그런데 피드백을 다시 한 번 훑어보는 과정에서 "코드 내에서 문자열이나 숫자 값을 하드 코딩하지 않는다."라는 글을 보고, 결국 이 부분을 상수화했습니다.
그러나 이 부분은 저에게 아직도 고민거리입니다. 다른 분들의 의견을 들어보고 싶다는 생각이 들었습니다.
테스트를 작성하는 이유에 대해 본인의 경험을 토대로 정리해본다
공교롭게도 저번 회고에서 제가 느낀 테스트(정확히는 단위 테스트)의 장점을 정리했었습니다! 그리고 이번 미션에서도 테스트 코드를 잘 활용해보기 위해 노력했습니다.
이번 미션에 도전하기 전에, 저만의 목표들을 세워보았습니다. 결론부터 말하자면 한 개는 찝찝하게 달성했고, 한 개는 아예 달성하지 못했습니다💦
첫 번째 목표는 시간을 정해놓고 구현해보는 것이었습니다! 5시간을 잡고 처음부터 코드 구현까지 마쳤는데, 결과적으로 어떻게든 기능도 동작하고 테스트 코드도 통과하긴 했습니다. 그러나 마음이 급해져 고민할 시간이 부족하다 보니, 프리코스 과정에서 새롭게 배웠던 내용을 제대로 활용하지 못하는 경우가 있었습니다. (제가 어떤 것을 아직 제대로 활용하지 못하는지 파악할 수 있었던 좋은 경험이었습니다.)
이렇게 완성된 코드는 자연스럽게 수많은 리팩터링 커밋도 함께 남겼습니다. “구현 시간”자체는 5시간 안으로 짧게 걸렸으나, 짧은 고민으로 인해 수많은 리팩터링 과정을 거치게 되었고, 결과적으로 미션 제출까지 코드에 쏟은 시간 자체는 오히려 더 걸렸던 것 같습니다. 따라서 저는 이 경험을 통해 코드를 작성하기 전 고민 과정과 설계 과정의 중요성을 깨달을 수 있었습니다!
두 번째 목표는, 테스트 코드를 작성하는 것을 병행해 보는 것이었습니다. (이 목표는 저번 회고에서 야심차게 각오했었습니다..💦)
목표 1을 지키기 위해 시간적 압박 속에서 자연스럽게 저에게 익숙한 방향으로 코딩을 하였고, 지금까지 저는 항상 테스트 코드는 코드를 구현한 후에 점검하는 용도로 사용했기 때문에, 단위 테스트를 병행하는 것을 실패했습니다. 하지만 2주 차 미션과 이번 미션을 통해 단위 테스트를 작성해서 얻을 수 있는 이점이 확실하다는 것을 깨달았기 때문에, 마지막 미션에서라도 해당 목표를 꼭 달성하고자 합니다!
저번 회고에서 댓글로 mermaid를 사용하는 좋은 방법을 알려주셔서, 이번에는 피그마로 한땀한땀 만들지 않을 수 있었습니다!
그러다가 인텔리제이가 클래스 다이어그램을 그려준다는 것도 알게 되고 이것도 사용해봤습니다! 역시 직접 그리는 것보다는 낫다는 생각이 드네요..
우선 2주차 코드 리뷰를 통해 피드백 받았던 대로, service
에 대한 클래스를 만들었습니다. controller
에는 정말 프로그램의 흐름을 담당하게 하였고, view와 소통하는 기능과 service의 핵심 로직을 호출하는 기능을 위주로 넣었습니다!
그리고 enum을 사용하는 것이 이번 미션의 요구사항이었어서, 에러 메시지, 로또와 관련된 상수, 로또 등수를 enum으로 관리해봤습니다! 이렇게 enum으로 관리함으로써 타입 안전성, 유지보수에 유리해진다는 것을 알게 되었습니다.
또한 입력을 받을 때 사용자에게 출력하는 메시지를 어디서 담당하느냐
에 대해 프리코스 기간 내내 고민했는데요, 결국 1주차 미션에서 했던 것처럼 InputView
에서 담당하게 했습니다! "입력을 받는 행위"에 대한 과정에 출력 메시지가 포함된다고 생각했기 때문입니다!
제가 작성한 코드를 계속 보다 보니, 뇌가 제 코드에 절여져서(?) 개선점을 쉽게 찾지 못하고, 근자감은 상승했던 것 같아요. 그러다보니 놓치는 부분도 생겼던 것 같습니다.
항상 코드 리뷰 과정에서 제가 놓은 부분을 발견하고 다시 겸손함을 되찾게 되고, 내가 배울 점을 빠르게 찾을 수 있었습니다! 그런데 오히려 정말 잘 하는 사람들이 많구나.. 하면서 기가 죽는 경우도 있었던 것 같습니다.
그래서, 내가 혼자 코드를 작성하는 과정에서는 근거 없는 자신감을 갖지 않도록, 다른 사람과 의견을 나누는 과정에서는 불안함을 갖지 않도록 의식해야겠다는 생각이 들었습니다.
또한 1주차, 2주차에서는 매일매일 느낀 부분이나, 사소하더라도 고민한 부분을 노션에 따로 정리해두었었는데 이번 주차에는 그런 부분이 미흡했던 것 같습니다. 그래서 소감문을 작성할 때나, 지금 회고를 작성할 때, 내가 미션을 수행하는 과정에서 어떤 부분을 고민했는지를 100% 돌아보지 못한 것 같습니다.
그래서 제가 기억력이 좋지 않은 만큼, 고민에 대해 기록하는 습관을 들여야겠다는 생각이 들었습니다.
(미션 제출을 완료하고 후련한 마음으로 산책하다가 촬영한 사진인데 슬쩍 올려봅니다🎆)
이제 마지막 한 주밖에 안 남았는데, 프리코스가 끝나면 후련함, 아쉬움 등 어떤 감정이 크게 들지 궁금하네요. 후회하지 않도록 열심히 끝까지 해보겠습니다!
재밌게 보다가 지난 회고에서 누가 mermaid를 알려줬다는 걸 보고 "설마 난가?" 싶었네요 ㅋㅋㅋㅋㅋ
5시간 안에 완성은 했지만 예쁜 코드를 만들지 못해 아쉽다고 해주셨는데요, 제가 프리코스 과제에 임할 때 가지고 있는 목표는 "쓰레기같은 코드라도 만들자! 리팩토링은 그 이후에.."입니다.
(문구 출처: https://velog.io/@no1msh1217/%EC%9A%B0%ED%85%8C%EC%BD%94-5%EA%B8%B0-AOS%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B5%9C%EC%A2%85%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9B%84%EA%B8%B0)
5시간안에 리팩토링까지 완전히 끝내는 건 현실적으로 힘들다고 생각해요. 그래서 저도 주어진 시간 안에 돌아가는 쓰레기라도 완성하고자 하고 있습니다. 이런 관점에서 보면 정말 잘 해주고 계신 것 같아요! 오래걸린다고 기죽지 않아도 될 것 같습니다!
디코에 재밌는 짤로 어그로 끌어주시면 다음주 회고까지 보러 오겠습니다! 🤣
이번주도 고생하셨고 마지막까지 화이팅해봐요!! 🙌
+) 산책뷰가 대박이네요.. 🥹