Spring 디렉터리 구조

LeeKyoungChang·2022년 6월 27일
1
post-thumbnail

📚 1. 디렉터리 구조

📖 A. 계층형

- src
	- main
		-java
			- com
				- example
					- demo
						- DemoApplication.java
						- config
						- controller
						- dao
						- domain
						- exception
						- service
		- resources
			- application.properties

계층형 구조는 각 계층을 대표하는 디렉터리를 기준으로 코드들이 구성된다.

✔️ 장점 vs 단점

  • 장점 : 해당 프로젝트에 이해가 상대적으로 낮아도 전체적인 구조를 빠르게 파악할 수 있다.
  • 단점 : 디렉터리에 클래스들이 너무 많이 모이게 된다.

 

📖 B. 도메인형

- src
	- main
		- java
			- com
				- example
					- demo
						- DemoApplication.java
						- coupon
							- controller
							- domain
							- exception
							- repository
							- service
						- member
							- controller
							- domain
							- exception
							- repository
							- service
						- order
							- controller
							- domain
							- exception
							- repository
							- service
		- resources
			- application.properties

도메인 디렉터리 기준으로 코드를 구성한다.

✔️ 장점 vs 단점
장점 : 관련된 코드들이 응집해 있다.
단점 : 프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어렵다.

 

📣 누가 더 좋을까?
도메인형이 더 좋은 구조다.
도메인 주도 개발, ORM, 객체지향 프로그래밍 등에서 도메인형 구조가 더 적합하다.
도메인 주도 개발에서 Root Aggregate 같은 표현은 계층형보다 도메인형으로 표현했을 경우 훨씬 더 직관적이며 해당 도메인을 이해하는 것에도 효율적이다.

 

 

📚 2. 도메인 구조

📖 A. Domain

├── domain  
│   ├── member  
│   │   ├── api  
│   │   │   └── MemberApi.java  
│   │   ├── application  
│   │   │   ├── MemberProfileService.java  
│   │   │   ├── MemberSearchService.java  
│   │   │   ├── MemberSignUpRestService.java  
│   │   │   └── MemberSignUpService.java  
│   │   ├── dao  
│   │   │   ├── MemberFindDao.java  
│   │   │   ├── MemberPredicateExecutor.java  
│   │   │   ├── MemberRepository.java  
│   │   │   ├── MemberSupportRepository.java  
│   │   │   └── MemberSupportRepositoryImpl.java  
│   │   ├── domain  
│   │   │   ├── Member.java  
│   │   │   └── ReferralCode.java  
│   │   ├── dto  
│   │   │   ├── MemberExistenceType.java  
│   │   │   ├── MemberProfileUpdate.java  
│   │   │   ├── MemberResponse.java  
│   │   │   └── SignUpRequest.java  
│   │   └── exception  
│   │  	 	├── EmailDuplicateException.java  
│   │   		├── EmailNotFoundException.java  
│   │   		└── MemberNotFoundException.java  
│   └── model  
│   	├── Address.java  
│   	├── Email.java  
│   	└── Name.java

model 디렉터리는 Domain Entity 객체들이 공통적으로 사용할 객체들로 구성된다. 대표적으로 Embeddable 객체, Enum 객체 등이 있다.

 

✔️ member 디렉터리

  • api : 컨트롤러 클래스들이 존재한다. 외부 rest api로 프로젝트를 구성하는 경우가 많으니 api라고 지칭했다. Controller 같은 경우에는 api라고 하는게 더 직관적이다.
  • domain : 도메인 엔티티에 대한 클래스로 구성된다. 특정 도메인에만 속하는 Embeddable, Enum 같은 클래스도 구성된다.
  • dto : Request, Respoonse 객체들로 구성된다.
  • exception : 해당 도메인이 발생시키는 Exception으로 구성된다.

 

✔️ application

  • application 디렉터리는 도메인 객체와 외부 영역을 연결해주는 파사드와 같은 역할을 주로 담당하는 클래스로 구성된다.
  • 대표적으로 데이터베이스 트랜잭션을 처리를 진행한다.

 

✔️ dao

  • repository와 비슷하다.
  • repository로 하지 않은 이유 : 조회 전용 구현체들이 많이 작성되는데 이러한 객체들은 DAO라는 표현이 더 직관적이라고 판단했다.

 

📖 B. global

├── global  
│   ├── common  
│   │   ├── request  
│   │   └── response  
│   │       └── Existence.java  
│   ├── config  
│   │   ├── SwaggerConfig.java  
│   │   ├── properties  
│   │   ├── resttemplate  
│   │   │   ├── RestTemplateClientHttpRequestInterceptor.java  
│   │   │   ├── RestTemplateConfig.java  
│   │   │   └── RestTemplateErrorHandler.java  
│   │   └── security  
│   ├── error  
│   │   ├── ErrorResponse.java  
│   │   ├── GlobalExceptionHandler.java  
│   │   └── exception  
│   │       ├── BusinessException.java  
│   │       ├── EntityNotFoundException.java  
│   │       ├── ErrorCode.java  
│   │       └── InvalidValueException.java  
│   └── util

global은 프로젝트 전방위적으로 사용되는 객체들로 구성된다.
global로 지정한 이유 : common, util, config 등 프로젝트 전체에서 사용되는 클래스들이 global이라는 디렉터리에 모여 있는 것이 좋다고 본 블로그 작성자께서 말씀해주셨다.

  • common : 공통으로 사용되는 Value 객체들로 구성된다. 페이징 처리를 위한 Request, 공통된 응답을 주는 Response 객체들이 있다.
  • config : 스프링 각종 설정들로 구성된다.
  • error : 예외 핸들링을 담당하는 클래스로 구성된다.
  • util : 유틸성 클래스들이 위치한다.

→ 그 밖에도 global 하게 설정하는 것들을 global 디렉터리에 위치 시키면 된다.

 

📖 C. infra

└── infra  
	├── email  
	└── sms  
		├── AmazonSmsClient.java  
		├── KtSmsClient.java  
		├── SmsClient.java  
		└── dto  
			└── SmsRequest.java
  • infra 디렉터리는 인프라스트럭처 관련된 코드들로 구성된다.
  • 인프라스트럭처는 대표적으로 이메일 알림, SMS 알림 등 외부 서비스에 대한 코드들이 존재한다.
  • 그러므로, domain, global에 속하지 않는다.
  • 인프라스트럭처는 대체성을 강하게 갔는다.
  • SMS 메시지를 보내는 클라이언트를 국내 사용자에게는 KT SMS, 해외 사용자에게는 Amazon SMS 클라이언트를 이용해서 보낼 수 있다.

 


참고 : https://cheese10yun.github.io/spring-guide-directory/

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

1개의 댓글

comment-user-thumbnail
2023년 12월 8일

잘읽고갑니다

답글 달기