Home 프리코스 3주차 회고
Post
Cancel

프리코스 3주차 회고

[프리코스 3주차 미션 링크] https://github.com/woowacourse-precourse/java-lotto-6

[제출 코드 링크] https://github.com/woowacourse-precourse/java-lotto-6/pull/174

프리코스 3주차

3주차 문제는 로또 문제입니다.

사용자가 입력한 금액에 맞는 수량의 로또를 구입합니다. 이 때 구입하는 로또는 랜덤으로 중복되지 않는 숫자 6개를 선택하여 구입하게 됩니다.

이 후 정답 번호와 보너스 번호를 직접 입력하게 되며, 해당 번호를 실제 로또 규칙대로 구매 로또의 번호와 비교해 당첨 결과를 출력하는 문제입니다.

3주차 미션의 목표는 클래스(객체)를 분리하는 연습, 도메인 로직에 대한 단위테스트를 작성하는 연습입니다.

아래는 2주차 미션에 대한 공통 피드백입니다.

  • 값을 하드 코딩하지 않는다.
    • 상수를 만들고 이름을 부여해 해당 값이 무슨 역할을 하는지 명시해야 한다는 뜻.
  • 구현 순서도 코딩 컨벤션이다.
    • 클래스는 상수, 멤버 변수, 생성자, 메서드 순으로 작성한다.
  • 변수 이름에 자료형은 사용하지 않는다.
    • ex) carNameList, arrayString
  • 한 함수가 한 가지 기능만 담당하도록 해라.
  • 처음부터 큰 단위의 테스트를 만들지 않는다.
    • 큰 단위 : 프로그램의 시작과 종료 전체 테스트.
    • 작은 단위 : 한 가지 메서드에 관한 테스트.

공통 피드백임에도 저에게 해당하는 부분들이 많았습니다. 코드 리뷰에서 받았던 피드백들과 공통 피드백의 내용을 최대한 지키려고 노력하면서 구현했습니다.

구현

3주차 미션에는 미션의 목표인 객체의 분리에 신경을 많이 썼습니다.

이전 주차에 자동차 Name 입력 값의 검증을 따로 validator를 만들어 View에서 검증하는 방식으로 처리했었는데, 코드 리뷰를 하다보니 Name을 하나의 객체로 만들어 해당 객체 내부에서 검증하는 방식을 선택한 분이 있었고 이를 적용해보자 생각하고 있었습니다.

그런데 마침 미션의 목표가 객체의 분리였기 때문에 올바른 방향으로 생각하고 있다고 여기고 객체 분리를 주로 신경쓰게 되었습니다.

그리고 미션 요구 사항에 ‘Java Enum을 적용한다.’ 가 있었기 때문에 Enum 사용에 대해 많이 고민하며 미션을 구현하게 됩니다. 로또 결과 등수에 Enum을 적용하기로 결정했고, 이전 주차에 단순 메시지, 상수만을 Enum으로 관리했을 때는 Enum의 장점을 느끼지 못했던 것에 대비에 활용성이 매우 좋다는 것을 알 수 있었습니다.

그리고 리팩토링 과정에서는 중복 코드 제거에 가장 많은 노력을 하며 구현했던 것 같습니다.

새롭게 학습한 부분

가장 깊이 있게 학습했던 주제들에 대해 기록해보고자 합니다.

이번 주차 미션의 핵심은 Enum이었습니다. Enum의 사용이라는 미션 요구사항에 맞추어 잘 몰랐던 Java Enum에 대해 학습했고, 적용시키면서 Enum의 장점에 대해 확실히 파악할 수 있었습니다.

Enum의 활용성을 높이다보니 Enum에 람다식을 적용할 수 있다는 것을 알게 되었습니다. 그러면서 함수형 인터페이스에 대해 학습하게 됐고 구현을 보다 간결하게 할 수 있었습니다.

커뮤니티에 제가 몰랐던 정적 팩토리 메서드에 관한 글이 올라왔었고, 학습한 후 적용하고 있었는데 적용하고 보니 Enum과 조합해 다양하게 활용할 수 있는 부분이 떠올랐고 이에 더해 테스트도 용이해졌습니다.

ParameterizedTest는 테스트 코드의 간결함을 위해 학습하게 되었습니다.

아쉽거나 적용시켜 볼만한 부분

  • 중복코드를 제거하려다보니 하나의 메서드로 통합하는 과정에서 필요한 매개변수가 달라 메서드를 오버로딩 해야됐던 문제.
  • Object 타입을 사용함에 있어 타입 안정성에 대한 문제
  • 객체 분리의 아쉬움.
    • 객체 분리에 집중하다보니 오히려 필요한 역할임에도 역할을 부여하지 않은 부분이 있다.
  • 예외처리 및 출력형식 처리에 꼼꼼하지 못했던 문제
  • 메서드 분리의 아쉬움
    • 한 가지 메서드가 알고보니 여러 역할을 하고 있었던 부분이 있다.
  • 메시지를 enum으로 관리할 때 메시지 안의 숫자도 포장할 수 있었다.
    • 이 부분은 장단이 있기 때문에 고려해봐야 하는 문제이긴 하다.
  • 애플리케이션 작동 환경이 바뀌었을 때를 고려하지 않았다.
    • CLI 환경에서 WEB 환경으로 변했을 때 System.out.println()을 그대로 쓸 수 있는가?

소감

3주간 미션을 하면서 앞선 1~2주차보다 많이 개선됨을 느끼긴 했지만 여전히 부족한 부분이 많다고 느꼈습니다.

그래도 리팩토링을 하면서 느낀 점은 객체 분리가 어느 정도 잘 되었구나 입니다. 리팩토링을 하며 코드를 수정해도 그 객체의 코드만 수정하고 그 객체를 사용하는 외부의 코드는 유지해도 되었기 때문에 이 부분을 느낄 수 있었습니다. 테스트를 함에 있어도 마찬가지였습니다.

어렴풋하게만 알고 있던 객체 분리의 장점, 중요성 그리고 설계에 관한 부분을 직접 부딪히며 경험해보니 확실하게 알 수 있었고 앞으로의 개발자의 삶에 있어 큰 도움이 될 것이라고 느끼게 된 한 주였습니다. 이 과정 속에서 이러한 부분을 효율적으로 코드를 작성하도록 해주는, 몰랐던 Java의 기능들도 학습하며 빠르게 성장하고 있는 것이 느껴졌던 미션이었습니다.

그리고 이렇게 객체 지향에 대해 지속적으로 학습하고 고민하다보니 내가 프리코스 이전에 했던 스프링에 대해 공부한 부분이 떠올랐습니다.

스프링을 공부했을 때 기존의 서블릿, JSP 구조에서 스프링 MVC로 넘어오는 과정을 보고 그냥 그렇구나, 이런 구조를 통해 예전 서블릿의 기능을 이렇게 이용해서 스프링이 탄생했구나 정도로 느꼈던 것 같습니다. 하지만 이제 왜 스프링이 탄생했는 지, 어떻게 객체 지향적인 부분을 살리려고 노력했는지 복습하며 확인할 수 있을 것 같다는 생각이 들었습니다.

This post is licensed under CC BY 4.0 by the author.