John's Code Journey

[패키지 구조] Spring 프로젝트, 도메인별 vs 계층형 어떤 게 더 좋을까? 본문

IT공부/Spring Boot

[패키지 구조] Spring 프로젝트, 도메인별 vs 계층형 어떤 게 더 좋을까?

Johnnnn 2025. 5. 21. 13:42
728x90

📦 스프링 프로젝트, 패키지 구조는 도메인별? 계층형?

Spring Boot로 프로젝트를 만들다 보면 꼭 고민하게 되는 것 중 하나가 패키지 구조이다.

“Controller는 controller에, Entity는 entity에… 이렇게 하면 되는 거 아닌가요?”

처음엔 그렇게 시작해도 괜찮지만, 프로젝트가 커질수록 이 구조가 불편해질 수 있음
그래서 오늘은 대표적인 두 가지 구조
✅ 계층형 구조(Layered Structure) 와
✅ 도메인별 구조(Domain-based Structure) 를 비교해서 정리해봄

 

🧱 1. 계층형 패키지 구조

🔍 구조 예시

com.example.project
├── controller
├── service
├── repository
├── dto
├── entity
└── config

📌 특징

  • 역할 중심으로 나눈 구조
  • 각각의 계층이 어떤 일을 하는지 명확함

✅ 장점

  • 초보자도 이해하기 쉽고 익숙함
  • 많은 예제, 강의, 튜토리얼에서 사용
  • 구조가 단순해서 빠르게 개발 시작 가능

❌ 단점

  • 기능 하나를 개발할 때 여러 폴더를 돌아다녀야 함
    → 유지보수가 점점 힘들어짐
  • 관련 코드가 분산되어 있어서 응집도가 떨어짐

🧩 2. 도메인(기능)별 패키지 구조

🔍 구조 예시

com.example.project
├── user
│   ├── UserController
│   ├── UserService
│   ├── UserRepository
│   ├── dto
│   └── User.java
├── schedule
│   ├── ScheduleController
│   ├── ScheduleService
│   ├── ScheduleRepository
│   ├── dto
│   └── Schedule.java
└── common
    ├── exception
    └── config

📌 특징

  • 기능(도메인) 단위로 묶은 구조
  • User, Schedule, Post 등 각 기능이 독립적으로 구성됨

✅ 장점

  • 관련 코드가 한 폴더에 모여 있어서 관리, 테스트, 유지보수 용이
  • 도메인별로 팀이 나뉘어 협업하기 좋음
  • 나중에 마이크로서비스 구조로 전환하기도 쉬움

❌ 단점

  • 처음 구조를 잡을 때 다소 복잡할 수 있음
  • 공통 로직이 중복되거나 위치가 애매할 수 있음

🆚 비교 정리

항목 계층형 구조 도메인별 구조
기준 역할(계층) 중심 기능(도메인) 중심
예시 controller, service 등 user, schedule 등
장점 익숙하고 단순함 응집도 높고 유지보수 쉬움
단점 관련 코드가 분산됨 설계 초기 어려움
추천 프로젝트 학습용, 소규모 실무, 대규모, 협업 프로젝트

🎯 어떤 구조를 써야 할까?

상황 추천 구조
스프링을 처음 배우는 중이라면 ✅ 계층형
개인 프로젝트지만 기능이 여러 개라면 🔄 계층형 → 도메인별로 점진적 전환
팀 프로젝트, 대규모 기능 추가 예정 ✅ 도메인별
추후 마이크로서비스 전환 고려 ✅ 도메인별

✏️ 마무리

작은 프로젝트일 땐 계층형이 편할 수 있지만,
프로젝트가 커질수록 도메인별 구조가 훨씬 유리합니다.

중요한 건 구조가 "정답"이 아니라
👉 "프로젝트와 팀에 맞는 방향을 선택하는 것" 이라는 점!

구조를 잘 잡으면 유지보수가 편하고,
나중에 기능 추가나 리팩토링할 때 진짜 큰 도움이 된다고 함 !!!