우아한 프리코스

[우아한 테크 코스]6기 프리코스 4주차 회고록

그zi운아이 2023. 11. 24. 11:20

프리코스 4주차 회고록

우아한형제들의 개발자 양성 프로젝트, 우아한테크코스의 프리코스를 경험하게 된 것은 정말 뜻 깊은 시간이었습니다. 이 프리코스를 통해 많은 것을 배우고 성장하는 기회를 얻었습니다. 아래에는 이 경험에서 얻은 교훈과 느낀 점, 그리고 부족한 부분을 솔직하게 정리해보겠습니다.

 

🚀 기능 요구 사항

이번 미션은 이메일 형식의 기능 요구 사항입니다. 문제를 구현하는 데 필요한 요구사항과 배경지식은 이메일 내용에 전부 담겨있으니, 꼼꼼하게 확인하고 필요하다면 주어진 문제의 내용을 통해 유추하고 스스로 판단해 구현해 주시면 됩니다. 문제의 모든 내용은 충분히 검토되었으며, 출제 의도를 담은 내용임을 알려드립니다.

보낸 사람: 비즈니스팀 <biz@woowacourse.io>
받는 사람: 개발팀 <dev@woowacourse.io>

제목: 12월 이벤트를 위한 개발 요청

안녕하세요. 비즈니스팀입니다!

다가오는 2023년 12월에 우테코 식당에서 1년 중 제일 큰 이벤트를 개최하려고 합니다.
12월을 위해 이벤트 예산을 넉넉히 확보해 두었으니, 예산은 걱정하지 마세요~

특별히 이번 12월 이벤트를 진행하기 위해서, 개발팀의 도움이 많이 필요합니다.
아래 메뉴와 달력 이미지를 보면서 12월 이벤트 계획과 요청 내용을 본격적으로 설명해 드릴게요.

메뉴

"<애피타이저>
양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)

<메인>
티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)

<디저트>
초코케이크(15,000), 아이스크림(5,000)

<음료>
제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)"
 

달력

이벤트 목표

  1. 중복된 할인과 증정을 허용해서, 고객들이 혜택을 많이 받는다는 것을 체감할 수 있게 하는 것
  2. 올해 12월에 지난 5년 중 최고의 판매 금액을 달성
  3. 12월 이벤트 참여 고객의 5%가 내년 1월 새해 이벤트에 재참여하는 것

12월 이벤트 계획

  • 크리스마스 디데이 할인
    • 이벤트 기간: 2023.12.1 ~ 2023.12.25
    • 1,000원으로 시작하여 크리스마스가 다가올수록 날마다 할인 금액이 100원씩 증가
    • 총주문 금액에서 해당 금액만큼 할인
      (e.g. 시작일인 12월 1일에 1,000원, 2일에 1,100원, ..., 25일엔 3,400원 할인)
  • 평일 할인(일요일~목요일): 평일에는 디저트 메뉴를 메뉴 1개당 2,023원 할인
  • 주말 할인(금요일, 토요일): 주말에는 메인 메뉴를 메뉴 1개당 2,023원 할인
  • 특별 할인: 이벤트 달력에 별이 있으면 총주문 금액에서 1,000원 할인
  • 증정 이벤트: 할인 전 총주문 금액이 12만 원 이상일 때, 샴페인 1개 증정
  • 이벤트 기간: '크리스마스 디데이 할인'을 제외한 다른 이벤트는 2023.12.1 ~ 2023.12.31 동안 적용

혜택 금액에 따른 12월 이벤트 배지 부여

  • 총혜택 금액에 따라 다른 이벤트 배지를 부여합니다. 이 배지는 2024 새해 이벤트에서 활용할 예정입니다. 배지에 따라 새해 이벤트 참여 시, 각각 다른 새해 선물을 증정할 예정입니다.
    • 5천 원 이상: 별
    • 1만 원 이상: 트리
    • 2만 원 이상: 산타

고객에게 안내할 이벤트 주의 사항

  • 총주문 금액 10,000원 이상부터 이벤트가 적용됩니다.
  • 음료만 주문 시, 주문할 수 없습니다.
  • 메뉴는 한 번에 최대 20개까지만 주문할 수 있습니다.
    (e.g. 시저샐러드-1, 티본스테이크-1, 크리스마스파스타-1, 제로콜라-3, 아이스크림-1의 총개수는 7개)

'12월 이벤트 플래너' 개발 요청 사항

  • 고객들이 식당에 방문할 날짜와 메뉴를 미리 선택하면 이벤트 플래너가 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여주기를 기대합니다.
  • 12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
    • 방문할 날짜는 1 이상 31 이하의 숫자로만 입력받아 주세요.
    • 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
    • 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
  • 주문하실 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
    • 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
    • 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
    • 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
    • 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
    • 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
  • 주문 메뉴의 출력 순서는 자유롭게 출력해 주세요.
  • 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 보여 주세요.
  • 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
  • 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액
  • 증정 메뉴
    • 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 보여 주세요.
  • 혜택 내역
    • 고객에게 적용된 이벤트 내역만 보여 주세요.
    • 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 보여 주세요.
    • 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력해주세요.
  • 이벤트 배지
    • 이벤트 배지가 부여되지 않는 경우, "없음"으로 보여 주세요.
  • 적용된 이벤트가 하나도 없는 경우는 아래 예시를 참고해 주세요.
"안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.
12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
26 
주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
타파스-1,제로콜라-1 
12월 26일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!
 
<주문 메뉴>
타파스 1개
제로콜라 1개

<할인 전 총주문 금액>
8,500원
 
<증정 메뉴>
없음
 
<혜택 내역>
없음
 
<총혜택 금액>
0원
 
<할인 후 예상 결제 금액>
8,500원
 
<12월 이벤트 배지>
없음"
 

기대하는 '12월 이벤트 플래너'의 예시 모습

"안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.
12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
3
주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
티본스테이크-1,바비큐립-1,초코케이크-2,제로콜라-1
12월 3일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!
 
<주문 메뉴>
티본스테이크 1개
바비큐립 1개
초코케이크 2개
제로콜라 1개
 
<할인 전 총주문 금액>
142,000원
 
<증정 메뉴>
샴페인 1개
 
<혜택 내역>
크리스마스 디데이 할인: -1,200원
평일 할인: -4,046원
특별 할인: -1,000원
증정 이벤트: -25,000원
 
<총혜택 금액>
-31,246원
 
<할인 후 예상 결제 금액>
135,754원
 
<12월 이벤트 배지>
산타"
 

회고록 

1. 컨트롤러와 서비스의 분리

이번 프로젝트에서 주로 집중한 부분은 아키텍처 설계와 코드 관리였습니다. 컨트롤러와 서비스 레이어 사이의 책임 분리에 중점을 두어 프로젝트의 구조를 명확하고 유지보수하기 쉽게 만드는 데 집중했습니다. 서비스 레이어를 통해 로직을 분리함으로써 코드의 복잡성을 줄이고 옳바른 책임을 주어 전체적인 품질을 향상시킬 수 있었습니다.

 

2. 결합도와 의존성 주입의 딜레마

할인 서비스에서 여러 정책을 사용하면서 결합도를 낮추기 위해 의존성 주입을 고려했습니다. 하지만, 이를 실제로 적용하려고 하니 매개변수가 과도하게 늘어나는 문제에 부딪혔습니다. 빌더 패턴을 도입해보려 했지만, 이 역시 모듈화 과정에서 매개변수 문제를 야기했습니다. 결국, 명시적으로 서비스 레이어를 구현하는 방향으로 가기로 결정했으나 이 선택이 최적인지 여전히 확신할 수 없습니다. 이는 앞으로도 계속 고민하고 탐색해야 할 부분입니다.

 

3.형상 관리와 커밋 전략의 고민

프로젝트의 형상 관리에 있어서는 특히 커밋 전략에 대해 많은 고민을 했습니다. 프로젝트 요구사항에 따라 개발 전에 기능을 명세하고, 그 기능 단위로 커밋을 하는 방식을 시도했습니다. 하지만 이러한 방식은 에러 추적과 코드 리뷰를 어렵게 만드는 문제점이 있지 않을까 하는 의문을 가지고 있습니다. 작은 단위의 커밋이 코드의 변화를 더 세밀하게 추적하고 관리하는 데 유리하다고 생각하며, 이를 통해 더 효율적인 코드 리뷰와 에러 관리가 가능할 것으로 기대합니다. 형상관리에 대해 더 고민해야 되는 부분인거 같습니다.

 

4. 데이터 출력 방식의 고민

PlannerService에서의 출력 데이터 처리 방식에 대해 깊이 고민했습니다. 서비스에서 모든 출력 형식에 따른 값을 OutputView로 넘길지, 아니면 필요한 객체를 넘겨서 OutputView에서 간단한 계산 로직을 처리할지를 두고 고민했습니다. 예를 들어, 총 가격을 출력하는 경우, Orders와 DiscountDtos를 넘겨서 OutputView에서 총 수익을 계산할지에 대한 결정이 필요했습니다. 최종적으로는 코드의 가독성을 위해 OutputView에 객체를 넘기고 간단한 계산 로직은 OutputView에서 처리하기로 결정했습니다. 이 방식도 정확한 해결방법을 찾지 못해서 추후 반복하면서 더 좋은 방법을 찾아야 될 것 같습니다.


프리코스를 통한 학습과 소감

  • 다양한 요구사항에 대한 적응과 구현
    각 주차별로 제시된 다양한 기능 요구 사항들은 저를 새로운 도전에 직면하게 했습니다. 숫자야구 게임부터 자동차 경주 게임, 로또 게임까지, 각기 다른 로직과 규칙을 이해하고 구현하는 과정은 제 프로그래밍 실력을 한 단계 업그레이드하는 계기가 되었습니다.
  • 객체지향적 설계와 클린 코드 작성에 대한 깊은 고민
    각 프로젝트를 진행하며 객체지향적 설계의 중요성을 깊이 깨달았습니다. 클래스와 메서드의 책임을 명확히 분리하고, 유지보수와 확장성을 고려한 코드를 작성하기 위해 노력했습니다. 또한, 우아한 테크 코스에서 제시한 코드 컨벤션을 준수하며 가독성 높은 코드를 작성하기 위해 애썼습니다.
  • 코드 리뷰를 통한 피드백과 성장
    매주 코드 리뷰를 통해 다른 참가자들과 멘토님들의 소중한 피드백을 받을 수 있었습니다. 이를 통해 제가 미처 발견하지 못한 코드의 문제점을 깨닫고, 다양한 관점에서 코드를 바라볼 수 있게 되었습니다. 이 과정에서의 학습은 제 프로그래밍 실력을 크게 향상시켰습니다.
  • 자기주도적 학습과 문제 해결 능력의 신장
    프리코스 기간 동안 마주한 다양한 문제들을 스스로 해결하면서, 저는 보다 자기주도적인 학습자가 되었습니다. 이를 통해 문제 해결 능력뿐만 아니라 새로운 지식을 습득하는 능력도 크게 향상되었습니다.

🌈 소감과 앞으로의 계획

우아한 테크 코스 프리코스는 제게 있어 단순한 코딩 연습을 넘어서 실력 향상과 개발자로서 성장하는 데 큰 도움이 되었습니다. 매주 새로운 도전과 끊임없는 학습을 통해, 저는 더 나은 소프트웨어 개발자로 한 걸음 나아갈 수 있었습니다. 앞으로도 배운 것들을 바탕으로 더 많은 프로젝트와 도전에 참여하며, 계속해서 성장하는 개발자가 되고자 합니다.

 

코드보기

https://dev-th.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F