우아한테크코스 프리코스 3주차 후기

Y·2023년 11월 11일
0

우테코 프리코스

목록 보기
3/4

우아한 테크코스 프리코스 3주차

3주차 미션 깃허브

요새 이리저리 바쁘고 정신이 없어서 3주차 후기를 늦게 남긴다. 저번주에도 시간을 많이 못 써서 아쉽다고 후기를 남겼는데 이번주는 시간을 더 못 썼다(...) 요새 바빠서 정신이 정말 없다. 여튼 이번주에 적용한 부분은 다음과 같다.

  • Enum 사용
  • 에러 메시지 분류
  • try-catch문으로 입력 오류시 재입력

셋 다 요구사항에 추가돼서 지키게 됐다. 이외에는 클린코드 규칙 중 인스턴스 변수 3개 이상으로 만들지 않기 규칙을 지키려고 노력했다.

Enum 사용

Enum을 아예 처음 써보는 건 아닌데, 잘 쓰지는 않아서 처음에 쓰면서 버벅거리기도 했다. Exception, LottoResult, PrintPhrase 세 개로 나누었는데 나중에 추가로 LottoAmount, LottoNumberMatch, MatchType 세 개를 더 만들었다. 인스턴스 변수를 최대 2개로 제한하려니, 로또 결과의 속성만으로 1)당첨 번호 개수(일반 번호) 2)보너스 번호 당첨 여부 3)금액 총 세 개가 나왔다.
이런 경우에도 인스턴스 변수 규칙을 지켜야 되는지? 좀 유연하게 해도 되지 않나 생각은 했지만 일단은 저 규칙을 한 번 지켜보기 위해서 LottoResult(등수 종류), LottoAmount(당첨 금액), LottoNumberMatch(등수별 매칭 개수) 세 개로 쪼갰다.
그리고 2등과 3등을 판별할때는 보너스 번호 맞춤/맞추지 않음 여부를 체크해야되고 나머지는 보너스 번호 체크 자체가 필요없어서, 보너스 번호에 대해서 true/false로 나눌수가 없어 MatchType이라는 새로운 enum을 하나 생성해서 true, false, no 세 분류로 나누었다.

에러 메시지 분류

에러를 그냥 throw exception하지 않고 에러 문구를 출력해야했다. 그래서 Exception enum을 생성해서 에러 분류를 나눈 후 문구를 작성해서 사용해줬다.

try-catch문으로 입력 오류시 재입력

입력 오류가 나면 에러 메시지를 출력하고, 다시 입력을 받도록 해야했다. 그래서 controller단에서 전부 try-catch문을 사용해줬는데, 로또 당첨 번호를 입력받는 부분에서 1)당첨 번호 입력 -> 검증 후 저장 2)보너스 번호 입력 -> 검증 후 저장 3)검증된 각 번호를 받아와서 최종 추가 검증(당첨 번호와 보너스 번호 사이에 중복 번호가 없는지) 후에 당첨 번호 객체 생성 이런 식이어서, 3에서 오류가 나면 어떻게 입력을 다시 받아야 되는지.. 이런 부분에서 함수를 쪼개기가 굉장히 애매해졌다. 하지만 3에서 오류가 나는 상황은 보너스 번호와 당첨 번호 중 중복 숫자가 있는 경우니까, 보너스 번호만 새로 받아오도록 했다.

클래스 분리

앞서 말했듯 인스턴스 변수 3개 미만으로 하기 위해서(....) 객체를 정말 많이 쪼갰다.

  • Controller
    • LottoController
  • Model
    • Lotto
    • LottoMachine
    • LottoResultGenerator
    • LottoVendingMachine
  • View
    • View
    • InputView
    • OutputView

이렇게 쪼개졌다. 우선 LottoController의 경우, 컨트롤러다보니 당연히 멤버 변수가 많아질 수 밖에 없는데... 그래서 솔직히 여기서까지 멤버 변수가 3개 미만이어야 되나?에 대한 의문을 정말 많이 가졌지만 일단은. 모델 객체중에 InputView, OutputView 이것만 가져와도 벌써 2개였다. 그래서 InputView, OutputView 두 개를 View라는 하나의 객체로 묶어주고 LottoController는 View를 멤버 변수로 가지도록 했다. View는 InputView와 OutputView를 멤버 변수로 가지고, 대부분의 입력과정은 출력-입력 과정이 함께 이뤄지니 입력값에 따라 이걸 전부 하나로 묶어서 하나의 메서드로 만들어줬다. (입력문구 출력-입력받기 이 두개를 한 메서드로)
그리고 모델 역시 LottoResultGenerator, LottoVendingMachine 두 객체를 써야했는데 둘 다 쓸 수가 없으니 LottoMachine 하나의 객체로 묶어서 사용해줬다. LottoResultGenerator은 결과를 생성, LottoVendingMachine은 랜덤 로또 객체를 생성한다. 그래서 LottoMachine을 통해서 로또를 사고, 로또 결과를 받을 수 있는 것이다. 그런데 이렇게 클래스를 짜니, 그러면 LottoMachine은 1)로또를 사고, 결과를 받는 두 가지 일을 하는 것인가? 2)LottoVendingMachine, LottoResultGenerator을 매개해주는 역할을 하는 것인가? 에 대한 의문이 생겼다. 어쨌든 일은 LottoResultGenerator, LottoVendingMachine에서 각자하고 있으니 후자가 맞는 것 같기는 하다. (그리고 지금 보니 내가 구현한게 일종의 Facade 패턴인 것 같기도 하다🤔)
인스턴스 변수 2개 이하... 이게 가능할까 싶었지만 해보니까 어째저째 가능하기는 했다. 그리고 이 과정에서 객체가 더 하나의 역할(?)을 기준으로 쪼개진 것 같아서 만족스럽다.

기타

급하게 구현한다고 TDD는 이번주에도 적용을 못했다... TDD는 고사하고 테스트코드도 신경을 많이 못 썼다.. 테스트코드는 커버리지 100을 어째저째 달성을 하긴 했지만 아직 아쉬운게 많고.. 이번 4주차에는 테스트코드에도 꼭.. 더 신경을 써야겠다.

profile
개발자, 학생

0개의 댓글