controller
⎿ ProductController
⎿ MemberController
service
⎿ ProductService
⎿ MemberService
domain
⎿ Product
⎿ Member
...
프로젝트에 대한 이해도가 상대적으로 낮아도 패키지 구조만 보고 전체적인 구조를 파악할 수 있음
계층별 응집도가 높아짐
모듈 단위로 분리 시 어려움이 있음
도메인별 응집도가 낮음
규모가 커질 때는 패키지가 복잡해져서 구분이 어려워짐
product
⎿ controller
⎿ service
...
member
⎿ controller
⎿ service
...
모듈 단위로 분리하기 좋음
도메인별 응집도가 높아짐
유스케이스별로 세분화해서 표현 가능
애플리케이션의 전반적인 흐름을 한눈에 파악하기 어려움
어떤 도메인 패키지에 위치시킬지 명확하지 않을 경우 개발자별로 도메인을 구분하는 기준이 다를 수 있음
패키지 간에 순환 참조가 발생할 수 있음
계층형 구조를 선택하는 경우
- 규모가 작고 도메인의 개수가 적은 경우
- 복잡도가 낮고 제공하는 기능이 적어서 하나의 계층에 속하는 클래스 수가 적은 경우
- 제공하는 기능을 명확하게 분리하기 어려운 경우
- 모듈별로 분리할 일이 없는 작은 규모의 프로젝트일 경우
도메인형 구조를 선택하는 경우
- 규모가 크고, 도메인의 개수가 많은 경우
- 복잡도가 높고 제공하는 기능이 많아서 하나의 계층에 속하는 클래스 수가 많을 경우
- 제공하는 기능을 명확한 기준으로 분리할 수 있는 경우
- 모듈별로 별도 서비스로 나눠질 가능성이 있는 규모의 프로젝트일 경우
✨ 상황에 맞는 구조를 선택하는 것! 정답은 없다! ✨