본문 바로가기
백엔드

[Spring Boot] 디렉터리 패키지 구조 - 도메인형, 계층형

by 육빔 2024. 8. 11.
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
반응형