[Spring Boot] 패키지 구조: 계층형 vs 도메인형

김찬미·2024년 7월 2일
0

Spring Boot

목록 보기
4/7
post-thumbnail

🤔 계층형? 도메인형? 그게 뭔데?

규모가 있는 프로젝트를 진행하다 보면 직면하게 되는 문제가 있다. 바로 내가 맡은 기능의 코드를 찾기가 까다롭다는 것이다. 수많은 ServiceUserService를 찾고, 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

  • 설명: 사용자 도메인과 관련된 모든 클래스가 포함된다.
  • 포함 클래스
    • controller/UserController.java
    • service/UserService.java
    • repository/UserRepository.java
    • domain/User.java
    • dto/UserDTO.java
    • exception/UserNotFoundException.java

2. product

  • 설명: 제품 도메인과 관련된 모든 클래스가 포함된다
  • 포함 클래스
    • controller/ProductController.java
    • service/ProductService.java
    • repository/ProductRepository.java
    • domain/Product.java
    • dto/ProductDTO.java
    • exception/ProductNotFoundException.java

👍 장점

  • 특정 도메인의 코드를 한 곳에 모아두기 때문에 코드 탐색이 쉽다.
  • 도메인 단위로 개발하고 유지보수하기 용이하다.
  • 새로운 도메인 추가 시 다른 곳에 영향을 주지 않는다.

👎 단점

  • 도메인 간의 의존성 관리가 어려울 수 있다.
  • 도메인 간 코드 중복이 발생할 수 있다.

🆚 계층형 vs 도메인형 차이점 비교

구분레이어형 구조도메인형 구조
구조기능별로 패키지를 나눔도메인별로 패키지를 나눔
장점각 레이어별로 역할이 명확각 도메인별로 모듈화가 잘 되어 있음
코드 중복이 줄어듦각 도메인의 독립성 유지
단점대규모 프로젝트에서 패키지가 복잡해짐코드 중복이 발생할 수 있음
도메인 간의 의존성이 높아질 수 있음도메인 간의 의존성 관리가 어려울 수 있음
예시controller, service, repositoryuser, product 등 도메인 단위로 나눔

🗒️ 결론

스프링 부트 프로젝트의 디렉터리 구조는 프로젝트의 유지보수성과 확장성에 중요한 역할을 한다. 레이어형 구조도메인형 구조는 각각의 장단점이 있으며, 프로젝트의 규모와 요구 사항에 따라 적절한 구조를 선택하는 것이 중요하다.

  • 레이어형 구조는 각 레이어별로 역할이 명확하고 코드 중복을 줄이는 데 유리하다. 작은 규모의 프로젝트나 단순한 애플리케이션에 적합하다.
  • 도메인형 구조는 모듈화가 잘 되어 있어 대규모 프로젝트에서 각 도메인의 독립성을 유지하고, 기능 단위로 개발과 유지보수가 용이하다. 협업에 유리하다.

따라서 혼자 미니 프로젝트를 개발하는 경우, 레이어형 구조를 선택하는 편이 좋고 대규모 프로젝트를 협업으로 진행하는 경우 도메인형 구조가 유리할 수 있다.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보