시작
3주차가 지나고 4주차가 왔습니다.
본론
4주차에서의 저의 목표는 객체의 상태접근과 클래스 분리가 주된 목표였습니다. 지난번 로또 구현에서는 아쉬운 부분이 많았습니다.
분명 클래스를 어느정도 나누엇다고 생각하였지만, MVC패턴에서 모델에서의 의존성이 너무 크다는 느낌을 받았습니다. 비즈니스 로직과 계산 로직들이 너무 혼합되어 있었다고 생각 하였고 객체의 로직에 대한 자세한 구현이 없었던 클래스도 또한 있었습니다. 이러한 저의 모습을 다시 한번 반성하고자 다시한번 몰입을 해보았습니다.
마지막 미션은 크리스마스 프로모션 이였습니다. 곧 다가오는 2023년 12월 크리스마스 프로모션 이벤트로 할인행사를 진행하는 것 이였습니다.
- 전체 이벤트 기간 : 크리스마스 디데이 할인을 제외한 다른 이벤트는 12/1 ~ 12/31 동안 적용
- 총 주문 금액이 10,000원 이상부터 이벤트 적용
- 음료만 주문시, 주문 할 수 없음
- 메뉴는 한번에 최대 20개 까지만 주문 가능
- 크리스마스 디데이 할인
- 12월 1일 ~ 12월 25일 까지
- 12월 1일 부터 1000원으로 시작해서 크리스마스가 다가올수록 날마다 할인 금액이 100원씩 증가
- 평일 할인
- 평일에는 디저트 메뉴 1개당 2,023원 할인
- 주말 할인
- 주말에는 메인 메뉴를 메뉴 1개당 2,023원 할인
- 특별 할인
- 매주 일요일과 크리스마스당일에는 총주문 금액에서 1,000원 할인
- 증정 이벤트
- 할인 전 총주문 금액이 12만원 이상일 때, 샴페인 1개 증정
- 혜택금액에 따른 12월 이벤트 배지 부여
- 총혜택 금액에 따라 이벤트 배지를 부여
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
- 5천원 이상 = 별
- 1만원 이상 = 트리
- 2만원 이상 = 산타
<애피타이저>
양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)
<메인>
티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)
<디저트>
초코케이크(15,000), 아이스크림(5,000)
<음료>
제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)
각 메뉴또한 정해져 있었습니다.
처음 구조를 생각했을때 거의 2일정도 구조를 생각했던 것 같습니다. 각 할인과 주문 그리고 기본적인 메뉴, 뱃지 까지 다양한 객체와 클래스를 고려해야 했습니다. 또한 요구사항에서 InputView와 OutputView의 파일을 나눠서 준것을 보아하니 view에 대한 것을 나눈거 같아서 MVC 패턴을 사용하자라고 마음을 먹었었습니다.
폴더구조
구조를 하루에서 이틀정도 생각하면서 마트에 장을 보러 갔었습니다. 결제를 하고 영수증을 받고 마트에서 나온순간 영수증을 딱 보는 순간 영수증에서 아이디어가 문득 떠올라 버린 것 이였습니다! 생각을 해보면 각 영수증에는 단가,수량,금액,제품이름,할인행사,포인트 등 많은 내역을 담고 있었고 이러한 내용들을 기반으로 실제 나의 구현에서 적용을 시켜보면 어떨까 싶었습니다.
+ src
+ constants
└ MenuConstants.js ------ 메뉴 항목과 가격 정보를 정의하는 상수. 메뉴 관련 데이터 관리
+ controllers
└ EventController.js ---- 게임의 전체 흐름을 제어하는 컨트롤러
+ models
└ Order.js ----- 주문 데이터를 관리하는 로직
└ Customer.js --- 고객 정보를 관리하는 모델 주로 뱃지 정보를 관리
└ Menu.js ----- 메누 정보를 관리하는 모델 기본적인 메뉴 항목과 가격정보를 관리
+ constants -- 각 폴더에대한 상수들을 담은 곳
+ services
└ DiscountService.js - 할인 로직을 관리하는 서비스, 다양한 할인 전략을 적용하고 할인 결과를 계산
└ OrderService.js - 주문 로직을 관리하는 서비스, 주문 생성 및 유효성 검증 담당
+ strategies
└ IDiscountStrategy.js -- 할인 전략 인터페이스(추상 클래스)를 정의
└ ChristmasDiscountStrategy.js -- 크리스마스 할인 로직
└ WeekdayDiscountStrategy.js -- 평일 할인 로직
└ WeekendDiscountStrategy.js -- 주말 할인 로직
└ SpecialDiscountStrategy.js -- 특별 할인 로직
└ GiftChampagneStrategy.js -- 증정 이벤트 로직
+ constants -- 각 폴더에대한 상수들을 담은 곳
+ utils
└ DateFormatter.js ------ 날짜 형식을 관리하는 유틸, 한국시간으로 날짜를 포맷팅 합니다.
+ views
└ InputView.js ---- 사용자 입력을 받는 뷰, 사용자로부터 데이터를 입력받는 인터페이스 역할
└ OutputView.js ---- 시스템의 출력을 처리하는 뷰, 사용자에게 정보를 표시하는 인터페이스 역할
+ constants -- 각 폴더에대한 상수들을 담은 곳
이번 구조에서는 각 클래스가 어떠한 역할을 가지고 있어야 하는지 다른 역할을 가지고 있는지를 중점으로 두고 폴더구조를 지난 3주차보다 더 개선시켰습니다.
첫번째로 보이는건 모델과 서비스 분리 입니다.
모델과 서비스 분리의 이유
첫번째 이유로는 단일 책임 원칙을 준수하기 위해서 입니다. 기존 모델에서는 데이터의 유효성 검증과 처리,계산 등을 많이 담고 있었습니다. 이는 확실히 잘못된 접근이라고 생각 하였으며 모델에서는 데이터와 관련된 로직만을 담당하고 그외 서비스 비즈니스 로직( 주문처리, 할인계산 )을 만들어 관리합니다. 이는 각 클래스의 책임이 명확해지고 후에 유지보수와 확장에 좀더 용이해집니다.
IDiscountStrategy 사용 이유
지난 2주차에서도 전략 패턴을 사용한 적 있습니다. 그 때 당시에는 자동차 움직임과 관련된 로직이였는데 Car클래스에서는 자동차의 움직임을 관리하는데 자동차가 움직이는 동작은 전략패턴으로 사용하였습니다. 그이유는 자동차는 자동차의 움직임만 관리하면 되는것이고 자동차가 어떻게 해서 앞으로 움직이는지 까지는 알아야할 필요가 없었던 것 이였습니다.
그러한 이유와 비슷하게 할인에 대해서도 전략패턴을 4주차에서도 적용을 시켰습니다. 하지만 지난 2주차에서 달라진 점이 하나 있습니다. 바로 IDiscountStrategy입니다. 이 IDiscountStrategy를 사용한 이유는 전략 패턴을 공부하면서 Javascript는 인터페이스를 언어 차원에서 지원하지 않기 때문에, 추상 클래스를 활용해 인터페이스와 유사한 역할을 하는 'IDiscountStrategy'를 구현하였습니다. 이는 각 할인이 일관된 메서드 시그니처를 갖도록 하여서 전략 간 일관된 사용법을 보장합니다.
상수 폴더 구조 선택 이유
또한 위에서는 constants파일이 없지만 각 폴더마다 constants폴더를 추가하였습니다. 기존에서는 constants안에 각 상수들을 담은 파일의 구조를 선호하였지만 막상 사용하는 곳이 정해져 있다보니 이부분을 개선시키고 싶었습니다. 이에 저는 각 폴더 내에 constants 폴더를 만들었습니다. 이러한 이유에는 각 폴더의 역할과 관련된 상수들을 해당 폴더 내에서 관리함으로써, 상수의 사용 목적과 컨텍스트를 명확하게 구분하고 싶었습니다. 예를들어 models 폴더내의 constants에는 모델과 관련된 상수들(데이터 형식 , 기본값 등) 을 view 폴더 내의 constants에서는 사용자 인터페이스와 관련된 상수들( 메시지 )을 저장합니다.
이러한 방식으로 각 영역별로 상수를 분리하여 관리함으로써, 해당 영역의 코드를 컴포넌트로 재사용한다고 할때 필요한 상수들을 쉽게 이동하거나 참조할 수 있는 이점이 생깁니다. 이는 코드의 모듈화와 재사용성을 증진시킵니다.
마무리 : 성장의 여정을 향해
1주차의 나와 4주차의 나는 어떨까?
이번 4주간의 여정은 제 스킬과 이해도에 깊이와 폭을 더해주었습니다. 1주차에 처음 코드를 작성했을 때와 비교해보면 4주차에 도달했을 때의 저는 확연히 다른 모습을 보였습니다.
초기 단계의 도전
처음에는 기본적인 자바스크립트 문법과 객체지향 프로그래밍의 개념에 어느정도 익숙해지려고 노력했습니다. 그 당시에는 코드를 구현하는 것 자체가 큰 도전이엿고, 코드의 구조나 디자인 패턴에 대한 고려는 상대적으로 후순위 였습니다.
점진적인 성장
주차가 진행될 수록, 저는 단순히 '작동하는 코드'를 넘어서 '잘 설계된 코드'를 작성하고자 하는 욕구가 커졋습니다. 디자인패턴 학습(도메인 주도 설계,MVC 패턴 등) 및 전략 패턴 구상을 이용한 유연한 구조 구축 추상 클래스를 활용한 전략의 구현 단위 테스트 개발 등 제가 코드를 바라보는 시각을 근본적으로 변화시켰습니다.
성장의 결실
4주차가 끝나고 나서의 저는 코드를 작성할 때 이제 단순히 기능 구현에 그치지 않고, 코드의 재사용성, 유지보수성, 확장성 등을 고려합니다. 이는 1주차에 비해 엄청난 성장이며, 저는 이러한 변화에 큰 자부심을 느낍니다.
P.S
이 글을 읽으시는 우아한테크코스 프리코스6기 참여자 분들도 1주차~ 4주차의코드를 돌이켜보면서 어떠한 몰입을 하면서 성장해 나아갔는지 확인하는 글이 되었으면 좋겠습니다. 감사합니다.
'우아한테크코스' 카테고리의 다른 글
우아한테크코스 6기 프리코스 3주차 회고 (3) | 2023.11.09 |
---|---|
우아한테크코스 6기 프리코스 2주차 회고 (0) | 2023.11.02 |
JEST 테스트결과를 HTML로 보여주자! (0) | 2023.11.02 |
우아한테크코스 6기 프리코스 1주차 회고 (0) | 2023.10.23 |