모각코 하게 된 이유?
우테코 프리코스 끝나고 아직 자바의 기초와 클린코드가 부족하다고 생각해서 우테코 프리코스 슬랙에서 대전지역 모각코 스터디에 들어감. 일단은 코테 발표를 기다리면서 2주정도 할 것 같은데 그 이후에 일정은 잘모르겠지만 학교를 벗어나 대전에서 개발하는 사람 찾는 건 유니콘 같은 느낌이였는데 처음 만나봐서 신기했음. 배울 것도 매우 많음.
1주차
간단하게 목표 설정, 매주 주말 이틀 나와서 토요일엔 5시간 동안 우테코 전 기수들 문제 랜덤하게 골라서 풀고, 일요일엔 서로 코드리뷰 및 리팩터링하는 시간을 갖기로 함
2주차 첫 날
랜덤하게 문제를 골랐는데 우테코 자판기 미션이 걸렸다. getter 안쓰기에만 용쓰다 너무 코드 짤 때도 답답했고 애플리케이션 거의 다 만들고 나서 기초 로직이 잘못됐다는 걸 깨달았는데 바꾸면 전체를 다 바꿔야되서 테스트는 돌아가는데 남은 금액보다 잔돈이 더 클때 계산 로직이 없는 상태로 만들어서 PR까지 했다.
2주차 두번째 날
배열보단 컬렉션을 활용하기, getter 허용 범위를 늘리기, Enum 활용해 메시지, 매직넘버, 에러 관리하기, 함수는 한 가지 일만 하게 분리하기, 예외처리 복구 좀 더 이해하기 등이 있을 것 같다. 일단 기초 로직부터 잘못되어서 리팩터링보단 다른분들 코드리뷰에 집중하고 배워 갈 수 있을 것들을 찾았다.
일단 애플리케이션을 간략하게 설명하면
잔돈을 계산해주는 Change 클래스
상품 이름, 가격, 수량을 갖는 Product 클래스
Product 클래스의 리스트를 필드로 가지면서 상품구매, 수량확인, 최소가격을 알려주는 Shelf 클래스
Shelf 클래스와 Change 클래스를 필드로 갖는 VendingMachine 클래스
VedingMachine 클래스를 작동시키는 VendingMachine Controller 클래스로 이루어져있다.
- 잔돈 필드 변경
2. 잔돈보다 남은 금액이 크다면 동전 최저 개수를 주기 위해서 큰 동전 단위부터 까는 로직 추가
3. Product 클래스에 적절한 getter 추가로 인한 Product List를 필드로 가진 클래스 메서드 변경
최저 가격을 필드에서 product를 돌며 반환해주는 메서드로 바꿨고, 하나의 상품만 끝나면 종료되게 짰던 코드에서 모든 수량이 소진되었을 때 종료되게 로직을 바꿨다. 또 상품 구매시 해당 상품이 소진되었다면 예외처리를 추가했다.
- VendingMachine 클래스
상품구매가 일어날 때마다 잔돈의 상태를 바꿔주는 로직을 추가했다.
- Message, Error Message Enum 모음
Error Message 를 가져올 때 prefix로 [ERROR] 처리
6. inputView 예외처리 복구시에 재귀 처리
7. controller 메서드 별로 정리
느낀 점
아직 클래스별 책임 분리가 어렵고 이걸 생각하면서 설계를 하다보니 점점 더 꼬이는 느낌이 있는 것 같지만 일단 꼭 필요한 로직들을 생각한 후에 책임을 분리를 많이 해봐야할 것 같다. 또 필드를 갖기보다 현재 상태를 메서드로 반환해주는 식으로 리팩터링 진행하면서 바꿔봤는데 이럴 때 절실히 더 공부가 필요하다고 느끼는게 stream 활용이다. stream으로 찾은 객체를 Optional로 감싸서 반환해주는 것, OrElse OrElseGet의 차이는 무엇인지 등등 순수한 자바 애플리케이션을 짜보면서 빨간 줄을 없애기 위해 많은 걸 공부하면서 스프링 강의를 들을때와는 또다른 새로움을 느꼈는데 빠르게 내 것으로 만들고 싶다.