본문 바로가기
[Programming]/💻개념 정리

[아키텍처] 패키지 구조 - 계층형, 도메인형

by 원제트 2024. 2. 28.

❇️ Overview

Springboot로 졸업프로젝트를 하며, 책을 보고 따라했었기 때문에

패키지 구조에 다양한 형식이 있다는 사실을 모르고 무작정 도메인형으로 진행했었다!

 

최근에 계층형 구조도 있다는 사실을 알게 되고,

개념 정리 겸  패키지 구조에 대해 작성해본다.


 

🟩 계층형 구조

스프링 웹 계층을 대표하는 디렉터리를 기준으로 파일들이 모이는 구조

 

 

❓스프링 웹 계층이란

 

🔹 Web Layer

- 흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역

- 이외에도 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역

 

🔹 Service Layer

- @Service에 사용되는 서비스 영역

- 일반적으로 Controller와 Dao의 중간 영역에서 사용

- @Transacional이 사용되어야 하는 영역

 

🔹Repository Layer

- Database와 같이 데이터 저장소에 접근하는 영역

- 기존의 Dao(Data Access Object) 영역

 

🔹DTOs

- DTO(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체를 이야기하며, DTOs는 이들의 영역을 얘기함

- 예: 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등

 

🔹Domain Model

- 도메인이라 불리는 개발 대상을 모든사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것

- 예: 택시 앱의 [배차], [탑승], [요금]

- @Entity가 사용된 영역 역시 도메인 모델이라 이해하면 됨

- 다만, 무조건 데이터베이스의 테이블과 관계가 있어야만 하는 것은 아님. VO처럼 값 객체들도 이 영역에 해당하기 때문. 

 

*출처: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

 

 

 

이러한 각 계층들에는 Controller, Service, Repository 등과 같이

그 계층을 대표하는 다양한 클래스와 디렉터리가 존재하고,

이들을 기반으로 디렉터 구조를 패키징한 방식이 계층형 구조이다.

 

 

- 장점: 전체 구조를 빠르게 파악할 수 있다

- 단점: 하나의 디렉터리에 너무 많은 클래스들이 모이게 된다. 

 

 


🟩 도메인형 구조

각 도메인에 해당하는 디렉터리를 기준으로 파일들이 모이는 구조

 

❓도메인이란

게시글, 댓글, 회원, 정산, 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역

*출처: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

 

 

- 장점: 각각의 도메인 별로 패키지 분리가 가능하여 계층형 구조보다 관리가 직관적이다,

각각의 도메인들이 서로를 의존하는 코드가 없도록 설계하기 적합해 코드의 재활용성이 향상된다

- 단점: 프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어렵다

 

 

*프로젝트 전반적으로 사용되는 클래스들은(auth, config, error 등)

domain과 같은 레벨에서 global이라는 패키징 안에 구성한다.

 

 

참고로 내가 진행했던 프로젝트에서는 다음과 같은 도메인 구조를 이용했다.

확실히 관리가 직관적이었기에 용이했고, 전체적인 구조를 파악하기 좋았던 것 같다.

├─domain
│  ├─counseling
│  │  ├─controller
│  │  ├─dto
│  │  └─List
│  │  ├─entity
│  │  ├─repository
│  │  └─service
│  ├─mypage
│  │  ├─controller
│  │  ├─dto
│  │  └─service
│  ├─profiles
│  │  ├─controller
│  │  ├─dto
│  │  ├─entity
│  │  ├─repository
│  │  └─service
│  ├─surveys
│  │  ├─controller
│  │  ├─dto
│  │  ├─entity
│  │  ├─repository
│  │  └─service
│  └─user
│      ├─controller
│      ├─dto
│      ├─entity
│      ├─repository
│      └─service

'[Programming] > 💻개념 정리' 카테고리의 다른 글

conda 기본 명령어  (0) 2023.10.17
[Linux] 8080 포트번호(PID) 알아내서 죽이기  (0) 2023.10.12