0. 배경

스프링 부트로 개발을하면서 어떻게 하면 결합도는 낮추고 응집도는 높이는 코드를 짤 수 있을까 하는 고민을 한다. 프로젝트를 하면서 MVC 패턴을 이용하는 것은 익숙했다. 하지만 보다 좋은 설계에 대한 갈증 같은 것이 항상 있었다. 엔티티 간의 연관관계가 복잡해지고 참조 Depth가 깊어질 때마다 내가 하는 이 방식이 맞는건가 하는 생각이 자주 들곤 했다. 서비스가 비대해지는 것도 문제였지만 특히 서비스와 서비스가 서로 참조관계를 맺는 것도 불편했다.

또 서비스라고 부르기에는 좀 애매한데 그렇다고 서비스가 아니라고 하기는 좀 뭐한 기능 클래스들이 있었다. 예를 들어 다음과 같은 PaginationService이다. 이에 대해서도 적절한 네이밍을 설정하고 레이어를 맞춰주는 것이 힘들었다.

이에 대한 고민 중에 DDD 개발 방법론을 알게됐고 관련된 서적과 강의를 들으며 레이어를 좀 더 효율적으로 구성할 수 있다는 것을 알게 됐다.

좋은 구현이란 무엇일까?

다음의 사항을 만족해야 할 것이다.

결론적으로 높은 안정성과 확장성이다. 이를 실현함에 있어서 높은 의존성과 강한 결합도는 해롭다.

도메인 주도 설계 방식을 적용한 아키텍처는 순수 MVC보다 확실히 위의 좋은 구현 사항을 만족한다고 생각한다.

이를 실전에 적용하는 연습으로서 MVP로 개발한 간단한 프로젝트를 리팩토링해보았다.

1. 프로젝트 소개

제삼자물류 시스템에서 VOC가 발생하였을 때 이를 처리하기 위한 백엔드 로직을 구현한 어플리케이션이다. 도메인인 VOC를 중심으로 VOC 처리 로직 구현에 집중한 프로젝트였다.

(깃허브 링크 https://github.com/renechoi/timf-voc-task)

주요 기능과 시나리오는 다음과 같다.

주요 기능