우아한 테크코스 6기 프리코스 3주차 회고

지송·2023년 12월 6일
0

안녕하세요!
드디어 절반을 넘고 3주차로 왔어요
벌써 3주차라니 감회가 새로워요
처음 시작할 때 4주 분량이라고 하니 엄청나게 많은 느낌이었는데
막상 해 보니 시간이 너무 빨리 흘러서 아쉽기도 해요
고민도 많이하고 리팩토링 클린코드에 대해 많이 생각하고 진행할 수 있어서
좋은 시간들이었다고 생각해요
자바 공부는 병행하고 있는데 아직 글을 제대로 작성하질 못해서 이번 주에는 할 여유가 있었으면 좋겠네요 ㅠㅠ

https://github.com/woowacourse-precourse/java-lotto-6

이번 주차 과제는 다음과 같은데요!
여러가지 조건이 추가되었습니다

IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.

Lotto 클래스
제공된 Lotto 클래스를 활용해 구현해야 한다.

특징적인 부분은 위와 같습니다
기존에 예외 상황이 발생하면 종료하고 끝냈던 것과 달리 계속하여 입력을 받아야 되며
기존에 제공된 로또 클래스를 통해 구현해야 함을 볼 수 있습니다

< 2023.11.06 월요일 >

지난 주에 월요일부터 시작하니 상당히 빠듯한 감이 있었는데
이번 주에도 주말이 조금 빡셌어서 결국... 월요일에 하게 되었네요!
월요일 하루를 오롯 쏟아부어 완성하는 게 목표지만 되려나 모르겠어요 ㅎㅎ

  • 과제 Fork하여 로컬에서 체크하기
  • 플로우 차트 그리기
  • 조건 파트 작성하기
  • 구현 파트 작성하기

1. 과제 Fork하여 로컬에서 체크하기

역시나 포크 후 제 깃허브 이름으로 브랜치를 만들고 퍼블리시까지 했어요!
무사히 오픈까지 했습니다

2. 플로우 차트 그리기

플로우 차트를 그리면서 내가 읽으며 빠트린 조건이 있는지 재차 확인이 가능해요!
프리코스의 주제들이 아주 복잡하지 않아서 플로우 차트 그리는 데 오래 걸리지는 않으니 꼭 작성해 보셨으면 합니다 ㅎㅎ

예외 목록과 조건들도 플로우 차트를 작성하며 같이 작성해 주었습니다!
플로우 차트를 그리며 제공된 Lotto 클래스를 살펴보니 여기서 예외사항을 처리하는 게 맞는 방식이었다는 생각이 문득 들더라고요! 그래서 InputView에서 하던 validate 검증을 각 클래스에서 진행하는 걸로 해 보겠습니다

3. 조건 파트 작성하기

어쩌다 보니 엄청나게 길게 작성했다!
조건들도 많아지고 꼼꼼하게 작성해서 그런 것 같네요 ㅎㅎ
근데 다음부터는 조건 플로우 구현 순서로 짜 보는 것도 괜찮을 듯?
다음이라 해 봤자 한 번 남았네요
이렇게 말하니 뭔가 아쉽

4. 구현 파트 작성하기

설계만 한 시간 족히 걸린 것 같아요
더 나은 구조를 위해 고민했습니다
validation 검증의 경우 inputview에서 하는 게 맞을지 해당 class에서 하는 게 맞을지 고민했는데
검색해 본 결과 도메인에서 해야되는 것과 인풋에서 해야 되는 예외 처리를 분리해야 된다는 말을 보았고 그것이 맞는 것 같아 분리하기로 했습니다!
ENUM도 활영하며 각 역할을 적절히 나눌 수 있도록 고민을 거쳤습니다 ㅎㅎ...


  • Lotto 구현하기
  • Lotto 테스트 코드 작성
  • UserLotto 구현하기
  • UserLotto 테스트 코드 작성
  • Winning 구현하기
  • Winning 테스트 코드 작성

이번에는 테스트 코드를 마지막에 한번에 작성하지 않고 틈틈이 같이 작성해 주기로 했습니다!
그게 더 적절한 방식인 것 같아요
그럼 이제 코드 작성하러 갑니다

5. Lotto 구현하기

구조를 만들고 기능을 구현하다 보니 InputException만 문서에 적어 두었길래
해당 예외 사항을 Lotto Exception으로 분리시켜 작성하였습니다

6. Lotto 테스트 코드 작성

이미 테스트 코드가 두 개 있어서 하나만 추가로 작성
테스트 코드를 돌리는데 계속 java.lang.UnsupportedOperationException 오류가 떠서 이십 분 정도 원인을 찾아 헤맨 것 같은데 원인은 sort 함수에 있었다 바꿀 수 없는 걸 계속 바꾸려고 시도했던 모양...
바로 수정했습니다

7. UserLotto 구현하기

함수 이름이 너무 직관적이지 않은 것 같아 수정도 해 주고 차례차례 기능에 따라 개발 완료하셨습니다

8. UserLotto 테스트 코드 작성

구입 금액이 음수일 때
구입 금액이 1000단위가 아닐 때
금액에 따라 적절한 개수를 구입하는지
적절한 개수에 따라 로또를 발행하는지에 대한 테스트를 진행하였습니다

9. Lotto 관련 추가하기

원래는 ResultLotto에 추가하려고 했던 함수인데 Lotto에 추가하는 게 더 적절할 것 같아서 해당 로직으로 변경하였습니다

10. Winning 구현하기

enum은 공부하면 할수록 어려운 듯한 느낌
여기저기 소스 코드를 읽고 최적으로 활용하기 위해 노력했습니다

11. Winning 테스트 코드 작성

으아 슬슬 힘들어지네요
winning 기능 자체가 하나 뿐이라 해당 기능 테스트와 함께
추후 수익률 계산에서 필요할 것 같은 기능까지 추가로 테스트해 주었습니다

< 2023.11.07 화요일 >

오늘은 꼭 완성하도록 하겠습니다!
다른 분들은 얼마나 걸리는지 모르겠지만
저는 블로그 글도 쓰고 이것저것 정리하고 하면 열시간은 족히 걸리는 것 같아요... ㅠㅠ

  • ResultLotto 구현하기
  • ResultLotto 테스트 코드 작성
  • LottoException 구현하기
  • InputView 구현하기
  • InputException 구현하기
  • OutputView 구현하기
  • LottoController 구현하기

1. ResultLotto 구현하기

커밋 수에서 고민의 흔적이 보이나요?
외부에서는 최대한 간단하게 사용하기 위해 노력을 거듭했습니다!
결과를 컨트롤러에서 바로 받게 하는 방법을 고민하다가
아웃풋 뷰에서 각 등수에 맞는 개수 + 수익률을 차례대로 출력하길래
개수와 수익금액을 전달해 주었습니다
getter 함수를 사용하지 않기 위해 따로 리스트를 저장하는 방법을 택했는데
더 나은 로직이 없는지 고민하다가 현재로서는 찾을 수 없었습니다
로또 클래스 내에서 다른 로또 객체를 받아 getter를 사용하는 방법도 고민했는데
이 역시 getter를 사용한다는 건 변치 않아서 이게 최선이라 판단했는데 아쉬움이 있기는 합니다 ㅠㅠ

2. ResultLotto 테스트 코드 작성

보너스 번호가 범위 아래일 때
보너스 번호가 범위 위일 때
보너스 번호가 중복될 때
로또 번들 하나 주고 금액이 잘 나오는지
로또 번들 하나 주고 등수가 잘 나오는지

테스트를 진행하다가 오류를 발견해서 하나 바로 고쳤어요
뿌듯하네요 ㅎㅎ...

3. LottoException 구현하기

위 사항들을 작성하며 함께 구현했기 때문에 생략합니다!

4. InputView 구현하기

문득 체크해 보니 커밋 수가 60개를 넘었더라고요
지난 주보다 더 발전한 느낌이라 뿌듯합니다
확실히 로직적으로 더 나은 느낌이 들어서!
한 달 동안의 성장이 기대돼요

5. InputException 구현하기

위와 함께 구현하였습니다

6. OutputView 구현하기

진짜 고지가 눈앞이에요!
작은 단위로 분할 정복하는 게 아주 재미있게 느껴지는 코드짜기입니다

7. LottoController 구현하기

드디어 조립 끝!
이제 실행해 볼게요 ㅎㅎ

에러들 다 고치니 최최종 끝이 났습니다

  • 규칙 준수 확인하기
  • PR 넣고 1차 제출
  • 지원서에 2차 제출
어느덧 3주차라니 감회가 새롭습니다
처음 시작할 때에는 4주 분량이라 하니 엄청나게 긴 느낌이었는데
이제 하나의 미션만 남은 상태라 아쉽습니다
코드에 대한 고민도 하고 클린코드를 읽으며 병행 중인데
확실히 더 나은 구조와 코드 리팩토링에 대해 고민하고 진행할 수 있어서
의미 있는 순간들이었다 생각합니다
이번 과제에서 제공된 로또 클래스를 살펴보면서
기존에 inputView에서 진행하던 validate에 대해 고민할 수 있는 계기가 되었는데 
inputView와 각 도메인에서 해야 될 검증이 분리되어 있고
해당 부분을 나누어서 진행하면 되겠다는 결론이 내렸습니다
설계에 이번에는 한시간 조금 안 되는 시간을 쏟아부은 것 같은데
이러한 고민을 거치며 좀 더 시야가 넓어지는 것 같아 뿌듯합니다
테스트 코드 또한 틈틈이 작성하며 같이 병행하였는데
확실히 조립 전에 기능 테스트를 먼저 해 볼 수 있어 좋았습니다 
java.lang.UnsupportedOperationException 오류를 만나 한참 머리를 싸맸는데 
얕은 복사와 깊은 복사 바꿀 수 없는 객체에 관한 것이어서
또 새로 공부할 수 있었습니다
getter 함수를 사용하지 않기 위해 최대한 노력하였는데
출력 함수를 제외한 곳에서는 사용하지 않고 코드를 마무리할 수 있어서
캡슐화의 규칙을 준수한 것 같아 뿌듯합니다
마지막까지 최선을 다하여 좋은 결과를 볼 수 있으면 좋겠습니다
그렇지 않다 한들 제가 발전하였으니 이미 좋은 결과를 보았다 생각합니다!
profile
💻 늘 공부하고 발전하는 개발자

0개의 댓글