드디어 우테코 6기 프리코스 마지막 주차인 4주차 과제가 공개되었습니다.
똑같이 오후 3시에 메일로 받게 되었고 열정이 무르익은 시기인 만큼 모든 일주일을 쏟기 위해 바로 요구 사항부터 파악하기 시작하였습니다.
크리스마스 프로모션 과제는 실무에서 다른 부서로 부터 메일을 받고 요구 사항에 따라 개발을 진행하는 비지니스적인 과제입니다.
우테코 비즈니스팀에서 이벤트 메일을 보내왔고 크리스마스를 맞이하여 12월
한 달간 각종 물건들에 대해 할인을 하여 최대한 많은 고객을 끌어모아 일부는 새해 이벤트에도 참여하게 하는 것이 목표라고 합니다.
개발자 시점에서 필요한 정보는 어떤 값을 입력 받고 무엇을 계산한 뒤 출력해 줄지가 필요합니다.
방문할 날짜와 주문 내역을 입력 받고 검증한 뒤 구매 내역을 통해 여러 조건을 통해 혜택들을 받은 후 총 금액과 할인 금액 및 최종 결제 금액 등 영수증을 출력하는 프로그램을 만드는 것이 목표입니다.
주어진 README
를 보며 요구 조건을 파악한 후 코딩을 하는 것을 반복하면 시간 소비가 클 것 같아 미리 한눈에 보기 쉽게 정리하였습니다.
일반적인 할인 뿐만 아니라 특정 조건에 메뉴를 증정해주는 것도 있으며 혜택을 받은 총 금액에 따라 배지라는 것을 부여합니다.
그동안 진행하며 굳어진 MVC 패턴
으로 폴더 구조는 constant
, controller
, domain
, view
로써 정해진 것 같았고 익숙하기에 이번 과제를 시작할 때에도 기본 적으로 필요한 것을 빠르게 바로 만들 수 있었습니다.
이전 주차와는 다르게 private repository
로 만들어 서로의 코드를 볼 수 없도록 한 것 같습니다.
그리고 마지막 주차인 만큼 3주차와 비교했을 때 내용이 매우 많아졌습니다.
또한 과제 내용을 보고 느낀 것은 1 ~ 3 주차에 이전 기수의 프리코스 내용을 카피하여 깊게 공부하지 않았더라면 이번 주차의 내용을 보고 당황할 수도 있을 것이라는 생각이 들었습니다.
저는 1주차에 Application.java
파일 하나에 모든 코드를 다 넣는 것 부터 시작해서 MVC 패턴
, 일급컬렉션
, 함수형 인터페이스
, 제네릭
, Enum
, Record
, Test Code
등 많은 것을 사용하기 전과 후 모두 코드로 작성해보며 필요성을 몸소 느꼈고 어떨 때 사용하면 좋을지 감을 가질 수 있게 되었습니다.
만약 이전 기수 문제를 미리 풀어보며 그 기수가 작성한 코드를 보고 공부를 했거나 이번 프리코스 과제를 할 때 이전 코드를 통해 과제를 진행했더라면 이러한 감을 가질 수 없었을 것이고 요구 사항을 보았을 때 어디서 무엇을 쓰면 좋을지 확 떠오르지 않을 것 같은 느낌을 받았습니다.
과거 1주차에 과제를 임했던 제 마음과 현재 4주차 과제 임하는 마음을 비교해 보았을 때 어떻게 코드를 구성할지 머리속으로 생각하는 것이 확 달라진 것을 느끼며 우테코가 프리코스를 정말 잘 구성했고 우테코가 원하는 방식대로 과제에 임했다라고 생각이 듭니다.
여러 프로모션에 대한 상수 처리를 중점으로 시작을 해보았습니다.
제공된 정보들과 정리해둔 README
를 바탕으로 Enum
객체를 어떻게 구성하면 될지 생각하며 나중에 사용하기 편하도록 최대한 구성해보았습니다.
하나의 컨트롤러만 사용하게 될 것 같았고 함수명은 사용자에게 정보를 출력 해주는 부분을 notify~
, 입력을 받는 부분을 request~
로 통일하였습니다.
우선은 request
함수를 리턴 값을 void
로 하여 전체적인 틀만 구성해두었습니다.
오늘은 전체적인 틀 구성에 신경을 쓰고 방문 날짜 하나만 받고 나중을 위해 validate
과정을 거치는 함수만 만들어두었습니다.
빼빼로를 먹으며 열정 가득히 코딩하는 하루를 만들었습니다.
그동안 많은 도메인을 구성해보았기에 방문날짜 숫자를 의미하는 도메인 객체는 깔끔하고 간단하게 구성한 것이라고 생각합니다.
Record
를 사용하여 int
값을 넣어 생성자를 통해서나 string
값을 넣어 from
함수(Factory Method Pattern
) 를 통해서 객체를 만들 수 있도록 설계한 것이 제일 제가 생각하기에 일반적인 구성이라 판단하였습니다.
from
함수에서는 문자열이 숫자형 문자열인지 검증한 후 생성자에게 다음 검증과 객체 생성을 넘깁니다.
생성자에서는 특정 월(여기서는 12월)에 유효한 일수인지 체크합니다.
이번 과제에서도 마찬가지로 모든 기능들(함수들) 하나하나 마다 단위 테스트를 만들 계획이였습니다.
VisitingDay
객체 또한 모든 검증 과정에 유효하지 않은 값들이 잘 걸러지는지와 구현한 함수들이 올바르게 동작하는지에 대한 테스트 코드를 작성하였습니다.
증정 조건은 순수 구매 총 금액을 기준으로 하기에 바로 만들었고 이 시스템의 제대로된 첫 테스트를 작성할 수 있었습니다.
도메인 객체들을 어느정도 뼈대있도록 구성하게 되어 동작 과정의 중심에 있는 컨트롤러에서 또한 갈피가 확실히 잡혔습니다.
사용자에게 방문 날짜와 주문을 받는 것으로 시작하여 영수증을 출력하는 것 까지 Application.java
가 컨트롤러에 요청하여 실행하는 함수인 run()
은 처음 보는 사람도 어떻게 동작하는지 바로 알기 쉽도록 함수 이름을 request
와 notify
로 구성한 덕분에 가능했던 것 같습니다.
함수들의 인자 또한 딱 필요한 것들만 넘길 수 있도록 domain
객체들을 잘 구성했던 것이 바람직 하다 생각이 들었습니다.
모든 혜택들과 관련된 부분을 내부가 거대한 XmasPromotion
이라는 domain
객체에서 처리할 수 있도록 하였습니다.
XmasPromotion
이라는 domain
객체는 방문 날짜와 주문 내역을 토대로 모든 혜택을 계산한 후 OutputView
에게 넘겨줄 영수증 까지 문자열로 뽑아주는 역할을 하게될 텐데요, domain
폴더 내부에 promotion
폴더가 존재하는 이유까지 내년에도 있는 이벤트를 위한 코드 재사용성을 높여주는 장치를 만들기 위함 이였습니다.
과제에서 요구사항은 아니였지만 이전 주차의 코드 리뷰에서 다른 분들이 코드 재사용성 에 대해서도 생각하여 과제에 임하고 있다는 것을 파악하였고 이를 위해 이번 과제에서는 무엇을 할 수 있을까 보다가 과제 내용에 배지 라는 것이 존재했고 이는 다음 구매에서 유용하게 사용할 수 있는 고객의 등급과도 같은 역할을 한다는 것이 암시되었습니다.
1월에 진행하는 새해 이벤트가 있다면 12월의 고객이 가지고 있을 배지를 활용하여 NewYearPromotion
을 만들수도 있겠다 생각하였습니다.
NewYearPromotion
은 XmasPromotion
이 받는 2개의 인자뿐만 아니라 추후에 만들 Badge
라는 객체를 인자로 추가로 받아 총 3개의 인자로 구성하여 더 재미있는 헤택 시스템을 만들 수 있을 것이라 생각되었습니다.
오늘도 아침부터 자기 전까지 하루를 달려 흥미로운 코딩을 할 수 있었습니다.
내년을 맞이하여 새해 이벤트를 위해서 미리 재사용성이 높은 코드를 제작한다는 것도 굉장히 재미있던 요소였던 것 같습니다.
하루 열심히 하면 다음 날은 이상하게 조금 쉬고 싶게 되는 것인가 보네요..
어제 XmasPromotion
코드의 증정 메뉴 함수를 작성하며 앞으로 남은 것들을 어떻게 구성하고 코딩하면 될지 생각을 미리 해놓아서 그런지 오늘은 외출하여 고생한 저를 위해 맛있는 것도 먹고 노는 하루를 보내게 되었습니다.
영수증에 사용 될 제목만 추가하였습니다.
오늘은 이전에 생각해 놓았던 대로 마무리 코딩을 하여 모든 로직에 대한 결전을 치루는 날입니다.
이 프로그램의 핵심인 헤택을 담당하는 도메인 객체인 XmasPromotion
작성은 모두 마쳤습니다.
혜택 관련된 정보를 계산하는 함수 benefits()
, findMenuDiscount()
, findTotalDiscount()
, amountBenefits()
, amountAfterDiscount()
, badge()
를 모두 작성하여 최종적으로 영수증 문자열을 만들어주는 buildBenefitsAsString()
을 작성하여 Controller
에서 사용하도록 설계를 마무리하였습니다.
예시로 주어진 날짜와 메뉴를 넣어 4개의 혜택을 받는 테스트 를 진행한 결과 요구 사항에 맞도록 잘 구성하여 테스트를 통과할 수 있었습니다.
오늘은 제출이 시작되는 날입니다.
2주차 까지는 이 날에 제출하였지만 3주차에서는 제출 마감일인 수요일에 제출하였는데요, 이번 4주차 과제를 시작부터 굉장히 열심히 하였기에 오늘 마무리하여 제출할 수 있었습니다.
모든 것이 정상 동작 하지만 사실 도메인을 작성하면서 작성해야했던 단위 테스트들을 늦게서야 만들게 되었습니다.
그동안 최종 작동 여부를 먼저 빨리 보고 싶은 마음에 ApplicationTest
를 주로 작성하여 domain
단위가 아닌 입출력 단위의 테스트를 진행하였고 미뤄놓았던 숙제를 이제서야 하게 되었습니다.
최종적으로 37가지
의 테스트를 작성하였고 모든 케이스를 통과하였습니다.
과제의 내용이 아닌 추가로 코드 재사용성을 보여주기 위하여 새해 이벤트를 제작하려고 했습니다.
NewYearPromotion
을 제작하기 위해서는 기존 XmasPromotion
의 추상화가 필요했고 Promotion
이라는 abstract class
를 만들어 기존 XmasPromotion
이 지니는 모든 함수들을 옮겨오며 NewYearPromotion
에서 특별히 다르게 제작되어 공용으로 사용할 것 같은 함수들 3개만 추상 함수로 만들고 나머지 5개의 함수를 공통으로 사용하는 금액적은 부분을 구현으로 Promotion
추상 클래스를 생성하였습니다.
XmasPromotion
은 추상 클래스를 상속받아 3개의 함수를 기존에 사용하던 코드를 그대로 가져와 구현하여 코드의 길이도 100줄
이 넘었던 것이 100줄 아래로 짧아졌습니다.
우선 branch
를 새로 만들어 혼자 그냥 따로 공부하는 방식을 선택했습니다.
따로 ApplicationTest
에 테스트 코드를 추가하지는 않았으며 그냥 실행해서 값을 대입했을 때 잘 나오는지 확인하였습니다.
실행결과는 아래와 같았고 성공적이었습니다.
안녕하세요! 우테코 식당 1월 이벤트 플래너입니다.
1월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
5
주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
해산물파스타-1,제로콜라-1
1월 5일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!
<주문 메뉴>
해산물파스타 1개
제로콜라 1개
<할인 전 총주문 금액>
38,000원
<증정 메뉴>
제로콜라 1개
아이스크림 1개
<혜택 내역>
증정 이벤트: -8,000원
불금은 마셔: -1,024원
<총혜택 금액>
-9,024원
<할인 후 예상 결제 금액>
36,976원
<1월 이벤트 배지>
없음
이번 4주차 과제야 말로 정말 모든 것을 쏟아 부어 열정적으로 임한 최종 결과물이라고 생각됩니다.
매 주 제일 잘 했다고 생각이 들었는데 과제의 난이도와 학습량이 점차 증가하며 나오는 당연한 결과인 것 같습니다.
다른 분들의 코드 리뷰를 보면 정말 비지니스 로직처럼 java
를 엄청 잘 다루시는 분이 많던데 저는 그만큼을 못했다고 생각이 들깁 합니다.
그런 코드를 볼 때 마다 의기소침 해기지는 하지만 저의 1주차
와 4주차
코드를 비교해 보면 달랑 Applicaiton.java
하나에 모든 것을 적은 것과 MVC패턴
으로 구조화를 하여 나눈 후 추상클래스 까지 사용하여 재사용성을 높이는 등 4주 동안의 엄청난 변화가 있었기 때문에 굉장히 만족하는 프리코스 였습니다.
후회가 남지 않도록 최선을 다했기에 끝난 이 시점은 너무 후련하고 기분이 좋은 것 같습니다.