클래스를 더 세분화하며
하나의 함수처럼 한 클래스가 하나의 역할을 하는 것을 보고 설렜다!!
🔆 이번 미션 마음가짐
지난주는 하나의 클래스에 몰아 쓰던 코드를 여러 개의 클래스에 나눠서 작성하는 것을 도전했었다. 그 과정에서 받았던 피드백들은 이런 것들이었다. '일급 컬렉션에 대해 공부하고 적용하면 더 깔끔할 거 같아요', 'main에는 run 함수만 두고, 따로 컨트롤러를 만들어보세요', '구체적인 구현 클래스보다 인터페이스를 사용해 보세요' 그리고 내가 피드백을 하면서 '정적 팩토리 메서드'에 대해서도 알게 되었다. 이러한 피드백들을 이번 미션에서 적용해 보고 싶었다.
🔆 일급 컬렉션 적용하기
Lotto 클래스의 number만 지역 변수로 갖고 있고, 변경하면 안 된다는 조건 덕분에 이를 일급 컬렉션으로 만들어 보려고 했다. 따라서 당첨 번호, 보너스 번호, 랜덤 로또 번호 등 모든 로또 번호를 모두 Lotto 객체로 생성하고, 로또 번호와 관련된 로직들(로또 번호와 당첨 번호의 매치 개수, 2등 당첨 유무 등)을 모두 Lotto 객체 안에 두어 로또 번호의 세부사항을 숨겼다. 외부 접근이 불가능해져 로또 번호를 더 안전하게 관리할 수 있었다.
🔆 팩토리 클래스 만들기
처음에는 등수별 매칭 개수를 담은 Map, 매칭 개수별 등수를 담은 Map, 등수별 상금을 담은 Map을 생성하여 모두 상수로 관리했는데, 가독성이 떨어져 복잡해졌다. 그래서 등수의 상태를 담는 RankInfo 객체를 생성하는 RankInfo 클래스를 만들었고, 이 고정된 불변 데이터를 다른 컴포넌트에서도 쉽게 접근하도록 RankInfoFactory라는 팩토리 클래스를 생성하였다. 이렇게 상태를 담는 객체로 생성하니, 데이터들의 관계 설정을 따로 해주지 않아도 돼서 로직이 단순해졌다. 그리고 여러 클래스에서 쉽게 사용할 수 있어서 가독성이 개선되었다.
🔆 스트림 사용해 보기
자바는 처음이라 복잡하게 느껴져 스트림을 마주할 때마다 자신이 없어 피하기만 했었다. 그러다가 저번 미션을 피드백하며 많은 분들이 스트림을 사용하신 것을 보고, 오히려 내 코드보다 더 가독성이 좋고 이해하기 쉽다는 것을 깨달았다. 따라서 이번에는 스트림을 따로 공부를 하며 작은 것부터 천천히 적용해 봤다.
🔆 BigDecimal 사용
1등 상금이 2,000,000,000원이 되면서 int의 범위(2,147,483,647)를 초과할 수도 있겠다 생각이 들었다. 찾아보던 중 BigDecimal 이 큰 수 계산에 적합하다는 것을 알게 되었다. 이를 적용하며 안전하게 큰 금액을 계산할 수 있었다.
🔆 유사 MVC 패턴 따르기
지난 피드백에 따라 클래스를 더 세분화하여 한 클래스에 하나의 책임만 갖게 하려고 노력하였다. 처음에는 많이 나누지 않았지만, 리팩토링을 하며 점차 MVC 패턴에 맞춰 코드가 정리되었다.
- Model (모델) 역할을 하는 domain 패키지의 model, calculator, factory, generator, 데이터 구조를 담는 RankInfo, Lotto 클래스, 비즈니스 로직을 담는 EarningRateCalculator, WinningAmountCalculator, WinningResultsCalculator 클래스
- View (뷰) 역할을 하는 view 패키지의 LottoInputView, LottoOutputView
- Controller (컨트롤러) 역할을 하는 controller 패키지의 LottoController
- Service (서비스) 역할을 하는 service 패키지의 LottoService
이렇게 나누고 보니 각 클래스가 딱 하나의 책임만 가지고 있어 뿌듯했다. 하나의 함수처럼 한 클래스가 하나의 역할을 하는 것을 보고 설레기까지 했다! 앞으로도 더 나은 MVC 패턴을 공부해 적용해 보고 싶다.
🔆 재사용성 있는 코드 작성
개발을 하면 할수록 재사용성 있는 코드가 진짜 유용한 코드라는 것을 느낀다. 그래서 비슷한 함수들은 공통 로직을 뽑아 하나의 함수로 작성하려고 노력했다. 예를 들어, 보너스 번호와 당첨 번호의 에러 메시지에는 비슷한 부분이 많았다. 따라서 두 개로 나눠 작성하는 것이 아닌, String.format으로 인자를 전달하여 하나의 함수에 각각의 메시지를 출력하도록 구현하였다. 이뿐만 아니라, 비슷한 코드들은 공통적으로 뽑아 재사용하려 노력했다.
🔆 최종 소감
이번 미션에서 그나마 코드 다운 코드를 작성한 것 같고, 내가 가진 실력에서 최선을 다했다고 자부할 수 있다. 어떤 피드백을 받고, 그로 인해 또 어떤 새로운 배움을 얻게 될지 기대가 크다. 빨리 12시가 되어 다른 분들의 코드를 분석하고, 내가 더 공부해야 할 방향을 잡아가며 함께 성장하고 싶다!!!!
💭 다음 미션에서 시도할 것!
1. 한 번에 커밋 하는 습관을 꼭 개선하기
2. 새로운 디자인 패턴을 공부하고 적용 가능하다면 적용하기
3. 내 실력 안에서 가독성과 재사용성을 높일 수 있는 방법을 더 찾아 적용하기
'💠프로젝트 및 경험 > 우테코 7기' 카테고리의 다른 글
[우테코 7기] 1차 합격자 발표, 최종 코테 결과,,,, (3) | 2024.12.30 |
---|---|
[우테코 7기] 백엔드 프리코스 4주 차 회고 (0) | 2024.11.11 |
[MVC 패턴] 로또 MVC 패턴을 이용하여 구현하기! (0) | 2024.11.04 |
[우테코 7기] 백엔드 프리코스 2주 차 회고 (1) | 2024.10.29 |
[TDD] 자동차 경주 TDD 방식으로 구현하기! (0) | 2024.10.28 |