- 프리코스 경험 기반으로 관련된 분야의 미션을 설계하고 구현한다.
- 미션 주제는 자유롭게 정한다.
- 스스로 도전하고 싶은 목표를 설정하고, 그에 맞는 실행 계획을 세워 미션을 진행한다.
- 2주 동안 자료 조사, 기획, 실행 후 결과물을 제출한다.
지난 2일동안 나의 상황은 어떤 지 돌아보면서 이번 2주동안 어떤 도전을 하여 어떻게 성장하고 싶은 지를 생각해봤다.
미션 주제: 로또 웹 프로젝트
설명: 3주차에 진행했던 로또 프로젝트를 3주차 피드백을 적용하고 요구사항을 추가하여 스프링부트 웹프로젝트로 만들어본다. 나의 상황은 자바를 사용해서 백엔드를 구현해보는 것이 처음이고 이 언어에 대해서도 익숙하지 않은 상황이다. 디자인패턴이나 스프링부트 등에 대해서 배워본 적은 있으나 이를 실제로 사용해본 적은 없고 이번 프리코스를 통해 처음으로 MVC 패턴이라는 것을 미약하게나마 따라해봤다. 그래서 나는 이번 오픈 미션 기간동안 스프링부트를 도전해보고 로또 웹 페이지를 구현해볼 것 이다.
주제를 고른 이유: 어머니께서 평소 로또 사는 것을 즐기시고 당첨 번호들을 조합해서 자신만의 번호를 만드는 것도 자주 하신다. 그래서 나는 3주차 프로젝트에서 확장해서 랜덤으로 받은 번호가 마음에 들면 저장할 수 있고 자신이 조합한 번호도 추가할 수 있는 로또 리스트를 만들고 싶었다. 또한 수익률 통계 기능을 이용해서 주별 혹은 월별 통계를 내서 객관적인 수익을 볼 수 있게 하고 싶었다. 따라서 3주차 주제를 발전시켜보기로 결정했다.
추가할 요구사항:
1. 데이터베이스
- 랜덤 번호를 나만의 로또 리스트에 저장
- 내가 생성한 번호를 나만의 로또 리스트에 저장
2. 당첨
- 저장된 로또와 당첨 번호를 대조했을 때 결과 알려주기
- 금액과 당첨 결과를 통한 수익률 통계 조회 가능
3주차 미션과 같은 듯 다르지만 어떤 결과를 만들어 낼지 너무 떨리고 기대된다.
오늘내일은 3주차때 진행했던 미션을 3주차 피드백을 반영하고 확장할 프로젝트 요구사항을 적용해서 다시 한 번 구현해볼 것이다. 항상 main이 있는 애플리케이션에 모든 코드를 작성한 후에 작동을 하면 그때부터 패키지를 나누고 리팩토링을 시작했는데 이번에는 처음부터 나눠서 코드를 구현해볼 것이다.
"3주차 Lotto 엔진을 가져와서 새로운 도메인 객체를 설계"하는 것부터 시작이다!
그래서 처음으로 한 일은 스프링부트가 패키지를 어떻게 나누는 지 찾아보았다. 프리코스를 진행할 때에는 가장 사람들이 많이 사용하고 그냥 많이 들어본 MVC 패턴으로 모델, 뷰, 컨트롤러만 나누어서 해보았는데 이번에는 이후 스프링부트로 옮길 예정이니 처음부터 그것을 염두해서 구현하고싶었다.

- Application: 프로그램의 시작점
- Domain: 각 객체들이 들어가는 패키지
- Controller: 입력을 통해 전달받은 요청에 따라 객체에 알맞은 서비스를 연결하고 전달받은 결과를 뷰로 전달
- Service: 객체를 이용해 실제 요청을 처리
- View: 입출력에 관한 것들
- Exception: 예외 처리
- Repository: 데이터베이스 역할 (지금은 로또 관리 리스트를 이곳에서 관리하도록)
스프링에서 쓰이는 패키지에 따라서 역할을 나누어봤다. 지금까지 했던 것과 다른 점은 Repository가 추가되었다는 점이다. 그리고 아직 헷갈리는 점은 컨트롤러와 서비스를 분리하는 것과 객체는 어떤 역할을 하도록 구현해야하는 지이다.
우선 개념은 정리했으니 설계를 시작하였다. 3주차에는 시간에 쫒겨 패키지를 나눌 때 설계에 많은 시간을 쏟지 못하고 바로 구현하기 시작하느라 역할을 분리할 때 너무 헷갈리고 힘들었다. 그래서 이번에는 설계를 우선으로 하고 구현은 뒤에 하기로 결정했다.
우선 새롭게 추가한 기능들과 내가 만들 프로젝트에 대한 요구사항을 작성했다
1. 로또 번호 생성 (임시 생성)
- [ ] 1~45 범위의 중복 없는 6개 번호를 생성하여 사용자에게 보여준다.
- [ ] 사용자는 생성된 번호를 '2. 나만의 번호 리스트'에 저장할 수 있다.
- [ ] 사용자는 생성된 번호를 '3. 구매 번호 리스트'에 즉시 추가(구매)할 수 있다.
- [ ] 사용자는 마음에 들지 않으면 번호를 다시 생성할 수 있다.
2. 나만의 번호 리스트 (영구 저장)
- [ ] 사용자는 1~45 범위의 6개 번호를 수동으로 입력하여 '나만의 번호 리스트'에 저장할 수 있다.
- [ ] '1. 로또 번호 생성'에서 생성한 번호를 '나만의 번호 리스트'에 저장할 수 있다.
- [ ] 사용자는 '나만의 번호 리스트' 전체를 조회할 수 있다.
- [ ] 사용자는 '나만의 번호 리스트'에서 특정 번호를 '3. 구매 번호 리스트'로 복사(구매)할 수 있다.
- [ ] (스프링) 사용자는 '나만의 번호 리스트'에서 특정 번호를 삭제할 수 있다.
3. 구매 번호 리스트 (날짜별 저장)
- [ ] 사용자는 1~45 범위의 6개 번호를 수동으로 입력하여 '구매 번호 리스트'에 추가(구매)할 수 있다.
- [ ] '1. 로또 번호 생성' 또는 '2. 나만의 번호 리스트'의 번호를 '구매 번호 리스트'에 추가(구매)할 수 있다.
- [ ] '구매 번호 리스트'에 추가되는 모든 로또는 '구매 날짜(LocalDate)'를 필드로 가져야 한다.
- [ ] 사용자는 '이번 주'에 구매한 로또 리스트만 조회할 수 있다.
4. 당첨 결과 및 통계 (Statistics)
- [ ] 사용자는 특정 '주차(Week)'를 지정하여, 해당 주의 당첨 번호(6개)와 보너스 번호(1개)를 입력하고 저장할 수 있다.
- [ ] '통계 보기'를 요청하면, 사용자는 '주차'를 선택한다.
- [ ] 해당 주차의 (1)'구매 번호 리스트'와 (2)'당첨 번호'를 비교하여, 구매한 각 로또의 등수(1~5등, 꽝)를 계산한다. (3주차 LottoRank 재사용)
- [ ] 해당 주차의 총 구매 금액(예: 구매한 로또 수 * 1000)을 계산한다.
- [ ] 해당 주차의 총 당첨 금액을 계산한다.
- [ ] 총 구매 금액과 총 당첨 금액을 기준으로 '총수익률'을 계산하여 출력한다. (3주차 로직 재사용)
- [ ]S 당첨 내역(예: "3개 일치 (5,000원) - 1개")을 3주차 미션과 동일한 형식으로 출력한다.
5. 예외 처리 (Validation)
- [ ] 모든 로또 번호(수동, 당첨, 보너스)는 1~45 범위를 벗어날 경우 IllegalArgumentException을 발생시킨다.
- [ ] 모든 로또 번호는 6개가 아니거나 중복될 경우 IllegalArgumentException을 발생시킨다.
- [ ] 보너스 번호가 해당 주차 당첨 번호 6개와 중복될 경우 IllegalArgumentException을 발생시킨다.