- src
- main
-java
- com
- example
- demo
- DemoApplication.java
- config
- controller
- dao
- domain
- exception
- service
- resources
- application.properties
계층형 구조는 각 계층을 대표하는 디렉터리를 기준으로 코드들이 구성된다.
✔️ 장점 vs 단점
- 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 같은 표현은 계층형보다 도메인형으로 표현했을 경우 훨씬 더 직관적이며 해당 도메인을 이해하는 것에도 효율적이다.
├── 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
├── 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 디렉터리에 위치 시키면 된다.
└── infra
├── email
└── sms
├── AmazonSmsClient.java
├── KtSmsClient.java
├── SmsClient.java
└── dto
└── SmsRequest.java
잘읽고갑니다