프로젝트 구조 잡기

최종윤·2023년 2월 1일
2

프로젝트

목록 보기
4/13

디렉토리 구조를 크게 계층형과 도메인형 2가지로 나눌 수 있다고 한다.
프로그래밍 공부 시작하면서 강의로 공부할때 계층형 구조로 프로젝트를 진행했는데,
졸업 프로젝트를 시작하면서 도메인형 구조로 설계된 프로젝트를 보게 되어 이건 어떤 구조인 것이지? DDD란 단어를 들어보긴 했는데 이건가? 의문이 들어 찾게 됐다.

계층형 구조

└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── config
│ │ ├── controller
│ │ ├── dao
│ │ ├── domain
│ │ ├── exception
│ │ └── service
│ └── resources
│ └── application.properties

도메인형 구조

└── 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
      │   │               │   │   └── resonse
      │   │               │   ├── 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 디렉터리에 들어가는 클래스는 controller, service, repository, domain, dto, exception가 있다.

global 디렉토리에는 프로젝트 전방위적으로 사용되는
common : 공통으로 사용되는 Value객체 {ex) 페이징 처리를 위한 Request, Response}
util, error 예외 핸들링, config등이 있습니다.

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

도메인 주도 설계(Domain-Driven Design)란 무엇일까?
소프트웨어는, 사용자가 이해하고 원하는대로 목적에 맞게 사용할 수 있도록 하는 것이 최고의 목표가 되어야 한다.
DDD를 프로젝트에 반영하기 위해서는 기술보다 도메인이 더 높은 우선순위를 가져야하고, 어떤 문제를 하기 위해서는 항상 도메인을 먼저 고민하는 것을 필요로 한다. 그리고 그 도메인들을 바탕으로 설계(Design)하고 프로젝트에 지속적으로/반복적으로 반영하여 개발(Developemnt)한다

프로젝트가 얼마나 커지면 도메인 주도 설계로 할까? 토이 프로젝트할 때는 계층형 구조로 하고,
여러 명이서 하면 작업 양이 많아질테니 도메인 주도 설계로 프로젝트 진행을 시작하는 것이
커질때를 대비하기도 하고 도메인 주도 설계를 경험해보고자 했다.

references

스프링 프로젝트 계층 구조 설계하기 (DDD)
http://gnujava.com/board/article_view.jsp?article_no=8641&menu_cd=58&idx_notice=NOTICE_FLAG+DESC%2C&board_no=37

Spring Guide - Directory 가이드
https://www.popit.kr/spring-guide-directory-%EA%B0%80%EC%9D%B4%EB%93%9C/

Spring boot 프로젝트 구조 잡기
https://jh-yoon.tistory.com/19

profile
https://github.com/jyzayu

0개의 댓글