티스토리 뷰

3주 차를 보내며


객체 지향적인 설계와 enum 도입

이번 주차에는 객체를 분리하여 도메인 로직을 작성하고 MVC 패턴을 적용하는 것을 목표로 학습했습니다. 야구 게임에서 그림을 그려가며 객체를 분리했던 것이 많이 도움이 되어 로또 게임도 그림을 그려가며 객체를 분리했습니다.

  • Lotto: 로또 하나는 1~45사이의 번호 6개로 구성되어 있습니다.
  • User: 로또 게임에 참여하는 사용자.
  • LottoMachine: 사용자가 투입한 금액 만큼의 로또를 생성하는 역할을 합니다.
  • WinningNumber: 해당 게임 당첨 번호 6개와 보너스 번호 1개를 가질 수 있습니다.
  • Rank: 해당 게임에서 사용자의 당첨 현황과 수익률을 계산해 출력합니다.

 

이번 주차에 추가된 프로그래밍 요구사항 중 가장 눈에 띄었던 것이 ‘자바 enum 적용' 입니다. 그러나 단순한 열거를 위한 enum을 제외하고는 사용해 본 적이 없어 어떻게 적용해 볼지 판단이 되지 않았습니다.

기본 설계를 기반으로 코드를 작성하던 중, 당첨 번호와 구매한 로또를 비교해 스코어를 계산하고 결과를 출력하는 부분에서 반복적인 if 문 사용이 많았고 스코어와 결과의 객체의 역할이 모호해지는 것 같았습니다. 이 과정에서 enum을 적용하는 것이 아닐까라는 생각이 들었고 java enum에 대한 여러 레퍼런스를 찾아보기 시작했습니다.

Rank enum을 사용하지 않고 Score, Result 객체를 사용했을 때

위 두 사진은 enum을 사용하지 않았을 때 로또 결과를 계산하는 과정입니다. If 문을 이용해 일치하는 숫자 개수를 판단하고 수익을 계산해야 했습니다. 로또 등수(1~5등) 만큼의 if문이 필요했고 객체 지향스러운 코드가 아니었습니다.


그러던 중 우아한형제들 기술 블로그의 ‘Java Enum 적용기’를 보며 enum을 사용하는 이유와 어떻게 활용할 수 있는지를 확실히 느낄 수 있었습니다. 

enum을 이용한 Rank 일부분

스코어와 결과를 (상금, 일치하는 숫자 개수, 보너스 유무, 출력문) 구조의 하나의 enum 객체로 만들고 도메인 로직을 만들어 적용해 보니 불필요한 출력문, 반복문이 사라지며 훨씬 명확한 코드가 된다는 것을 느꼈습니다. 또한 테스트할 때에도 함수를 따로 추가하지 않고 도메인 로직에 맞춰 자연스럽게 테스트할 수 있어 객체지향적인 설계의 중요성을 다시 한번 느낄 수 있었습니다.



MVC 패턴 적용

MVC 패턴을 적용하며 어떤 계층에서 예외 검증의 책임을 가져야 하는지 고민이 많았습니다.  제가 고민했던 예외 검증 방법은 총 3가지이었습니다.

1. View에서 입력의 모든 예외 검증을 마친 후 타입에 맞춰 반환
2. View는 입력을 받는 역할만 하고 Model에서 모든 예외 검증
3. View는 입력받는 ‘문자열’에 대해서만, Model은 ‘객체 인스턴스 타입’에 대해서만 검증

첫 번째 방법은 view가 사용자에게 입력을 받고 출력을 보여주는 것이 주된 역할이라고 생각하는데, 모든 예외를 검증한다면 단일 책임 원칙을 벗어난다는 생각이 들었습니다. 두 번째 방법은 domain이 객체의 인스턴스 변수와 문자열 예외까지 모두 검증한다면 그것 또한 단일 책임 원칙에서 벗어나는 것 같았습니다. 또한 두 방법 모두 테스트 코드를 작성해보니 서로의 책임이 아닌 부분까지 작성해야 했습니다.

결론적으로 세 번째 방법을 선택했습니다. 한 번에 할 수 있는 예외 처리를 나눠서 한다는 것이 반복되는 작업 같기도 했지만, 해당 계층에서 가질 수 있는 최대한의 책임을 가진다고 판단했습니다. 해당 방법으로 코드를 작성해 보니 객체 인스턴스 타입에 대해서만 집중할 수 있었고, 도메인 로직을 테스트하는 과정에서도 view와 domain을 서로 고려하지 않고 테스트 코드를 작성할 수 있었습니다.

 

아직까지 어떤 방법이 더 적절한 지 확실하게 판단할 수 없었지만, 나름대로 근거를 만들어가며 알아가는 과정이 도움이 많이 된 것 같습니다.


글을 마치며

3주간 과제를 진행하며 객체지향의 개념을 조금씩 조금씩 알아가고 있다는 점이 스스로에게 동기부여가 되는 것 같습니다. 2주 차때 stream 사용을 거의 해보지 못해 아쉬웠는데 이번 주에는 다양한 로직에 도입해보며 좀 더 익숙해졌고, 설계를 하고 코드를 작성하는데 소요되는 시간이 초반에 비해 점점 줄어들고 있다는 것을 느꼈습니다. 계속해서 고민하고 리팩토링 하는 과정이 지치기도 했지만, 힘든 과정과 노력 없이는 성장할 수 없다고 생각하기에 좀 더 힘을 내서 열심히 해보겠습니다 !

댓글