└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── config
│ │ ├── controller
│ │ ├── dao
│ │ ├── domain
│ │ ├── exception
│ │ └── service
│ └── resources
│ └── application.properties
└── 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
최근 기술 동향
도메인 주도 개발, ORM, 객체지향 프로그래밍 등에서 도메인형 구조가 더 적합하다고 생각한다. 도메인 주도 개발에서 Root Aggregate 같은 표현은 계층형보다 도메인형으로 표현했을 경우 훨씬 더 직관적이며 해당 도메인을 이해하는 것에도 효율적이다.
도메인 주도 설계(Domain-Driven Design)란 무엇일까?
소프트웨어는, 사용자가 이해하고 원하는대로 목적에 맞게 사용할 수 있도록 하는 것이 최고의 목표가 되어야 한다.
DDD를 프로젝트에 반영하기 위해서는 기술보다 도메인이 더 높은 우선순위를 가져야하고, 어떤 문제를 하기 위해서는 항상 도메인을 먼저 고민하는 것을 필요로 한다. 그리고 그 도메인들을 바탕으로 설계(Design)하고 프로젝트에 지속적으로/반복적으로 반영하여 개발(Developemnt)한다.
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── spring
│ │ └── guide
│ │ ├── ApiApp.java
│ │ ├── SampleApi.java
│ │ ├── domain
│ │ │ ├── coupon
│ │ │ │ ├── api
│ │ │ │ ├── application
│ │ │ │ ├── dao
│ │ │ │ ├── domain
│ │ │ │ ├── dto
│ │ │ │ └── exception
│ │ │ ├── member
│ │ │ │ ├── api
│ │ │ │ ├── application
│ │ │ │ ├── dao
│ │ │ │ ├── domain
│ │ │ │ ├── dto
│ │ │ │ └── exception
│ │ │ └── model
│ │ │ ├── Address.java
│ │ │ ├── Email.java
│ │ │ └── Name.java
│ │ ├── global
│ │ │ ├── common
│ │ │ │ ├── request
│ │ │ │ └── response
│ │ │ ├── config
│ │ │ │ ├── SwaggerConfig.java
│ │ │ │ ├── properties
│ │ │ │ ├── resttemplate
│ │ │ │ └── security
│ │ │ ├── error
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ └── exception
│ │ │ └── util
│ │ └── infra
│ │ ├── email
│ │ └── sms
│ │ ├── AmazonSmsClient.java
│ │ ├── SmsClient.java
│ │ └── dto
│ └── resources
│ ├── application-dev.yml
│ ├── application-local.yml
│ ├── application-prod.yml
│ └── application.yml
├── 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
객체 등이 있습니다.├── 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
└── infra
├── email
└── sms
├── AmazonSmsClient.java
├── KtSmsClient.java
├── SmsClient.java
└── dto
└── SmsRequest.java