🤔 계층형? 도메인형? 어떤 구조가 더 좋을까요?
규모 있는 프로젝트를 진행하다 보면 하나의 문제에 자주 부딪히게 됩니다. 바로 내가 맡은 기능의 코드를 찾기 어려워진다는 점입니다. 수많은 Service 중에서 UserService를 찾고, Domain 패키지 안에서 User 클래스를 다시 찾는 과정은 꽤 번거롭습니다.
이러한 불편함은 대부분 계층형 구조만 사용하는 데서 비롯된 문제입니다.
프로젝트의 디렉터리 구조는 개발 생산성과 유지보수성에 큰 영향을 미칩니다.
일반적으로 많이 사용되는 구조는 크게 두 가지로 나뉘는데, 바로 계층형 구조(Layered Architecture)와 도메인형 구조(Domain-Driven Design, DDD)입니다.
🗂️ 계층형 구조 (Layered Architecture)
계층형 구조는 애플리케이션을 기능(역할)별로 나누어 각 기능이 독립적으로 동작하도록 구성하는 방식입니다.
예를 들어, 모든 Controller는 controller 패키지에, Service는 service 패키지에 따로 넣는 식입니다.
com.example.projectname
├── controller
├── service
├── repository
├── domain
├── dto
├── config
└── exception
📚 패키지 설명
- controller: 사용자 요청을 처리하고 응답을 반환하는 역할
- service: 비즈니스 로직 처리
- repository: 데이터베이스와의 상호작용
- domain: 핵심 도메인 모델 정의
- dto: 데이터 전송 객체 정의
- config: 설정 관련 클래스
- exception: 커스텀 예외 클래스
👍 장점
- 레이어별 역할이 명확하여 코드의 가독성이 좋습니다.
- 중복 코드가 줄어들어 유지보수가 용이합니다.
👎 단점
- 규모가 커질수록 패키지가 복잡해지고,
- 기능별 코드 탐색이 어렵습니다.
🏷️ 도메인형 구조 (Domain-Driven Design, DDD)
도메인형 구조는 도메인(업무 영역)에 초점을 맞춰 코드를 구성하는 방식입니다.
즉, 관련된 기능들을 도메인 단위로 묶어놓는 것이죠. 예를 들어, 사용자 관련 코드는 user 패키지에, 제품 관련 코드는 product 패키지에 정리합니다.
com.example.projectname
├── user
│ ├── controller
│ ├── service
│ ├── repository
│ ├── domain
│ ├── dto
│ └── exception
├── product
│ ├── controller
│ ├── service
│ ├── repository
│ ├── domain
│ ├── dto
│ └── exception
└── config
📚 패키지 설명
1. user
- 사용자 도메인과 관련된 모든 클래스 포함
- 예: UserController.java, UserService.java, UserRepository.java, User.java, UserDTO.java, UserNotFoundException.java
2. product
- 제품 도메인 관련 클래스 포함
- 예: ProductController.java, ProductService.java, ProductRepository.java, Product.java, ProductDTO.java, ProductNotFoundException.java
👍 장점
- 특정 도메인의 코드를 한곳에 모아두기 때문에 코드 탐색이 쉽습니다.
- 도메인 단위로 개발/유지보수가 편리하며,
- 새로운 도메인을 추가할 때 기존 구조에 영향이 적습니다.
👎 단점
- 도메인 간의 의존성 관리가 어려워질 수 있고,
- 동일한 기능이 여러 도메인에 반복되면 중복 코드가 생길 수 있습니다.
🆚 계층형 vs 도메인형 구조 비교
| 구분 | 게층형 구조 | 도메인형 구조 |
| 구조 방식 | 기능별로 나눔 | 도메인별로 나눔 |
| 장점 | 역할이 명확하고 코드 중복이 적음 | 도메인별 모듈화로 독립성 높음 |
| 단점 | 대규모 프로젝트에서 복잡해짐 | 도메인 간 의존성 및 중복 우려 |
| 예시 | controller, service 등 기능 단위 | user, product 등 도메인 단위 |
🗒️ 결론
Spring Boot 프로젝트의 디렉터리 구조는 유지보수성과 확장성에 매우 중요한 요소입니다.
계층형 구조와 도메인형 구조는 각각의 장단점이 있으며, 프로젝트의 성격과 규모에 따라 적절하게 선택하는 것이 중요합니다.
- 작은 규모의 단순한 애플리케이션이라면,
→ 계층형 구조가 이해하기 쉽고 효율적입니다. - 대규모 프로젝트에서 여러 명이 협업한다면,
→ 도메인형 구조를 통해 모듈화된 개발과 관리가 가능합니다.
프로젝트의 목적과 팀 구성, 협업 방식 등을 고려하여 가장 알맞은 구조를 선택하시길 바랍니다.
'웹 개발 > 🍃 SpringBoot' 카테고리의 다른 글
| 배포시 spring-boot-devtools 비활성화 (1) | 2025.06.13 |
|---|---|
| findAll()에서 Optional<List<T>>를 쓰지 않아도 되는 이유 (1) | 2025.05.20 |
| SpringSecurity + JWT 에서 nginx health-check 요구시 문제 (0) | 2025.04.01 |
| Springboot | 생성자관련 어노테이션 (0) | 2025.03.13 |
| SpringBoot + MyBatis + Postgres 완전정복 (0) | 2025.03.11 |