Spring MVC 패턴기반의 애플리케이션에서는
관성적으로 Model & View & Controller 패키지를 만들고 시작하는 경우가 대부분이었다.
이번에 웹 애플리케이션을 새로 구성하면서 원래 흔히 알고있던 계층형 구조가 아닌 도메인구조가 있다는 것을 알게되어서 이번에 적용하면서 배워보는 글이다.
1. 계층형 구조
controller
⎿ ProductController
⎿ MemberController
⎿ CartController
service
⎿ ProductService
⎿ MemberService
⎿ CartService
dao
⎿ ProductDao
⎿ MemberDao
⎿ CartDao
domain (model)
⎿ Product
⎿ Member
⎿ Cart
일반적으로 배우기도 그렇고 알고있는 흔한 계층형 구조이다.
Web Layer : 사용자의 요청과 이에 대한 응답 반환의 전반적인 처리가 일어나는 영역
Service Layer : Web과 Repository 사이의 실질적인 애플리케이션 비지니스 로직이 일어나는 영역
Repository Layer : DB에 접근 및 통신하는 영역
- 계층형 구조의 장단점
- 장점
- 프로젝트 전반적인 이해도가 낮아도 패키지 구조만 보면 전체적인 구조를 파악할 수 있다.
- 계층이 나뉘어져있어 원하는 계층만 파악할 수 있다.
- 계층별 응집도가 높아진다.
- 단점
- 도메인별 응집도가 낮다 (패키지로 애플리케이션의 기능을 구분짓지 못한다)
- 도메인과 관련된 기능이 변경되었을 때 변경 범위가 크다.
- 하나의 도메인 흐름을 파악하고 싶을 때 모든 계층을 파악해야 하고, 하나의 패키지안의 여러 도메인이 섞여있다.
- 규모가 커지면 하나의 패키지 안에 여러클래스들이 모여서 구분이 어려워진다.
2. 도메인 구조
product
⎿ controller (or Api)
⎿ service (or application)
⎿ dao
⎿ dto
member
⎿ controller (or Api)
⎿ service (or application)
⎿ dao
⎿ dto
cart
⎿ controller (or Api)
⎿ service (or application)
⎿ dao
⎿ dto
도메인을 기준으로 패키지를 나눈 도메인 구조이다. (controller 를 api, service를 application으로 사용하는 곳도 있다)
해당 방식은 스프링 웹 계층에 주목하기보다는 도메인에 주목하는 구조이다. 이를 통해 각각의 도메인들은 관리에 있어서 계층형 방식보다 직관적이며, 서로 의존하는 코드가 없도록 설계하기 적합해서 코드의 재활용성이 향상된다.
또한, OOP관점에서 핵심이 되는 Entity 특성을 기반으로 패키징 하는 것이 해당 기술의 관점과 맞다는 생각이 들고 그래서 요즘 추세에 많이 사용하는 것 같다.
도메인 외의 util, config와 같이 global적인 것들은 도메인과 같은 계층의 global 패키지를 만들어 사용한다.
- 도메인 구조의 장단점
- 장점
- 도메인별 응집도가 높아진다.
- 도메인의 흐름을 파악하기 쉽고, 기능이 변경되었을 변경 범위가 적다.
- 서비스별로 세분화해서 표현이 가능하다.
- 단점
- 애플리케이션의 전반적인 흐름을 파악하기 어렵다.
- 개발자의 관점에 따라 어느 패키지에 둘지 애매한 클래스들이 존재한다. (즉, 설계자 영향을 받는다)
결론
계층형 구조
규모가 작고, 도메인이 적은 경우 적합
- 계층형 패키지 안에 클래스들이 구분이 안될만큼 많아질 경우가 적다.
- 애플리케이션 흐름 및 가독성이 상대적으로 좋다.
- 행위별로 클래스를 분리하는 경우가 적다.
- 도메인 변경이 일어나도 규모가 작고 도메인이 적은만큼 변경범위가 적다.
도메인형 구조
규모가 크고, 도메인이 많은 경우 적합
- 규모가 크고, 도메인이 많은 만큼 도메인의 응집도가 높은 것이 중요할 것이다.
- 규모가 큰 만큼 행위별로 클래스를 분리하는 경우가 존재하기 때문
Ref
https://ksh-coding.tistory.com/96
https://velog.io/@jsb100800/Spring-boot-directory-package
'Architecture' 카테고리의 다른 글
DB Sharding(샤딩) / Shard(샤드) - 분산DB (DB의 수평적 규모 확장) (0) | 2024.01.19 |
---|---|
로드밸런서 (Load Balancer)란 ? (0) | 2024.01.19 |