Layer-based 구조 (계층별 구조)
com.example.app
├─ controller
│ ├─ UserController.java
│ └─ ProductController.java
├─ service
│ ├─ UserService.java
│ └─ ProductService.java
└─ dao
├─ UserDao.java
└─ ProductDao.java
- 장점
- 계층 책임이 명확함
- MVC 패턴과 직관적으로 매칭
- 단점
- 도메인 단위로 변경/확장하기 어렵고, 특정 기능 수정 시 여러 패키지를 오가야 할 수 있음
- 규모가 커지면 패키지 간 의존성 관리가 어려움
Feature/Domain-based 구조 (도메인별 구조)
com.example.app
├─ user
│ ├─ UserController.java
│ ├─ UserService.java
│ └─ UserDao.java
└─ product
├─ ProductController.java
├─ ProductService.java
└─ ProductDao.java
- 장점
- 특정 도메인 관련 코드가 한곳에 모여 있어 유지보수가 쉬움
- 마이크로서비스 구조나 모듈화에 유리
- 단점
- 공통 계층 코드가 중복될 수 있음
- 계층별 책임이 바로 안 보여 초반에는 구조 이해가 어려울 수 있음