안녕하세요. 3주 차는 건너뛰고 바로 4주 차로 왔습니다.

 

3주 차를 회고하지 않은 이유는 이전에 회고했던 내용이랑 크게 다르지 않았습니다.

 

4주 차는 생각보다 많이 어려웠습니다.

기능이 복잡하기보다는, 클래스 설계하고 테스트하기가 어려웠습니다.

 

과제 내용

간단하게 요약해서 설명드리겠습니다.

 

https://github.com/Danden1/java-christmas-6-Danden1

 

GitHub - Danden1/java-christmas-6-Danden1

Contribute to Danden1/java-christmas-6-Danden1 development by creating an account on GitHub.

github.com

자세한 문제 내용은 이를 참고해 주시면 되겠습니다.

 

12월에 메뉴를 시키면, 이를 할인해 주고 얼마만큼 할인되는지를 출력해 주는 과제입니다.

하지만 할인 전략이 매우 많습니다. 특별한 날(식당 지정)에 할인을 해주거나, 어떤 카테고리의 메뉴를 주말/평일 별로 할인을 다르게 해주는 등 전략이 매우 다양했습니다.

 

그리고 증정품을 주는 이벤트도 있는데, 증정품의 가격도 할인 가격으로 포함해서 출력을 해야 합니다.

(예를 들면, 샴페인을 증정했으면 샴페인의 가격만큼 할인되었다고 판단합니다.)

 

저는 이를 어떻게 설계할 지 고민이 많이 되었습니다.

 

클래스 설계

 

Menu 

우선 메뉴 카테고리 별로 메뉴판을 만들었습니다.

 

 

이런 식으로 구현했습니다. 

 

이렇게 하면 카테고리 별로 쉽게 관리할 수 있을 것이라고 생각했습니다.

그리고 MenuFinder는 메뉴 이름을 통해서 어떠한 메뉴의 무슨 음식인지 찾아줍니다.

 

Discounter

앞에서 설명드렸다시피, 할인 전략이 매우 다양합니다. 저는 그래서 이를 나눴습니다.

OrderRequestDto에는 메뉴 주문 시간과 메뉴 리스트들이 있습니다.

응답으로는 이렇게 할인 금액과 할인 이벤트 이름에 대한 정보를 가지고 있습니다.

 

이를 이용해서 이렇게 구현할 수 있습니다.

 

 

여기서 문제는 증정 할인이였습니다.

증정품의 가격도 할인으로 포함시키는 것이 문제였습니다.

 

 

그래서 ReseponseDto를 확장시켰습니다.

이런 식으로 했습니다. 만약 증정품이 없다면, 할인 금액이 0원인 것으로 했습니다. 이는 Optional을 활용했습니다.

 

그리고 이를 반환하도록 했습니다.

 

 

Order

주문에 관한 클래스입니다.

 

이런 식으로 구현했습니다. Discounter 목록들을 받고, 이를 활용해서 계산을 하게 됩니다.

만약 새로운 할인 전략이 추가되거나 제거되더라도 Order는 이에 관해 크게 상관이 없습니다.

이는 단위 테스트하기도 쉬워집니다.

 

 

이런 식으로 임의의 할인 전략을 만들고 이를 활용하면 됩니다.

 

이를 이용하여 Order 클래스를 테스트할 수 있습니다.

 

 

User

유저가 주문하면, 할인받은 금액에 따라서 배지를 설정해줘야 하는 기능도 있습니다.

이에 관한 클래스입니다.

 

이 부분도 앞의 Order처럼 테스트하기 쉽도록 DI를 이용했습니다.

이렇게 간단하게 할 수 있습니다.

 

즉, Order와 유저가 서로 분리되어 있습니다.

 

느낀 점

이번 과제를 하면서 많이 리팩터링을 했습니다. 테스트 코드를 구현하기 위해서 고치고 고치고 고치고... 를 반복했던 것 같습니다.

 

문제는 이렇게 하다 보니 시간이 부족했습니다. 제가 평일에는 직장을 다니다 보니, 시간이 많이 부족했습니다. 테스트 코드가 확실히 시간을 많이 잡아먹는다고 느꼈습니다. 장점이 있는 만큼 단점도 있는 법이죠.

경험이 많이 쌓이면 개발 속도는 빨라질 것이라고 믿습니다. 

(이를 위해 개발 동아리를 지원해보고 있는데, 쉽지 않네요...)

 

그리고 요구사항을 제대로 문서로 정리하지 않아서 몇몇 기능(메뉴 20개 이상 주문 불가, 10,000원 이하 주문 불가 등)이 빠졌습니다. 문서화를 꼼꼼하게 해야 될 필요성을 느꼈습니다.

귀찮다고 대충 하면 개발 단계에서 피보네요.

 

개발은 진짜 꼼꼼함이 중요한 것 같습니다.

 

 

 

전체적으로 작년보다 실력이 많이 늘어서 기분이 좋네요.

5기 때, 저랑 같이 참여하던 친구가 있습니다. 이 친구랑 5기 때도 서로 코드리뷰를 했었는데, 이번에도 진행했습니다.

실력이 많이 늘었다고 친구도 놀라워했습니다. 

 

앞으로 더 노력하는 개발자가 되어야겠네요.

반응형

+ Recent posts