본문 바로가기
우테코/프리코스

[우테코 5기 프리코스] 3주차 돌아보기(11월 16일 추가)

by dev_kong 2022. 11. 15.
728x90
728x90

우테코 프리코스 3주차 과제

https://github.com/woowacourse-precourse/java-lotto

 

GitHub - woowacourse-precourse/java-lotto: 로또 미션을 진행하는 저장소

로또 미션을 진행하는 저장소. Contribute to woowacourse-precourse/java-lotto development by creating an account on GitHub.

github.com

로또 만들기가 이번 프리코스 과제였다.


로또 살 금액을 입력하면 자동으로 로또 번호가 생성돼서 출력되고,
당첨번호와 보너스 번호를 입력하면 결과가 출력되고,
로또 구매 금액과 당첨금액을 비교해서 수익률이 몇퍼센트인지 출력해주는 프로그램을 만드는 과제였다.

 

2주차 과제보다 난이도가 제법 상승한거 같았고,
예외처리도 신경써줘야 할 부분이 많았다.

 

처음에는 막막하기만 했는데,
기능 목록을 작은 단위로 하나하나 작성하다 보니, 작은 기능들을 구현할 방법들이 머릿속에 떠올랐고,
그것들을 묶어주기만 하면 되겠구나 라는 생각이 들었다.

 

 

이번 과제를 하면서 진짜 새삼스럽게 느낀건데 코드 한줄 한줄 작성하는게 너무 힘들더라.
특히 TDD를 해보려고 노력을 많이 했는데, 진짜진짜 어렵더라.


간단한 로직에 대한거는 테스트코드 작성이 어렵지 않았는데
도메인로직쪽의 테스트 코드는 좀 어렵더라..

로직이 짜여진 코드에 대한 테스트코드 작성은 어렵지 않은데,
아무것도 없는 상태에서 테스트코드 부터 작성을 한다는게 뭔가 좀 막막하더라.


ㅎ 그래서 TDD는 좀 내려놨다.

MVC패턴에 좀더 집중하고, 로직을 작성한 이후에 테스트 코드를 작성하는 방향으로 나갔다.


그리고 이것 저것 새롭게 공부한 부분에 대해서 적용을 해보려고 노력을 했다.

ParameterizedtestmethodSource를 공부한 내용을 테스트 코드에 적용해 볼 수 있었고,

지난주 스터디에서 정적팩토리메소드에대해 알게돼서 이부분도 적용을 해보았다.

 

그리고 enum을 적극적으로 활용해서 유지보수성을 높이는데 집중했다.
다른 부분보다 enum을 적극적으로 활용한 부분이 이번 과제를 작성하면서 가장 마음에 들긴 했다.
로또의 가격이나 번호 갯수나, 당첨기준 같은게 변경 된다면 enum에 적혀있는 상수값만 변경하면 되도록 코드를 작성했다.

 

고민한 부분

1. enum의 디렉토리 위치

enum 같은 경우는 디렉토리의 위치를 어디다 둬야 할지 굉장히 고민을 많이 했다.
결국엔 utils 디렉토리에 위치시키긴 했는데,
model에 두는게 맞는거 같기도 하고.. 아직까지도 좀 아리송 하긴한다.


물론 구글링을 해보긴 했는데 뭔가 명확하게 답을 얻어 낼 수가 없어서 혼자 좀 오래 고민을 했었다.
우테코 아고라에 올려서 의견을 한번 받아봐야겠다.

 

2. view에서 사용하는 메세지의 상수화

어차피 일회성으로 사용되는 메세지라 이걸 굳이 하드코딩이라고 생각을 해야되나 라는 싶은 생각이 들었다.
상수화를 하는 이유가, 재사용성이나 유지보수성을 높이기 위함인데 굳이 일회성으로 사용되는 값을 상수화를 할 필요가 없다고 느꼈다.


오히려 상수화를 하는게 더 사족 같은 느낌?
그래서 굳이 상수화를 진행하진 않았다.근데 하고나서 생각해보면 하는게 나았을려나 싶기도 하고...


돌이켜볼수록 자꾸 후회만 남는거 같기도 하고;;

3. NoSuchElementException

이거 뭔데...

우테코에서 점수체크용? 으로 만들어 둔 테스트코드를 돌려보는데
예외처리에서 자꾸 테스트를 통과하지 못했다.

테스트 실패했을 때 내 심경...

대체 왜 안되는 걸까 한참 고민을 했었다.


한참 고민을 하다가 결국 코드 여행을 떠나기로 했다.
우테코에서 만들어둔 테스트코드를 확인해봤다.


음.. 요구사항에는 분명 IllegalArgumentException을 발생시키고 프로그램을 종료하라고 돼있는데,
우테코에서 작성된 코드는 catch문에서 NoSuchElementException만 빠지게끔 처리가 되어있어서,
흐으음.... 그래서 IllegalArgumentException을 발생시키고 로그 찍고,
catch문에서 IllegalArgumentException를 캐치해서 에러메세지를 출력하고,
NoSuchElementException를 throw 했다.


이게 맞나 싶긴한데, 내 머리로는 이게 한계였음...
다른 방법으로 처리를 할 수 있을까 싶어서 이것저것 시도 해봣는데 결국 실패했다.
어렵더라 어려워.

 

그리고 예외에대한 공부를 좀 해야겠다 싶어서 공부한 내용을 블로그에 정리했었다.


어떤 의도가 있었을 거라고 생각은 하는데 이게 참 어렵더라.

https://kong-dev.tistory.com/190

 

[Java] 에러(Error)과 예외(Exception)

0. 목차 1. 개요 2. 오류 3. 예외 1. 개요 우테코 3주차 과제 수행 중 예외에 대한 공부의 필요성을 느끼고 책과 검색을 통해 알게된 내용을 정리해보려고 한다. JS만 거의 1년 가까이해서 뭔가 굉장

kong-dev.tistory.com

 

아 내코드의 리포는 아래에 있음

https://github.com/woowacourse-precourse/java-lotto/pull/297

 

[로또] 이동훈 미션 제출합니다. by green-kong · Pull Request #297 · woowacourse-precourse/java-lotto

 

github.com

 

소감

이래저래 고민이 많고 힘들긴 했는데,
그래도 진짜 재밌게 작업했다.


그리고 새로운걸 많이 시도해볼 수 있어서 재밌었다.
내일 진행될 스터디가 기대된다. 다른사람들은 어떻게 작업했을까 너무 궁금하다.


내가 실력만 된다면 다른사람들 리뷰해주세용 하고 올린 것들에
코드리뷰를 하고 싶다만 내 능력이 부족해서... ㅠㅠㅠ
너무 슬프다.


어느덧 이제 마지막 과제만 남았는데 아쉬움이 크다.
마지막 과제는 진짜 열과성을 다해서 아쉬움이 남지않게 해볼생각이다.


화이티잉


대머리 센세의 말을 마음 깊이 새겨놓자.

 

11월 16일 추가

와.. 나는 머저리일지도 모르겠다. 위에 예외처리에 대한 부분에 대해 계속 의문이 남아있던 상태였는데,

오늘 슬랙 보다가 깨달음 얻음

내가 처리를 잘못했다.

 

   public void generateLottoList(String lottoPrice) {
        try {
            int lottoPriceNumber = Converter.toIntFromString(lottoPrice);
            generateLotteries(lottoPriceNumber);
        } catch (IllegalArgumentException exception) {
            OutputView.printErrorMessage(exception.getMessage());
            throw new NoSuchElementException();
        }
    }

 

테스트 코드 통과를 위해 위의 코드로 처리를 했는데,

나 바본가봐 진짜...

 

 

저기서 저걸 저렇게 처리 해주는게 아니라.

// Services.java
public boolean generateLottoList(String lottoPrice) {
    try {
        int lottoPriceNumber = Converter.toIntFromString(lottoPrice);
        generateLotteries(lottoPriceNumber);
        return true;
    } catch (IllegalArgumentException exception) {
        OutputView.printErrorMessage(exception.getMessage());
        return false;
    }
}

// Controller.java
public void run() {
    if (!purchaseLotto()) {
        return;
    }

    printPurchaseResult();

    if(!setWinningNumber()) {
        return;
    }

    if(!setBonusNumber()) {
        return;
    }

    printResult();
    printProfitRate();
}

이런식으로 처리를 해줬어야 하는듯하다...

하하하하하핳

 

거 뭐 이미 지난거 어쩌겠나... 라고 말은 하는데 가슴에 사무치게 후회가 된다.

다음에 잘하면 되지.. 라는 말로 스스로를 위로해봐도 별로 위안이 안된다...

 

그냥 내가 너무 멍청해서 한심함...

 

너무 많이 생각한게 원인인가 싶기도 하다.

프로그램을 종료만하면 되는건데....

 

잘했다고 생각했는데 12시간만에 내스스로가 한심해졌다^^

과제 하나 남았는데.. 그건 좀 더 잘해봐야지...

 

잘못된 대로 두기 싫어서 수정해서 푸시하긴 했는데 어효 모르겠다..

뭐그래도 0점은 아니니까 다행인건가...

마지막 과제나 열심히 해봐야지....

728x90
728x90

댓글