우아한테크코스에서 진행하는 미션을 혼자 진행해보면서 나의 생각과 배운 것을 정리하는 글

[로또미션]

[내코드PR]

 

[로또 - 1단계] 미션 제출합니다. by changjun6518 · Pull Request #2 · changjun6518/java-lotto-1

안녕하세요! 😊 로또 미션을 구현해보았습니다! 🎓 구현하면서 조금이라도 궁금하고 의문이 들었던 생각들을 정리하고 코멘트에 남겼습니다! 피드백 주시면 저에게 큰 도움이 될 것 같습니다!

github.com

 


금액 단위를 검증하려는 메소드명 뭐로할까?

  • 별 생각없이 isValid~~로 작성했지만 boolean 변수 이름을 제대로 짓기 위한 컨벤션..? 이 있었다
  • is는 boolean 타입을 반환할 것이라는 생각을 들게하기 때문에 적절하지 않은 것 같다

Amount의 isValidDigit 들여쓰기 2칸 어떻게 해야할까?

  • 들여쓰기 제한을 1로 하고 싶어서 고민했는데 도저히 생각이 안났다..! 따로 함수를 분리해도 되는데 함수명을 어떻게 나눠줘야할지 또 나누는 게 좀 불필요하다는 느낌이 많이 들었다
  • 이 함수안에서만 국한되지 말고 amount를 String으로 받아올때 생기는 문제인데 애초에 Integer로 받아오게 되면 Digit인지 확인할 필요가 없다. 아니라면 컴파일 에러가 날 것이다

 


검증 함수를 만들때 반환타입을 boolean으로 하는지 아니면 void 로 하고 바로 throw new 날리는지?

    • 아무 생각없이 코딩하다가 예외처리를 어떻게 해야할지 의문이 들었다
    • 위 방식대로 조건문에 해당하면 throw new Exception()을 처리해줬다
    • 나중에는 같은 Exception끼리 묶고 Exception을 상속?받는 등 처리해서 예외처리에 네이밍을 해줄 수 있을 것 같다
    • 하나하나 예외처리 클래스를 생성해서 만드는지 ENUM을 활용하는지는 더 공부해봐야 겠다

InputView 에서 입력받는 라이브러리? 어떻게 사용했는가?

  • 입력 기능을 하는 Scanner 클래스를 한번만 생성해도 되니까 상수?처리를 해줬다
  • 변수명을 sc라고 했는데 SCANNER로 상수 컨벤션을 지켜야하는 사실을 알게되었다...이것도 해당하는 게 맞겠지?

예외처리 발생 테스트 코드 작성 어떻게 하지?

  • 요렇게!
  • Assertions.assertThrows(Exception.class, () -> )
  • () -> 는 예외가 발생하는 상황을 만들어주면 된다

전체적인 연결 기능은 기능목록을 작성하지 않는 걸까?

  • 이건 클래스마다 하나씩 단위 테스트 진행하면서 했는데 전체적인 클래스들의 연결 테스트는 이뤄지지 않고 또 어떻게 테스트를 해야할지 모르겠다
  • 지금 미션은 콘솔 미션이지만 웹에서는 이런 상황을 테스트하기 위해 RestAssured 라는 라이브러리?가 있다고 한다

멤버변수 생성 시점을 어디서 하는게 좋을까?

  • 정답은 없고 상황에 따라서 어떤 방식을 선택할지 다를 것 같은데
  • 최근에 공부한 토비의 스프링에서 인터페이스를 공부했는데 인터페이스를 통해 기능 구현에 대한 분리를 이뤄냈지만 어떤 클래스가 필요한지에 대한 관심을 분리하지 못하여 생기는 문제를 상위객체(클라이언트 객체)에서 생성해서 주입하면서 이 관심을 상위객체에게 넘겨버릴 수 있었다
  • 아무튼 지금 상황에서는 크게 중요하지 않지만 스프링 생태계로 넘어가면 보통 생성자를 통해 주입받는 형태로 사용하게 되지 않을까 싶다. 물론 그때도 이유와 근거는 명확한 게 좋겠지

 


Lotto 에서 랜덤넘버를 생성하고 중복되지 않으면 숫자를 넣는 함수명은?
Lotto 번호가 잘 생성됐는지 확인하고 싶은데...! 이 부분은 어떻게 테스트할까?

 

  • 로또는 모두 중복되지 않은 숫자인 걸 알고 있으니 addRandomNumber 또는 addNumber 정도만 해도 충분할 것 같다
  • 고민해보니 이 모든 고민과 컨벤션과 클린코드와 왜 좋은 코드를 만드려고 하는가에 대한 본질은 미래의 나와 다른 개발자가 내 코드를 다시 봤을때 보다 빠르게 이해하고 알아보기 쉽게 하기 위해서라는 걸 생각하게 됐다
  • 랜덤 번호 확인은 자바 라이브러리에서 제공하는 것이니 믿고 넘어가도 될 것 같다

밖에서 new 생성자를 만들어서 사용하는 게 좋을까?

  • 생성자와 정적 팩토리 메소드
  • 사실 이부분에서 정적 팩토리 메소드를 사용하는 장점이 없는 것 같다
  • 팩토리 메소드 패턴은 상위 하위 클래스가 있고 하위 클래스에서 생성 로직을 따로 구현하는 방식으로 알고 있다

Lotto 생성하는 로직을 static으로 generator를 빼주는게 왜 좋을까?

  • 이것도 Lotto에 생성 로직이 있는게 맞는가 라는 생각
  • 한번만 생성한 뒤로 Lotto안에 생성하는 메소드는 다시 안쓰이는데 불필요한 코드만 차지하는 느낌
  • 빼주는 것도,,, 나쁘지 않을 것 같다 더 많은 기능들이 추가된다면

Lotto 번호와 winning 번호 비교하는 로직을 만드는데 어떻게 하는게 좋을까?
Lotto에 compare 메서드 들여쓰기 2개 어떻게 풀어낼까?

  • 객체에 메세지를 보내면서 비교하도록 했다
  • 근데 메세지를 타고타고 많이 보내게 되면서 함수명도 똑같고 어떤 객체부터 최종 객체까지 메세지를 보내는 과정이 헷갈리는 문제가 생겼다
  • 이런 경우에는 getter로 타협해도 괜찮을 것 같다는 생각이 들었다
  • 다음에도 문제 생길때 고민해보자!
  • 두번째는 들여쓰기를 위해 함수분리해도 괜찮을 것 같다

주요 로직을 테스트 코드로 먼저 작성하고 프로덕션 영역에 옮겨 작성하는지?

  • 테스트 주도 개발은 테스트부터 작성하고 프로덕션 코드에 옮기고 불필요한 테스트 코드를 삭제하는 방식으로 진행할 것 같다...!
  • 아직 테스트 코드부터 작성하는 게 익숙하진 않다. 맞는건지도 잘 모르겠고!

Reward 에서 카운트와 일치하는 것 찾아주는 로직 어떻게 하지?
테스트가 잘 작동하는지 확인하려고 print문 잠시 넣어서 확인했다 더 좋은 방법이 없을까?

  • Reward enum에서 카운트 갯수를 메세지로 받으면 일치하는 enum을 반환해주는 메소드를 만들었다
  • 테스트 잘 동작하려는지 보려고 print 메소드를 임시로 만들었는데 콘솔이라 그런가 분명 방법이 있을텐데 더 찾아보자
  • 비교 결과 reward를 확인하고 싶어서 print를 한건데 상황 만들어서 상황에 따른 결과 reward가 맞는지 확인하면 될 것 같다

테스트 함수명 카멜케이스, 스네이크 케이스?

  • 카멜케이스 사용하는 것 같다!

getter를 사용하지 않기 위해서 객체에 메세지를 던지는데 서로 던지다보니 메서드 명이 일치해서 좀 헷갈리는 현상 발생

  • 아까 언급한 부분인데 winningnumber와 lotto와 비교하는 메소드인데 객체에 메세지를 넘겨주다보니 계속 해서 넘겨주게 되고 메소드명도 compare로 일치하니까 어디서 어떻게 넘어가는지 헷갈림
  • 사실 getter 써도 넘어가는 건 똑같은데 꺼내왔다는 의미로 생각하면 괜찮은데 compare는 어떨지..?
  • compare도 똑같은 거 같은데?? 단지 의존 관계라고 해야하나 그 부분이 헷갈린다

Result returnProfit 메서드 언제 기본형 타입쓰고 언제 래퍼 타입을 사용하는지?

  • Wrapper 클래스를 사용하는게 좋다는 글을 본 거 같은데.. 이건 코딩을 많이하고 다른 사람들 코드를 많이 보게 되면 저절로 알게 될 것 같은데
  • Wrapper 쓰면 컴파일 에러를 더 잘 잡아주지 않을까..? 똑같나..?
  • 추가적인 기능을 더 사용할 수 있다!!

OutputView 에서 Reward enum을 foreach 했을때 Reward.FAIL까지 출력되는 문제 발생

  • Enum의 foreach 인데 Stream을 활용해서 아주 깔끔하게 리팩토링했다..!

 


회고

우테코 4기 최종 탈락한 뒤로 혼자서라도 해야겠다는 생각에 무작정 미션을 진행해봤지만 성장하는 느낌이 들지 않았다

방법을 바꿔서 미션을 진행하면서 생기는 문제들을 모두 기록하고 스스로 고민해보자는 생각을 했고 git을 통해 나쁘지 않게 진행한 것 같다

그리고 꽤나 많은 걸 얻어가는 기분이다. 또 우테코 출신 많은 분들이 블로그로 회고를 잘 정리해둔 것을 참고하여 더 배워갈 점이 많았다.

근데 진행하면서 3주에서 4주정도 로또만 했는데 많은 시간한 것도 아니고 시간만 질질 끈 기분이다.

데드라인을 정하고 알차게 시간을 써야할 것 같다.

다음은 페어 매칭 프로그램 미션을 진행해볼까 한다.

참고

[참고한 우테코회고블로그]

+ Recent posts