지난 2주차에서 잘 지키지 못했던 점은 상수를 따로 빼내는 것이었다. 또한 Test코드를 작성하는 것 역시 잘 못했었다. 과제만 제출하는 것이 아니라 내가 성장해야 하기 때문에 이 부분을 발전시키고 싶었다.
따라서 이번 3주차에서는 모든 데이터를 상수화했다. 에러 메시지, 입력 메시지, 출력 메시지, 로또 게임 관련 데이터들(최소 번호, 최대 번호, 구입 단위 등)에 대한 데이터들을 constant 패키지에서 enum이나 class를 사용하여 관리해봤다.
사실 이전에도 이렇게 구현을 진행하는 방식을 본 적이 있는데, 엥? 굳이? 라는 생각을 했었다. 하지만 이번에 실제로 구현하면서 만약 다른 사람이 내 코드를 본다면 그냥 숫자 45보다 LOTTO_MAX_NUMBER이 의미를 잘 나타낼 수 있음을 깨닫았다. 45가 의미하는 것이 무엇인지를 바로 알 수 있는 부분에서부터 유지보수가 쉬워지는 것이다. 이렇게 엄청나게 복잡하지 않은 코드에서도 유지보수가 쉬워지는데, 하나의 기업에서 운영하는 서비스에서는 얼마나 효율적일지 상상이 갔다. 따라서 이번 3주차 과제를 진행하면서 이제부터 이렇게 상수화하는 습관을 들여야겠다고 생각했다.
package lotto.constant;
public class LottoConstant {
public static final int LOTTO_MIN_NUMBER = 1;
public static final int LOTTO_MAX_NUMBER = 45;
public static final int LOTTO_WIN_FIRST = 6;
public static final int LOTTO_WIN_FIRST_PRICE = 2000000000;
public static final int LOTTO_WIN_SECOND = 7;
public static final int LOTTO_WIN_SECOND_PRICE = 30000000;
public static final int LOTTO_WIN_THIRD = 5;
public static final int LOTTO_WIN_THIRD_PRICE = 1500000;
public static final int LOTTO_WIN_FOURTH = 4;
public static final int LOTTO_WIN_FOURTH_PRICE = 50000;
public static final int LOTTO_WIN_FIFTH = 3;
public static final int LOTTO_WIN_FIFTH_PRICE = 5000;
public static final int LOTTO_PURCHASE_UNIT = 1000;
public static final int LOTTO_NUMBER_SIZE = 6;
public static final int LOTTO_MIN_PURCHASE_AMOUNT = 1000;
public static final int LOTTO_MAX_PURCHASE_AMOUNT = 100000;
public static final String PROFIT_MARGIN_MESSAGE = "총 수익률은 %.1f%%입니다.";
public static final String OUTPUT_WINNING_STATISTICS = "당첨 통계";
public static final String OUTPUT_LINE = "---";
public static final String OUTPUT_PURCHASE_AMOUNT_MESSAGE = "%d개를 구매했습니다.";
}
package lotto.constant;
public enum LottoCount {
FIFTH(3,"3개 일치 (5,000원) - %d개"),
FOURTH(4, "4개 일치 (50,000원) - %d개"),
THIRD(5, "5개 일치 (1,500,000원) - %d개"),
SECOND(7, "5개 일치, 보너스 볼 일치 (30,000,000원) - %d개"),
FIRST(6, "6개 일치 (2,000,000,000원) - %d개");
private final int grade;
private final String message;
LottoCount(int grade, String message) {
this.grade = grade;
this.message = message;
}
public int getGrade() {
return grade;
}
public String getMessage(int count) {
return String.format(message, count);
}
}
위의 코드와 같이 하나의 클래스에 모든 상수를 모아서 관리하면 유지보수가 편하다는 점에 대해서 실제 진행하며 배웠다. 또한 이번에 MVC모델을 새롭게 적용했다. MVC모델 역시 지금까지 굳이 이렇게 나눠야 하는가에 대해서 생각을 많이 했었다. 하지만 결국 구현이 조금 더 복잡해지자 나조차도 헷갈리게 되는 상황이 발생했고, 나눠야겠다는 결론에 도달했다. View에는 최대한 사용자에게 보여지는 콘솔부분 내용이 들어가도록 작성했고, Controller에서는 View와 Model을 중간에서 처리하는 부분을 담당하도록 노력했다. 또한 Model은 하나의 객체라 생각해 사용자와 로또, 로또 생성기로 나눴다. 마지막으로 Service에서 로또 당첨 계산, 이익률 계산, 보너스 번호 계산, 번호 계산 등의 비즈니스 로직을 담당하도록 했다. 이렇게 하고나니 확실히 내가 다시 코드를 들여다볼때도 편해지는 것을 느꼈다. 전에 굳이 이렇게 해야하는가?에 대한 대답은 충분히 된 것 같았다. 직접 해보지 않았기에 이렇게 나눠진 코드가 유지보수에서 좋은지에 대해서 알 수 없었던 것이 아닌가라는 생각이 들었다.
이렇게 발전한 부분도 있지만 Test코드 부분에 대해서는 성장하지 못했다....단위 테스트를 작성해서 진행하는데 하나의 테스트를 실행했을 때는 pass하지만 전체 테스트시에는 하나를 제외한 나머지 테스트들에서 오류가 발생하는 문제가 생겼다. 이에 대해서 계속해서 이유를 찾아봤지만 이번엔 Console의 문제도 아니었다. 아무래도 내가 테스트 코드를 잘못 작성한 것 같은데 문제점을 모르겠다.. 다음 4주차에서는 따라서 이 TEST에 대해서 확실히 공부해보는 것을 목표로 잡도록 하겠다.!