백엔드/Java

[우아한 남매들] 배달의 만족 KPT 회고

삐삐에스 2024. 7. 15. 16:51

 

 

민족...인 줄 알았겠지만 우리팀, 우아한 남매들은 배달의 "만족" 서비스를 만드는 프로젝트를 진행했다.

우아한 형제들의 배달의 민족 서비스를 레퍼런스로 하여 배달 서비스를 Java로 구현해보는 프로젝트였다.

이 프로젝트에서 우리가 핵심으로 둔 것은 세가지였다.

1. MVC 패턴 적용
2. 클린코드
3. Java의 객체 지향성 최대 활용

 

우리는 DDD 개발을 위해 도메인을 먼저 나눴다.

우리에게는 시간이 4일밖에 없었기 때문에 최소한의 기능만 구현하기로 했다.

 

User, Store, Menu, Order 이렇게 4개의 도메인으로 나누고 각 도메인 별로 패키지를 생성했다.

그리고 각 패키지 안에 MVC 패턴에 맞는 클래스들을 생성했다.

그래서 나온 우리의 패키지 및 클래스 구조는 아래와 같이 나왔다.

user
|- UserService
|- UserController
|- UserView
|- UserDAO
|- User
|- UserInfoTitle

store
|- StoreController
|- StoreService
|- StoreView
|- StoreDAO
|- StoreInit
|- Store
|- Category

menu
|- MenuController
|- MenuService
|- MenuView
|- MenuDAO
|- MenuInit
|- Menu

order
|- OrderController
|- OrderService
|- OrderView
|- OrderDAO
|- Order
|- OrderStatus

Main

 

우리는 따로 UI를 웹이나 앱으로 디자인하지 않았고, 콘솔에 출력하는 방식으로 진행했기 때문에 각 패키지마다 View Class를 두었다.

 

이번 프로젝트에서 나는 Main을 맡았다.

Main에는 main 메소드를 둬서 우리 프로젝트의 진입점으로 생각하고 설계했다.

또한 이 클래스에는 메인 분기점들을 설계하고 분기마다 각 패키지의 Controller를 호출했다.

 

이 프로젝트에서 느낀 점들을 바탕으로 KPT 회고를 해보려고 한다.


Keep

  • 도메인 별로 역할을 분담하여 개발 중에 분업이 확실했다.
  • Github에서 브랜치, 커밋 컨벤션과 PR, 코드리뷰 등의 협업 방식을 채택하여 원활한 협업을 할 수 있었다.
  • 고민 공유를 활발히 했다. 모르는 것이 있을 때 팀원들의 조언을 강구했다.
  • MVC패턴을 사용하고, 싱글톤 패턴을 사용하여, 데이터의 정합성을 지킴
  • 중재자 패턴을 사용하여 응집도를 높였다.
  • Main에서는 메소드 분리를 통해 각 메소드의 가독성도 높이고 SRP를 잘 지킬 수 있었다.

Problem

  • 테스트코드를 작성하지 않아, 도메인별로 개발시, 실제 동작하는지 확인할 수 없었다.
  • Main 클래스를 MVC로 나누지 않아서 진입점에 대한 경계가 모호해졌다.
    • 처음 진입점: View ⇒ 서비스 시작 시, 일단 비회원 화면을 보여준다. 그 후에 사용자의 선택에 따라 적절한 Controller로 분기가 넘어간다.(이 경우, View가 Controller를 부르는 방식으로 설계된다.)
    • 그 후 호출된 Controller에서는 유저 요청에 따라 적절한Model을 가져오고 View를 보여준다.(Controller ⇒View, Service 호출)
    • 처음 진입점: Controller ⇒ Main에서 분기 로직을 컨트롤러로 생각해야한다. 마치 api요청에 대한 응답.
  • Controller에서 여러 개의 Service를 접근하여 사용하면서 Controller 단에도 로직이 생겨버렸다.
  • Main에서는 분기에 대한 예외처리를 충분히 고려하지 않아 main 브랜치에 머지한 이후에 여러 에러 상황을 수정해야했다.

Try

  • 테스트 코드 작성한다.
  • 인터페이스도 설계해서 구현코드를 숨기고, 유지보수성 강화한다.
  • Main을 Controller와 View로 분리하여 진입점을 Controller로 설정한다.
  • Service에서 다른 도메인의 Service에 접근하거나 Service에서 다른 도메인의 DAO에 접근하여 Controller의 로직을 삭제한다.
  • 기능별로 발생 가능한 예외 상황을 리스트업하고 모두 예외 처리한다.

 


이번 프로젝트를 통해 Java의 객체 지향성을 최대로 활용해보려고 노력했다.

또 클린코드 원칙을 직접 내 코드에 반영해봤던 의미있는 미니 프로젝트였다.

앞으로도 객체 지향성과 클린코드 원칙을 잘 적용하여 개발해 나가야겠다!

반응형

'백엔드 > Java' 카테고리의 다른 글

기본중의 기본, 문자열 비교  (0) 2025.12.03
SOLID  (1) 2024.07.16
왜 내 주력언어는 JAVA일까?  (0) 2024.07.10
탁구 게임 KPT 회고  (0) 2024.07.10
비밀번호를 변경할 때, REST API 중에 PUT을 쓸까, PATCH를 쓸까?  (0) 2024.07.05