본문 바로가기
생각정리

[우아한테크코스 5기] 프리코스 3주차 로또 미션 학습 내용 및 회고

by greeng00se 2022. 11. 16.

3주차를 진행하며

코수타를 들으며 한 주 동안 많은 생각이 들었습니다.

내 능력 이상으로 미션 이외에 것들을 시도하려고 하는 건가? 라는 생각이 들었던 한 주입니다.

일단 그동안 해왔던 것처럼 묵묵히 걸어나가자고 결심했습니다.

파울로 코옐료의 아처에는 다음과 같은 말이 나옵니다. “의도는 명료하고 올곧고 균형 잡혀 있어야 한다.”

코드를 작성하면서 최대한 의도를 담으려고 노력했습니다.

3주차인 로또 미션에는 다음과 같은 추가적인 목표가 있었습니다.

  • 클래스(객체)를 분리하는 연습
  • 도메인 로직에 대한 단위 테스트를 작성하는 연습

클래스(객체)를 분리하는 연습

2주차에 진행했던 것보다 조금 더 의미 있게 클래스를 분리하려고 노력했습니다.

미션 시작 전 기능들을 나열하고 요구사항에 대한 부분을 나누면서 이러한 책임은 누가 담당할지 고민하는 시간을 가졌습니다. 이 부분에서 다이어그램을 간단하게 그리면서 미리 나눌 클래스를 생각해 보았습니다.

클래스마다 적당한 크기의 책임을 가지도록 분리를 했고 그러다 보니 적절하게 클래스가 분리되었던 것 같습니다.

2주차에는 초기에 생각했던 부분과 결과의 차이가 조금 있었는데 로또 미션의 경우 괴리가 그렇게 크지 않아서 신기했습니다.

도메인 로직에 대한 단위 테스트를 작성하는 연습

단위 테스트의 경우 1주차 보다 조금 더 어렵게 느껴졌습니다.

습관적으로 정상의 경우부터 테스트를 진행했었는데 다음부터는 예외 상황부터 테스트를 해야겠다고 느꼈습니다. 정상적인 상황부터 처리하려다 보니 예외 상황을 빼먹는 경우가 생겼습니다.

1주 차보다 더욱 테스트를 하기 쉬운 코드를 작성하려고 노력을 했습니다.

생성자 주입을 통해 외부에서 제어할 수 있는 코드를 만드는 것을 골자로 생각하고 진행했습니다.

위임 메서드의 경우 똑같이 복잡하게 테스트를 해야 할까 생각하다가 목을 이용해서 단순히 호출했는가? 만 테스트를 했습니다.

TDD를 진행해 보겠다고 마음먹었지만 막상 복잡한 상황에 놓이면 내 마음대로 되지 않았습니다. 더욱 열심히 연습을 해야 되겠다고 생각을 했고 아직 부족한 부분이 너무나 많다고 생각이 들었습니다.

단위 테스트의 작성하는 이유

공통 피드백의 내용에서 언급된 것처럼 학습 테스트를 할 때 도움이 많이 되는 것 같습니다. 새로운 언어를 학습할 때 언어적 특성들을 학습할 땐 자바스크립트의 Jest나 Junit과 같은 테스트 도구들을 이용한 단위 테스트가 많이 도움이 되었습니다.

개인 프로젝트를 진행하면서 단위 테스트가 기능적으로 문제가 없는지 단순히 테스트하는 것이라고 생각을 했었는데 이번 우테코를 진행하면서 단위 테스트가 크게 보면 성장의 한 사이클이라고 느꼈습니다.

부족한 부분을 피드백하고 수정해나가면서 코드가 성장하여 하나의 문서가 되는 느낌을 많이 받았습니다.

소프트 스킬에 대한 고찰

다른 사람들의 글이나 회고를 보면 나 자신이 소프트 스킬이 부족하다고 많이 느낍니다.

잘 쓴 글을 보면 내심 부럽기도 하고 나도 잘 읽히고 글에 열정이 느껴졌으면 좋겠다는 생각이 많이 들었습니다.

다른 사람들을 보고 저도 현재 상황에 안주하지 않고 다방면에서 더욱 성장해야겠다는 마음이 듭니다.

로또

3주차는 로또에 대한 미션이었습니다.

프로그래밍 요구사항 중 추가된 요구사항은 다음과 같습니다.

  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
  • else 예약어를 쓰지 않는다.
  • Java Enum을 적용한다.
  • 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.

2주차의 야구 게임과 동일하게 진행했지만 2주차와 다르게 UI 로직에 대한 단위 테스트는 진행하지 않았습니다.

시작 전 생각정리

image

2주차에 간단하게 클래스 별로 책임을 가볍게 생각하고 진행을 하니 진행 속도가 빨라진 것 같아 이번 주도 동일하게 적용해보았습니다.

어설퍼 보이지만 그래도 미션을 진행하는데 큰 도움이 되는 것 같습니다.

요구사항에 따라 Enum을 사용해야되기 때문에 상금에 대한 부분을 Enum을 사용하기로 했습니다.

image

요구사항을 거의 만족할 때 쯤 위와 같이 간단한 설명과 함께 정리를 했습니다.

의존성

2주차의 회고에 남긴 Todo에 적혀있는 것 처럼 3주차에는 View에서 Domain에 대한 의존성 및 결합도를 최대한 낮게 하려고 노력을 했습니다.

2주차와 다른 점은 dto를 사용했습니다.

dto는 계층간의 데이터를 운반하는 역할을 합니다. dto를 사용함으로써 도메인에 대한 직접적인 의존을 피하게 되면서 뷰와 도메인의 결합도를 낮출 수 있었습니다.

아예 의존하지 않도록 만드려고 했지만 로또 결과를 받는 부분에서 조금 자연스럽지 못한 느낌이 들었기 때문에OutputView에서 로또 당첨금에 대한 Enum인 LottoPrize를 의존하도록 냅두었습니다.

EnumMap

EnumMap은 Map에서 특정 Enum타입만을 키로 사용하도록 하는 구현체 입니다.

내부에서 Array를 사용하고 HashMap과 달리 해싱과정이 필요없기 때문에 성능적으로 우수합니다.

상금을 Enum으로 표현하고, 등수에 따른 당첨 횟수를 저장하기 위해 EnumMap을 사용하기로 했습니다.

일급 컬렉션을 사용한다면 값과 행위를 한 곳에 관리할 수 있습니다. 결과를 가지고 있기 때문에 결과에 대한 비율을 계산하는 책임을 부여했습니다. (GRASP Infomation Expert, 책임을 수행하는 데 필요한 정보를 가지고 있는 객체에게 할당한다)

Custom Exception, Legacy Exception

2주차에서는 도메인 로직에서는 간단하게 커스텀 예외를 하나만 만들어서 사용했습니다.

3주차에는 예외에 대한 추가 요구사항도 존재했고, Effective Java Item 72의 표준 예외를 사용하라를 참고하여 특별한 상황이 아닌 경우 객체가 표준 예외를 던지는 것이 더 좋다고 생각되어 표준 예외를 사용했습니다.

예외시 같이 던지는 메시지의 위치에 대해서도 고민을 했는데 해당 예외 메시지를 던지는 클래스가 상수로 가지고 있는 것이 응집도면에서 좋다고 생각되어 클래스가 가지고 있도록 했습니다.

toString

2주차에는 toString을 비즈니스 요구사항에 대한 출력을 위해 사용했습니다.

Effective Java Item 12에는 toString의 경우 디버깅을 편하게 하는 용도로 사용하라고 되어있습니다.

toString을 출력을 위해 사용했기 때문에 결합도가 높아질 수 밖에 없었던 것 같습니다.

로또 미션에서는 toString을 디버깅 용도로 사용하고, 별도의 출력을 위한 메서드를 두어 dto에 담아 전달하는 것으로 출력에 대한 요구사항을 만족시켰습니다.

Service 계층

크게 로또 구매, 당첨번호 입력, 당첨 결과 확인으로 요구사항을 생각하고 로직이 길어질 것으로 예상하여 Service 계층을 추가로 두었습니다.

막상 후반부에 가서는 객체들끼리 메시지를 보내 결과를 만들어나가서 처음에 객체에게 메시지를 보내고 View에 전달할 Dto를 생성하는 것 정도로 사용되었습니다.

메서드 분리와 테스트

위에 작성한 단위 테스트를 작성하는 이유에 추가하여 메서드를 잘게 분리하고 단위 테스트를 작성하면서 프로그래밍을 하다보니 안정감이 생긴 것 같습니다.

프로그램을 실행하지 않고 기능에 대한 정리를 하고 테스트만 돌리면서 해당 기능이 동작하도록 프로그래밍을 한 뒤 나중에 이어 붙이기만 하면 완성되는 느낌을 많이 받았습니다.

2주차와 달리 의도적으로 메서드 수를 줄이려고 노력하지 않아도 5라인이 넘어가지 않아서 신기했습니다.

Money 클래스

막바지에 금액에 대한 부분을 포장하여 사용 하기위해 Money라는 클래스를 추가했는데 생각보다 연산과 관련된 작업을 많이해서 메서드를 계속 추가한 것 같습니다.

초기에 금액에 대한 부분을 포장했다면 조금 더 편하지 않았을까? 시간이 많았다면 BigDecimal을 사용해보는 것도 좋지 않았을까?와 같은 생각이 들었습니다.

3주차를 마치면서

어느덧 3주가 지나갔습니다.

매 순간 문제를 생각하다 보니 시간이 빨리 지나간 것 같습니다.

열정적인 사람들과 프리코스를 진행하니 정말 큰 원동력이 되는 것 같습니다.

pr에 피드백 남겨주시면 저도 따라서 피어 리뷰 남기러 가겠습니다. 감사합니다 :)

4주차도 열심히 달려보도록 하겠습니다!