728x90
반응형
프로젝트를 처음 생성하고 패키지 구조를 설계할때 고민이 될 경우가 있을 것이다. 난 처음에 무작정 도메인형으로 설계했었는데 계층형과 차이를 이해하고 그에 맞춰서 선택해보자.
도메인형 패키지 구조 (Domain-Driven Package Structure)
설명: 도메인형 패키지 구조는 애플리케이션의 도메인(비즈니스 로직)에 기반하여 패키지를 구성하는 방법입니다. 이 접근 방식은 도메인별로 관련된 클래스와 컴포넌트를 함께 묶어, 도메인에 관련된 모든 것을 동일한 패키지에 배치합니다.
특징:
- 도메인 중심: 애플리케이션의 도메인 또는 비즈니스 문제를 중심으로 패키지를 구분합니다.
- 비즈니스 로직 중심: 도메인별로 관련된 엔티티, 서비스, 리포지토리 등을 함께 묶어 관리합니다.
- 유지보수성: 도메인별로 패키지가 구성되어 있어 관련된 코드와 설정을 한 곳에서 관리할 수 있어 유지보수가 용이합니다.
com.example.application
│
├── customer
│ ├── Customer.java // 도메인 모델
│ ├── CustomerService.java // 도메인 서비스
│ ├── CustomerRepository.java // 도메인 리포지토리
│ └── CustomerController.java // 도메인 관련 API 컨트롤러
│
├── order
│ ├── Order.java // 도메인 모델
│ ├── OrderService.java // 도메인 서비스
│ ├── OrderRepository.java // 도메인 리포지토리
│ └── OrderController.java // 도메인 관련 API 컨트롤러
│
└── common
├── utils // 유틸리티 클래스
└── exceptions // 공통 예외 클래스
이런식으로 객체지향적 관점을 살려 도메인 형태로 구조를 설계하면 각 도메인별로 어떤 역할을 하는지 이해하고 유지보수가 용이하다. 하지만 도메인이 적을 경우에는 이러한 장점들을 잘 살리기 힘들다.
계층형 패키지 구조 (Layered Package Structure)
설명: 계층형 패키지 구조는 애플리케이션을 기능적인 계층으로 구분하여 패키지를 구성하는 방법입니다. 이 접근 방식은 애플리케이션의 기능을 계층별로 분리하여 패키지를 관리합니다.
특징:
- 계층 중심: 애플리케이션의 기능적 계층(예: 프레젠테이션, 서비스, 데이터 액세스)을 기준으로 패키지를 구분합니다.
- 명확한 책임 분리: 각 계층의 책임이 명확하게 분리되어 있어, 코드의 역할과 책임이 분명해집니다.
- 모듈화: 각 계층의 책임이 명확하게 구분되어 있어 모듈화와 재사용이 용이합니다.
com.example.application
│
├── controller
│ └── CustomerController.java // API 컨트롤러
│
├── service
│ └── CustomerService.java // 서비스 클래스
│
├── repository
│ └── CustomerRepository.java // 리포지토리 인터페이스
│
└── model
└── Customer.java // 도메인 모델
이렇게 하면 장점으로 각 계층별로 분리되어 이해하기가 쉽고 기능을 독립적으로 관리할 수 있다. 하지만 단점으로는 객체지향적으로 생각하기 힘들어지고 코드가 많아지면 관리하기 힘들다는 점이 있다.
DDD
추가로 내 멘토님은 도메인 주도 설계 (Domain-Driven Design, DDD)를 기반으로 설계를 하셨었는데
|-- presentation
|-- domain
|-- order
|-- member
|-- application
|-- order
|-- member
|-- infrastructure
이런식으로 계층을 관리함으로써
- 도메인 중심의 구조: 도메인 모델(domain)을 중심으로 패키지를 나누어 비즈니스 로직을 명확히 분리하고 관리할 수 있습니다.
- 계층 분리: 각 계층(presentation, application, infrastructure)의 책임이 명확히 분리되어 유지보수와 확장성이 용이합니다.
- 모듈화: 도메인별로 패키지가 나누어져 있어 관련된 코드가 함께 묶여 있어 응집성이 높아집니다.
- 유연성: infrastructure 패키지에서 기술적 세부 사항을 구현하여 도메인과 애플리케이션 로직을 기술적 세부 사항으로부터 분리할 수 있습니다.
ddd 설계할때는 이런식으로 도메인형을 바꿔서 관리할 수 있다는 점을 배웠다.
728x90
반응형
'백엔드' 카테고리의 다른 글
[DevOps] Docker와 Jenkins를 이용한 CI/CD 구축 (1) (1) | 2024.08.15 |
---|---|
[Spring Boot] JPA @Id 전략 (0) | 2024.08.15 |
[Spring Boot] IoC, DI, AOP 정리 (0) | 2024.08.11 |
[Spring Boot] Mapping 종류 (0) | 2024.08.11 |
자동차 경주 게임 - 객체지향 (2) | 2024.03.23 |