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

Hayoon·2022년 11월 16일
0
post-thumbnail

❓1, 2주차 회고록을 안 쓰고 뭐했냐고 묻는다면,

어느덧 프리코스 4주차 마지막 과제를 받은 시점이다.
1, 2주차 회고록을 안 쓰고 뭐했냐고 묻는다면, 회고록의 중요성을 깨닫지 못 했다. 다른 사람들이 PR을 하고 코드 리뷰를 서로 요청하면서 코드를 몰래 훔쳐본 결과, 나와는 다른 시각으로 접근해 구현한 것들을 보고 내 스스로가 피드백이 필요하다고 느껴서 늦게나마 작성하게 되었다.

❗️2주차 미션 피드백

  1. README.md를 상세히 작성하자.
    정상적인 경우도 중요하지만, 예외적인 상황도 기능 목록에 정리한다. 특히 예외 상황은 시작 단계에서 모두 찾기 힘들기 때문에 기능을 구현하면서 계속해서 추가해 나간다.
  2. 한 함수가 한 가지 기능만 담당하게 하자.
    만약 여러 함수에서 중복되어 사용되는 코드가 있다면 함수 분리를 고민해 본다. 안내 문구 출력, 사용자 입력, 유효값 검증 등 여러 일을 하고 있다면 이를 적절하게 분리한다.

⏰ 목표

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

✏️무엇을 배웠나?

MVC 디자인 패턴

MVC 패턴으로 디자인패턴을 인지하면서 구현을 해보려고 노력했다. service계층에서 어떤 엔티티를 주어야 할지가 난감했었다. MVC패턴 관련 10분 테코톡을 뒤늦게 본 내가 너무 자랑스럽다.^^
1. Model은 Controller와 View에 의존하지 않아야 한다.(Model 내부에 Controller와 View에 관련된 코드가 있으면 안된다.
2. View는 Model에만 의존해야 하고, Controller에는 의존하면 안된다.
3. View가 Model로부터 데이터를 받을 때는, 사용자마자 다르게 보여주어야 하는 데이터에 대해서만 받아야한다.
4. Controller는 Model과 View에 의존해도 된다.(Controller 내부에는 Model과 View의 코드가 있을 수 있다.)
5. View가 Model로 부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.

Enum

	MATCHING_THREE(3, 5000),...,MATCHING_SIX(6, 2000000000);
private double calculateTotalYield(double purchasePrice, HashMap<Integer, Integer> matchingPair) {
        int sum = 0;
        for (LottoType type : LottoType.values()) {
            sum += matchingPair.get(type.getMatchingCount()) * type.getMatchingCountMoney();
        }
        return (double) sum * LottoConstant.YIELD_OPERAND / purchasePrice;
    }

이렇게 Enum에 type, value를 쌍으로 해서 반복문을 돌릴 수 있었다. 이전에는 static final로 일일이 하나하나 적어주었는데 Enum으로 코드가 간결해졌다.

도메인 기반 단위테스트 (AssertJ, Junit5)

테스트의 중요한 목적 중 하나는 내가 작성하는 코드에 대해 빠르게 피드백을 받는 것이다. 문제를 작게 나누고, 그 중 핵심 기능에 가까운 부분부터 작게 테스트를 만들어 나간다.

@ParameterizedTest로 여러 개의 값을 동시에 받아 한 번에 테스트가 가능하다. 미리 데이터를 생성하여 파라미터에 해당 데이터타입만 맞추어주면 여러 값의 테스트가 한 번에 실행된다.

	@DisplayName("로또 번호 입력 시 서로 다른 6개의 숫자여야 한다.")
    @ParameterizedTest
    @MethodSource("generateData")
    void calculatorLottoSize(List<Integer> input, int expectedSize) {
        HashSet<Integer> hashSet = new HashSet<>(input);
        assertThat(hashSet.size()).isEqualTo(expectedSize);
    }

    static Stream<Arguments> generateData() {
        return Stream.of(
                Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6), 6),
                Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 5), 5),
                Arguments.of(Arrays.asList(1, 1, 2, 3, 3, 4), 4)
        );
    }

assertThatThrownBy()는 예외처리 테스트케이스를 작성할 때 용이했다. 예외발생이 터질 때 해당 예외종류가 어떤 것인지를 테스트할 수 있는 메서드다.

assertThatThrownBy(() -> LottoException
                .exceptionBonusNumberByDuplicatedLotto(lotto.getNumbers(), 6))
                .isInstanceOf(IllegalArgumentException.class);

🔧 아쉬운 점

자바로 코딩을 하면서 좀 더 간결하게 코드를 짤 수 없었나 하는 아쉬움이다. HashSet으로 로또 번호가 모두 다른지 판단하기 보다는, Java Stream으로 한 줄로 로직을 구현할 수 있었다. Stream에 대해 공부를 하고 다음 주차 미션에서는 구현을 해보겠다. 다음 글은 Java Stream에 대해 게시하겠다.

profile
Junior Developer

1개의 댓글

comment-user-thumbnail
2022년 11월 20일

좋은 글 감사합니다 ㅎㅎ

답글 달기