초기 관리자 기능은 하나의 AdminController와 AdminService에서 처리하도록 구현하였다.
AdminController
↓
AdminService
├── 대시보드
├── 신고 관리
├── 회원 관리
├── 판매자 신청 관리
└── 상품 관리
관리자 기능이 추가되면서 하나의 Controller와 Service에 여러 도메인의 API와 비즈니스 로직이 집중되었다.
그 결과 특정 기능을 수정하기 위해 관련 없는 코드까지 함께 확인해야 했으며, 새로운 관리자 기능을 추가할 때 기존 클래스의 코드가 계속 증가하는 문제가 발생했다. 또한 Controller에서 여러 Service를 직접 의존하게 되면서 클래스 간 결합도 역시 높아졌다.
기능의 구분 없이 관리자 기능이라는 큰 범위만을 기준으로 Controller와 Service를 구성한 것이 원인이었다.
특히 각 기능이 서로 다른 책임을 가지고 있음에도 하나의 Service에서 회원, 신고, 상품 등의 비즈니스 로직을 모두 처리하고 있었다.
관리자 기능을 도메인별로 분리하여 각 기능이 독립적인 책임을 갖도록 구조를 변경하였다.
AdminMemberController → AdminMemberService
AdminReportController → AdminReportService
AdminSellerController → AdminSellerService
AdminProductController → AdminProductService
대시보드처럼 여러 도메인의 데이터를 하나의 응답으로 조합해야 하는 기능은 각 Service를 Controller에서 직접 호출하지 않고 AdminDashboardService가 조합하도록 구성하였다.
AdminDashboardController
↓
AdminDashboardService
┌────┼────┬────┐
↓ ↓ ↓ ↓
Member Report Seller Product
Service Service Service Service
이를 통해 Controller는 HTTP 요청과 응답 처리에 집중하고, 각 도메인의 비즈니스 로직은 해당 Service에서 담당하도록 책임을 분리하였다.
admin
├── dashboard
│ ├── AdminDashboardController
│ └── AdminDashboardService
│
├── member
│ ├── AdminMemberController
│ └── AdminMemberService
│
├── report
│ ├── AdminReportController
│ └── AdminReportService
│
├── seller
│ ├── AdminSellerController
│ └── AdminSellerService
│
└── product
├── AdminProductController
└── AdminProductService
이번 개선을 통해 단순히 클래스를 분리하는 것에 그치지 않고, 각 기능의 책임과 의존 관계를 기준으로 구조를 재설계하여 기능 확장에 대응하기 쉬운 구조로 개선하였다.