스프링

트러블 슈팅 구조

148june 2025. 4. 7. 19:25

# 계층형 구조 vs 도메인형 구조 비교

## ✅ 1. 계층형 구조 (Layered Architecture)

### 🔹 개념
- 기능(역할)을 기준으로 애플리케이션을 나누는 구조
- 일반적으로 아래와 같은 계층으로 구성:
  - Controller (요청 처리)
  - Service (비즈니스 로직)
  - Repository (데이터 접근)
  - Entity / DTO (모델, 데이터 전달)

### 📁 예시 디렉터리 구조

com.example.project
├── controller/
│ └── UserController.java
├── service/
│ └── UserService.java
├── repository/
│ └── UserRepository.java
├── entity/
│ └── User.java
└── dto/
└── UserDto.java


### ✅ 장점
- 단순하고 익숙한 구조
- 빠르게 개발 가능
- 역할이 명확하여 이해하기 쉬움

### ❌ 단점
- 도메인별 코드가 분산되어 응집도 낮음
- 협업 시 충돌이 자주 발생할 수 있음
- 프로젝트가 커질수록 유지보수 어려움

---

## ✅ 2. 도메인형 구조 (Domain-Centric Architecture)

### 🔹 개념
- 비즈니스 도메인(업무 영역)을 중심으로 구조를 구성
- 하나의 도메인 폴더에 관련된 모든 구성요소 포함
- 계층을 유지하면서도 도메인 단위로 응집도 높은 구조 설계

### 📁 예시 디렉터리 구조

com.example.project
└── user/
├── domain/
├── User.java
├── UserRepository.java
└── UserDomainService.java
├ application/
│ └── UserService.java
├ui/
│ └── UserController.java
├ infra/
│ └── JpaUserRepository.java
├dto/
├── UserRequestDto.java
└── UserResponseDto.java


### ✅ 장점
- 높은 응집도 (관련 로직이 한 폴더 안에 모임)
- 도메인 단위로 협업 가능 → 충돌 적음
- 유지보수, 테스트 용이
- 마이크로서비스 구조로의 확장 용이

### ❌ 단점
- 초반 설계 복잡도 ↑
- 작은 프로젝트에서는 과한 구조일 수 있음
- 익숙하지 않으면 진입장벽 있음

---

## 🔁 구조 비교 요약

| 항목 | 계층형 구조 | 도메인형 구조 |
|------|--------------|------------------|
| 기준 | 역할 중심 (기능 중심) | 도메인 중심 (업무 중심) |
| 구조 | 수평적 (Controller, Service 등) | 수직적 (User, Order 등 도메인 중심) |
| 코드 응집도 | 낮음 | 높음 |
| 협업 효율 | 낮음 (충돌 자주 발생) | 높음 (도메인 단위 분업 가능) |
| 유지보수 | 구조 커지면 복잡 | 구조가 커져도 관리 쉬움 |
| 테스트 | 단순 테스트 쉬움 | 도메인 단위 테스트 가능 |
| 추천 상황 | 단순 CRUD, 소규모 프로젝트 | 복잡한 로직, 협업 많은 대규모 프로젝트 |

---

## 🎯 결론

- **계층형 구조**는 빠르게 만들 수 있고 소규모 프로젝트나 CRUD 중심 로직에 적합하다.
- **도메인형 구조**는 도메인 응집도와 협업 효율을 높여주며, 복잡한 서비스나 대규모 팀 개발에 적합하다.