[프리코스] 우테코 프리코스 3주차 회고

꺄악 운석이다·2022년 11월 16일
0

우테코 프리코스

목록 보기
3/7

이번 주차 과제는 로또 게임 구현 과제였다.

과제를 읽어보는데 우리가 보통 생각하는 로또게임은 아니었다.

보통은 로또를 원하는 만큼 사고(5000원, 10000원...) 로또 개수 마다 우리가 원하는 숫자를 6개를 랜덤으로 고른 후 나중에 tv에서 숫자 6개를 추첨하는 방식이라면

우리가 구현해야 할 로또 게임은 우리가 돈을 넣으면 컴퓨터가 우리가 산 로또 마다 숫자 6개를 뽑아 콘솔에 출력하고 우리가 숫자를 6개를 입력하는 주객전도 로또게임이었다(....)

아무튼 이번에도 역시 추가 규칙이 있었다.

  1. 메소드 하나에 15줄을 넘기면 안된다.
  2. else 금지, switch case 금지
  3. Enum 사용하기
  4. 도메인 로직에 단위 테스트 구현하기

솔직히 나머지 규칙은 그렇다 치더라도 2는 상당히 물음표를 불러오는 규칙이었다. 아니 그러면 else 를 쓰지 말라는 건 분기를 남기지 말라는 건가?

그러나 우테코는 역시 계획이 다 있었다.

자세한 건 아래의 링크에, 추후에 이에 관련된 글 도 쓰겠다.
https://tecoble.techcourse.co.kr/post/2020-07-29-dont-use-else/

아무튼 이번 과제에는 추가 규칙을 지키기 위해 아래와 같은 노력을 했다.

책임은 확실하게

이번 과제에는 MVC 패턴을 적용하였다.

사실 MVC 패턴은 Spring Framework를 사용해서 프로젝트를 진행할 때 자주 사용했던 패턴이었으나 MVC 패턴의 개념에 대해서는 이해가 부족한 편이었다.

덕분에 다시 MVC 개념에 대해 공부를 하게 되었다.

👇MVC에 대한 간략한 설명

MVC란 : Model-View-Controller의 약자로 애플리케이션을 세 가지 역할로 구분한 개발 방법론
사용자가 Controller에 명령을 내리면 Controller는 Model에 데이터를 가져오고 View를 통해 시각으로 표현하는 것

MVC 개념을 적용하려다 보니 명확한 책임 분리가 필요해졌고 책임이 다른 곳으로 넘어가면 안되었었다. 덕분에 처음으로 다시 되돌아가서 기능 목록 리스트를 다시 쓰게 되었다.

그리고 각각 큰 역할을 하나의 클래스로 만들고 그 안에 또다시 메서드로 나누어 작성을 하였다.

덕분에 저번 주보단 책임분리가 명확한 코드를 작성할 수 있었다.

Enum의 활용

사실 enum은 저번 주부터 사용을 해왔다. 예외처리를 위한 문구를 한 곳에 관리하기 위해 enum에 모아놓았기 때문에 추가된 규칙에 대해 의문을 가지게 되었다.

그러나 enum은 상수 정의 이외에 다양하게 활용이 가능했다.심지어 stream과 함수형 인터페이스도 사용이 가능했다(!)

아래는 enum을 활용한 코드이다.

public enum LottoMoney {

    FIRST(6, false,2000000000),
    SECOND(5,true,30000000),
    THIRD(5,false,1500000),
    FOURTH(4,false,50000),
    FIFTH(3,false,5000),
    NO_MONEY(0, false, 0);

    private final int count;
    private final boolean bonus;
    private final int reward;

    public int getCount() {
        return count;
    }

    public int getReward() {
        return reward;
    }

    LottoMoney(int count, boolean bonus, int reward) {
        this.count = count;
        this.bonus = bonus;
        this.reward = reward;
    }

    public static int getRankReward(int count, boolean bonus) {
        return Arrays.stream(LottoMoney.values())
                .filter(lotto -> lotto.count == count && lotto.bonus == bonus)
                .map(lotto -> lotto.reward)
                .findAny()
                .orElse(NO_MONEY.getReward());
    }
}

위와 같이 stream을 활용하여 특정 값을 입력시 이에 맞는 enum값을 뽑아 낼 수 있었다. 이를 통해 분기를 줄일 수 있게 되었고 자동스럽게 else를 안쓰게 되었다.

단위 테스트

이번 주에는 하나의 기능에 대한 코드를 짤 때마다 단위 테스트를 바로 짰다. 사실 TDD를 해보고 싶었으나... 이러다가 마감까지 제출을 못할 것 같아 포기하고 기능 하나 작성하자마자 바로 단위테스트를 작성하였다.

처음엔 시간이 오래 걸렸으나 뒤로 갈수록 리팩토링에 투자하는 시간이 확연히 줄어들어 전체적으로 시간이 줄어드는 효과를 볼 수 있었다.

profile
멸종은 면하자

0개의 댓글