평소에도 항상 생각하고 고민하는 내용이 바로 패키지 구조다. 이 프로젝트에서도 막힌 부분이다. 나만 그런건가..? 🤔 일단 K님과 상의한 내용을 토대로 결정한 도메인형 구성에 대해서 내가 참고한 레퍼런스를 참고해 간략하게 정리해보자.
계층형 구조는 가장 일반적인 구조다.
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── config
│ │ ├── controller
│ │ ├── dao
│ │ ├── domain
│ │ ├── exception
│ │ └── service
│ └── resources
│ └── application.properties
도메인형 구조는 각 도메인별로 모아놓은 구조를 의미한다. 관련된 코드들이 응집해 있다는 점이 장점이지만 프로젝트에 대한 이해가 낮을 경우 전체적인 구조를 파악하기 힘들 수 있다는 점이 있다고 한다.
내가 참고한 블로그에 따르면 도메인 주도 개발 DDD, ORM, 객체지향 프로그래밍 등에서는 도메인형 구조가 더 적합하다고 한다.
└── 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
대략적으로 그린다면 다음과 같은 구조가 되지 않을까 싶다.
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── yousinsa
│ │ └── www
│ │ ├── User
│ │ │ ├── controller
│ │ │ │ ├── apis
│ │ │ │ │ ├── UserSignInRestController.java
│ │ │ │ │ └── UserSignUpRestController.java
│ │ │ │ ├── views
│ │ │ │ │ └── UserSignInViewController.java
│ │ │ │ └── dtos
│ │ │ │ └── LoginRequestDto.java
│ │ │ ├── service
│ │ │ │ ├── UserSignUpService.java
│ │ │ │ ├── UserSignUpServiceImpl.java
│ │ │ │ └── converter
│ │ │ │ └── LoginRequestConverter.java
│ │ │ ├── domain
│ │ │ │ ├── repository
│ │ │ │ │ ├── UserRepository.java
│ │ │ │ │ └── UserRepositoryImpl.java
│ │ │ │ └── entity
│ │ │ │ └── UserEntity.java
│ │ └── Store
│ └── resources
│ ├── application.yml
│ ├── application-dev.yml
│ ├── application-stage.yml
│ └── application-prod.yml