개발을 할 때 디렉터리 구조를 설계하는 방법은 크게 두 가지로 나뉩니다. 계층형 디렉터리, 도메인형 디렉터리 2가지로 구성되는데, 저는 항상 계층형 디렉터리로 설계해 왔습니다.
각각의 디렉터리 구조에는 장, 단점이 있지만, 프로젝트 규모와 팀원들 협업 스타일에 알맞게 설계하는 것이 중요하다고 생각합니다.
이제 차근차근 알아보도록 하겠습니다.
1. 계층형 디렉토리 구조(Layered Directory Structure)
기능 또는 역할에 따라 코드를 계층별로 그룹화하는 방식을 계층형 디렉터리 구조라고 합니다.
- Web Layer: Client와의 요청을 받아 처리하는 역할 담당을 담당, 컨트롤러(Controller), 필터(Filter) 관련 클래스들이 위치하며, HTTP 요청을 처리하여 비즈니스 로직 수행을 담당하는 Service Layer로 전달합니다.
- Service Layer: Web Layer, Repository Layer 사이에서 비즈니스 로직을 담당하는 영역(@Transactional 어노테이션을 통해 연산 순서 보장)
- Repository Layer: DB나 다른 영속성 저장소와의 상호작용 담당(DAO(DB 접근 로직 & 비즈니스 로직 분리), JPA, ORM 기술과 함께 사용)
- DTOs: DTO는 데이터 전송 객체로서, Service와 Client 간의 데이터 교환에 사용됩니다. (Getter & Setter)
- Domain Model: 모든 사람이 동일한 관점에서 이해하고, 공유하기 위해 단순화한 것입니다.(Entity, Domain Service, VO로 구성)
계층형 디렉터리 구조의 장, 단점
장점
- 전체적인 구조를 빠르게 파악할 수 있습니다.
단점
- 각각의 디렉터리에 클래스들이 몰리게 되어 복잡해집니다.
2. 도메인형 디렉터리 구조(Domain-based Directory Structure)
도메인형 디렉터리 구조는 비즈니스 도메인 중심으로 코드를 그룹화하는 방식입니다. 각 도메인은 별도의 하위 디렉터리로 분할되며, 해당 도메인과 관련된 Controller, Service, Repository가 함께 위치합니다.
더불어, global 패키지에는 전역적으로 사용되는 클래스들이 포함되어 있습니다. 설정(config), 유틸리티(util), 전역 예외 처리(exception), 시스템 구축을 위한 인프라스트럭처(infra), 인증 및 인가(auth) 등으로 구성할 수 있습니다.
도메인형 디렉터리 구조의 장, 단점
장점
- 도메인별로 패키지 분리가 되어있기에 코드의 응집도가 높아질 뿐만 아니라, 각각의 도메인들은 서로를 의존하는 코드가 없도록 설계하기 때문에 코드의 유지보수성이 높아집니다.
- 더불어 새로운 기능 또는 도메인의 추가가 필요할 때, 해당 도메인에 대한 패키지를 확장하는 것만으로도 가능합니다. 이 말은 다른 영역에 영향을 주거나 기존 코드를 수정할 필요가 없게 됩니다.(도메인 간 의존적이지 않게 된다는 의미)
단점
- 전체적인 구조를 직관적으로 파악하기가 어렵습니다.
- 개발자의 관점에 따라 어느 패키지에 둘지 모호한 클래스들이 많습니다.
도메인형 디렉터리 구조와 계층형 디렉터리 구조에 대해 알아보았는데 이제 어떤 기준에 따라 패키지 구성을 할 지는 개발자의 관점에 따라 달라질 것 같다는 생각이 들었습니다.
이들을 선정하는 기준
- 프로젝트 규모: 프로젝트 규모가 클수록 도메인형 디렉터리가 적합, 각 도메인이 명확하게 분리되어 있어, 코드를 이해하고 관리하기 쉽기 때문입니다. 적고 단순한 프로젝트이면 계층형 디렉터리 구조가 적합
- 비즈니스 로직의 변화: 비즈니스 로직이 자주 변경되는 경우에는 도메인형 디렉터리가 적합, 그렇지 않은 경우에는 계층형 디렉터리가 적합
- 유지보수 및 확장성: 각각의 모듈 혹은 서비스가 서로 분리된 상태에서 개별적으로 확장되거나 수정될 필요가 있으면 도메인형 디렉터리 구조가 적합, 그렇지 않은 경우에는 계층형 디렉터리 구조가 적합
<참고 자료>
https://velog.io/@sunil1369/Spring-boot-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0
https://velog.io/@jsb100800/Spring-boot-directory-package
'Java > Spring' 카테고리의 다른 글
[Spring] Filter, Interceptor, ArgumentResolver (0) | 2023.10.15 |
---|---|
[Spring] Nginx를 이용하여 http(80 Port)로 들어오는 요청을 springboot(8080 Port)로 Redirect 시키기 (0) | 2023.09.27 |
[Spring] 재고 시스템으로 알아보는 동시성 이슈 해결 방법 (0) | 2023.09.19 |
[Spring] 동시성 이슈 및 해결 방안 (0) | 2023.09.12 |
[Spring] Spring AOP (0) | 2023.08.15 |