[우아한테크코스 백엔드 5기] 프리코스 3주차 후기 (로또)

안녕하세요 ~ 2주차 후기 이후로 오랜만에 포스팅하네요 하하..

이번 3주차 미션의 난이도도 어렵기도 했고 욕심을 가지고 하다보니 포스팅 할 시간이 부족하더라구요

아직 정리 할 내용들이 산더미 처럼 많은데 마지막 프리코스가 끝나고 폭풍 정리 시작해야겠습니다 👊🏻

 

제가 작성한 코드는 이곳을 클릭하여 보실 수 있습니다.


프리코스 3주차 - 로또 미션

이번 3주차 미션은 로또 미션이였는데요

2주차 미션의 요구사항에서 다음과 같이 요구사항이 추가되었습니다.

 

그리고 다음과 같이 미리 작성된 Lotto 클래스를 이용하여 로또 게임을 구현하는 제한사항이 주어졌습니다.

 

로또 게임을 완성한 후 실행 결과 예시입니다.

구입금액을 입력해 주세요.
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%입니다.

 

그리고 공통 피드백과 요구사항을 반영하여 만든 3주차의 목표는 다음과 같습니다.

 

3주차에 요구사항과 제한사항이 추가되면서 이번에도 참 많은 것을 배웠는데요

이번 미션을 통해 새롭게 배운점과 느낀점들을 정리해보고자 합니다.


새롭게 배운점과 느낀점들

README를 너무 구체적으로 적지않는다.

2주차 미션에는 README를 상세히 적어야 보는 사람도 보기 편하지 않을까란 생각에 정말 상세히 적으려고 노력했었는데요

하지만 이번 공통 피드백 중 하나인 "기능 목록을 재검토한다"의 피드백을 통해 README를 너무 구체적으로 적는 것은 좋지 않다는 것을 느꼈습니다.

사실 구현을 하기 전에 앞서 기능 목록을 만드는데 "어떻게 README를 통해 내 코드들을 한눈에 파악할 수 있도록 할까",

"어떤식으로 작성해야 깔끔하고 보기 좋을까?" 에 중점을 두고 계속 빈번한 수정을하면서 기능 목록 작성만 많은 시간이 걸렸었습니다.

그리고 처음에 완벽하게 짜려고 했지만, 나중에 코드를 검토하면서 메서드, 클래스, 변수 이름을 변경하거나 파일 구조를 바꿀 때마다 기능 목록도 빈번한 수정이 이뤄지게 되더라구요..

그래서 이번 3주차 기능목록딱 구현해야 할 기능 목록을 작성하는 걸로 바꾸고, 로또 게임을 구현하다가 필요하다 싶은 기능이나 예외 사항을 기능 목록에 추가하는 식으로 하였습니다.

 

  • 2주차와 3주차 기능목록 비교

왼쪽의 2개의 사진 : 2주차, 오른쪽 1개의 사진 : 3주차

2주차와 3주차의 기능 목록을 보면 확실히 차이가 나죠 ?? 

2주차는 클래스별 이름을 정해 기능 목록을 작성하고 마지막에 클래스별 메서드 설명까지 넣었었고 변경 될 때마다 기능 목록 수정에 상당한 시간이 투자되었습니다.

하지만 3주차 기능목록은 위 처럼 구현해야 할 기능 목록만 작성하였고 클래스의 이름도 정하지 않았습니다.

그래서 클래스의 이름이 바뀌거나 파일 구조가 바뀌게 되더라도 빈번한 수정이 없었고

완성된 기능 목록을 커밋하고 체크할 때나 ,필요하다 싶은 예외나 기능을 추가할 때에 수정을 하며 이전 보다 기능 목록에 투자하는 시간이 훨 씬 줄 수 있었습니다. 

 

열거형 Enum 사용법

이번에 열거형이라는 Enum을 사용해야한다는 새로운 요구사항이 추가되었는데요.

열거형에 대해서는 생각보다 어렵지 않게 공부할 수 있었습니다.

아래 코드는 로또 당첨 내역을 출력하기 위한 상수들인데 열거형을 통해 상수를 쉽게 관리할 수 있었고

당첨 통계를 출력하는데 필요한 정보들을 뽑아 적용할 수 있었습니다.

Enum 사용법에 대해서는 정리 후에 따로 포스팅하겠습니다.

 

도메인 로직에 작은 단위 테스트 코드 작성.

위와 같은 피드백을 통해 작은 단위의 테스트 코드를 작성해봤는데요.

"단, UI(System.out, System.in, Scanner) 로직은 제외"의 요구사항이 있었기에 이 외의 테스트 코드를 다음과 같이 작성했습니다.

아직 까진 구현을 시작하기 전에 테스트 코드를 작성할 수 있는 단계는 되지 않아

JUnit5를 연습하면서 구현한 메서드드의 기능을 테스트 해보는 식으로 테스트를 짰는데요

프리코스가 끝난 뒤 JUnit5 테스트 코드들을 짜보면서 사용 예제들을 포스팅하려 합니다.

 

MVC 디자인 패턴

이전 프리코스의 과제들을 보니 많은 지원자분들이 MVC디자인 패턴을 사용하는 것을 봤습니다.

그래서 이번 미션에는 나도 MVC패턴을 적용을 해볼까? 하며 MVC패턴을 알아보고 이번 프리코스에서 처음적용해보았습니다.

하지만 글로 배운 대로 MVC 패턴을 적용하려 하니까 규칙들이 하나씩 어긋나서 어떻게 구조를 만들지 고민하면서 정말 많은 변경이 있었는데요 ..

원래에는 View에 입력과 출력 데이터를 넣었었다가 처음 만들어져있던 Lotto 클래스의 내용을 건들지 않으려 하다 보니 로또의 예외처리 메서드가 에러메시지를 받아오는 과정에서

"Model은 view의 코드나 controller의 코드를 가져선 안된다" 규칙에 어긋나게 되더라구요

 

그래서 고민하다가 완벽한 MVC 패턴은 적용하지 못하고 아래 처럼 파일 구조를 나누었습니다. 

사실 이렇게 짜는게 MVC 디자인 패턴이라 할 수 없기 때문에 좀 아쉬움이 많이 느껴지네요 ...

앞으로 MVC 패턴에 대해 익숙해지려 노력하고 공부해봐야겠습니다.

 

문제의 예외 처리

이번 미션에서 가장 고민을 많이 했고 애를 먹었던 부분이였습니다 .. 

이전 미션에서도 그랬듯이 조건을 만족하지 못하면 throw new 로 예외를 발생시키고 에러 메시지를 출력하면 되겠구나 ~했지만 이번에는 그렇게 간단한 문제가 아니였습니다... 😓

구입금액에 숫자가 아닌 문자가 들어갔을 때 IllegalArgumentException을 발생 시키고, 출력 메시지에 "[ERROR]" 가 포함되었는지  테스트하는 코드입니다.

    @Test
    void 예외_테스트() {
        assertSimpleTest(() -> {
            runException("1000j");
            assertThat(output()).contains(ERROR_MESSAGE);
        });
    }

 

이렇게 보면 요구사항의 조건을 만족한 것 처럼 보입니다.

그래서 저는 당연히 구입 금액에 문자가 들어갔다면 에러 메시지를 출력하고 종료하는 메서드를 추가했기 때문에 에러가 났을 때 "뭐지 버근가 ?" ㅋㅋ 이런 생각을 갖기도 했었는데요

우테코 측에서 추가로 온 문제가 잘 못되지 않았다는 메일을 받고 "내가 문제였구나.."라고 바로 바뀌게 되었습니다.

 

그래서 문제가 있는 메서드를 제거 하고 다시 예외 테스트를 실행해봤습니다.

그랬더니 아래와 같이 문자열을 정수 타입으로 변환하면서 생기는 오류가 나오더라구요 ??

 

그래서 try catch로 NumberFormatException를 예외 처리하고 예외 정보를 출력하면 되지 않을까 ? 라는 생각에

다음과 같이 모든 메서드를 실행하는 컨트롤러의 start() 메서드에 try catch 구문을 추가 했습니다.

 그랬더니 결과는 ????????????? 성공 !

모든 테스트가 통과하지 못하면 0점이기에 안절 부절했다가 테스트를 통과 시키고 나니 진짜 온몸의 전율이 흘렀는데요 ..

아마 이 문제는 우테코에서 문제해결능력을 키우도록 유도한 문제가 아닌가 싶습니다.


이번 미션을 통해서도 정말 배운 것이 많았고 문제해결능력까지 키울 수 있었던 시간이 아니였나 싶습니다.

점점 오르는 난이도에 힘이 들기도 하지만 그 만큼 새롭게 배울 수 있는 것도 많고 점점 성장해간다는 뿌듯함을 느끼며 프로그래밍에 재미가 붙여지는 것 같습니다. 😀

 

하지만 미션하나를 완성하는데 많은 시간을 투자해 최종 코딩 테스트는 과연 5시간에 완성할 수 있을 지 걱정이 되기도 하는데요 ..

마지막 4주차 미션도 마무리 잘하고 최종 코딩 테스트 보기전까지 정리하고 복습하면서 최종 코딩 테스트 또한 통과할 수 있도록 노력해야 겠습니다 !