자바칩
[우아한테크코스 프리코스] 3주차 미션 진행 소감 본문
다른 사람들의 코드를 보면서 내 코드가 생각보다 부실했다는 것을 깨달았다.
다른 분들은 정말 사소한 기능도 여러 가지의 클래스와 메서드로 잘 나누었다.
MVC패턴을 주로 적용을 하였는데, 그것을 보고 나도 이번 미션부터 MVC 패턴을 적용하였다.
MVC 패턴이란 Controller가 Model과 View를 컨트롤하는 것이다.
Model과 View는 서로 모르는 존재가 되어야 한다.
비즈니스 로직을 Model에서 처리하고, 콘솔 입출력은 View에서 처리했다.
즉, Model은 백엔드가 되고 View는 프론트엔드가 된다.
그리고 Spring Boot 프로젝트에서 했듯이 계층을 Controller, Service, Repository로 나누었다.
Controller는 Model과 View의 흐름을 컨트롤하는 클래스이고,
Service는 Controller와 Repository의 중간 단계로서 비즈니스 로직을 처리하는 클래스이고,
Repository는 domain과 가장 근접한 클래스로, domain의 데이터의 저장소 클래스이다.
본격적인 Spring Framework 프로젝트에서만 MVC 패턴을 적용하다가 이번 미션같은 간단한 프로젝트에서 적용을 하려고 하니까 쉽게 할 수 있을 줄 알았는데, 오히려 그 반대였다.
프레임워크가 있었기 때문에 Model과 View의 계층을 나누는 것을 더욱 편리하게 하고 쉽게 구현할 수 있었던 것이었다.
아예 처음부터 내가 기능을 다 구현해야 한다고 생각하니까 쉽게 할 수 있을 줄 알았던 미션도 어려워졌다.
그래서 이번에 가장 중요한 기능 요구사항을 놓쳐버렸다......
예외가 발생하면 에러 메시지 출력 후 그 부분부터 다시 입력을 받았어야 했는데, 나는 그냥 예외만 던지고 끝내버렸다.
코드 리팩토링에만 매우 집중하다가 정작 중요한 기능 요구사항을 놓쳐버리는 어이없는 상황이 발생해버린 것이다.
이것을 언제 알았냐면 제출 1시간 30분 전에 알았다..
이미 테스트 코드 작성도 다 해서 조치를 하기가 힘들었다.
코드 품질도 중요하지만 가장 중요한 것은 요구사항이라는 것을 절대 잊지 말고 요구하는 기능을 꼼꼼히 봐야 겠다.
기능 요구사항은 놓쳤지만 코드 품질은 확실히 향상되었다.
저번 미션들보다 더욱 확실하게 모든 메서드와 클래스들이 단일 책임 원칙(SRP)을 지키도록 구성했다.
최대한 쪼갤 수 있을 때까지 잘게 쪼개었다.
아, 맞다. 가장 중요한 것이다.
금액은 BigInteger를 적용시키고 수익률은 BigDecimal을 적용시켰다.
돈 계산은 정말 중요한 계산이기 때문에 한 치의 오차도 발생하지 않는 BigInteger와 BigDecimal을 사용해야 한다고 배웠다.
약간이라도 오차가 나면 나중에 정말 큰 대참사가 발생할 수도 있기 때문이다.
사실 처음에는 그냥 long과 double로 하려고 했으나, 구입 금액을 30억으로 설정하고 프로그램을 돌려보니까 수익률이 계속 소수점 둘째자리까지 나오는 것이었다.
그래서 수익률을 BigDecimal로 수정하였다.
그리고 1000원을 구입하고 1등이 당첨되었을 때는 수익률이 2.E% 이렇게 떴는데, 이거도 근사치 문제였다는 것을 깨닫고 구입 금액도 BigInteger로 설정했다.
이렇게 한 이후 더이상 2.E%로는 뜨지 않고 20억.0%로 뜨는 것을 볼 수 있었다.
SRP원칙을 확실히 적용하고, MVC 패턴을 적용하고, BigInteger와 BigDecimal의 중요성을 확실하게 꺠달을 수 있었던 3주차였다.
아 맞다 또 중요한 것이 있다.
Spring은 Bean에서 자동으로 Singleton으로 관리하기 때문에 우리가 따로 설정을 하지 않아도 Service나 Repository를 호출하면 항상 같은 객체를 반환했지만, 이것은 Spring Framework가 아니니까 그렇지 않다.
그래서 도대체 왜 다른 데이터가 뜨는 걸까 생각해보다가, 한 클래스의 인스턴스 변수로 있는 lottoRepository에서 create했던 lotto를, 다른 클래스의 인스턴스 변수로 있는 lottoRepository는 서로 다른 객체니까 당연히 get이 안된다는 것을 깨달은 이후, 모든 클래스를 Singleton으로 만들었다.
Singleton의 중요성도 다시 한번 깨닫게 되는 주차였다.
생성자를 private으로 만들어서 캡슐화도 더욱 시킬 수 있었다.
내일이면 벌써 4주차 미션 시작인데, 미션을 하다 보니까 스스로 깨달은 것이 더욱 많아졌다.
다음에는 기능 요구사항을 더욱 꼼꼼히 보고 절대 놓치지 않을 것이다.
+
아 enum을 사용하라길래 1등, 2등, 3등, 4등, 5등만 enum으로 설정해놓고 상수는 클래스 따로 만들어서 public static final로 해놨는데..... 이걸 1, 2주차에 했던 것처럼 enum으로 할 걸 그랬다.
이게 2주차에 설정했던 enum 클래스인데 전까지는 enum 잘만 써놓고 왜 3주차와서는 거꾸로 했을까...........
(근데 사실 가독성 면에서는 상수 클래스가 낫긴함ㅋㅋ 그래서 상수는 enum으로 안쓴거임)
https://github.com/agi1004/java-lotto-7/tree/main
GitHub - agi1004/java-lotto-7
Contribute to agi1004/java-lotto-7 development by creating an account on GitHub.
github.com
'우아한테크코스 > 프리코스' 카테고리의 다른 글
[우아한테크코스 프리코스] 회고, 4주차 미션 진행 소감 (3) | 2024.11.12 |
---|---|
[우아한테크코스 프리코스] 코드리뷰를 처음으로 해본 소감 (0) | 2024.11.06 |
[우아한테크코스 프리코스] 회고, 2주차 미션 진행 소감 (4) | 2024.10.28 |
[우아한테크코스 프리코스] 1주차 미션 진행 소감 (1) | 2024.10.21 |
[우아한테크코스 프리코스] 1주차 미션 해결 과정 (부제: STS에서 dependencies가 인식이 되지 않는다면) (0) | 2024.10.19 |