[Springboot] directory 구조 : 계층형과 도메인형

유아 Yooa·2023년 5월 24일
2

Spring

목록 보기
6/18
post-thumbnail
post-custom-banner

Overview

지금까지의 나의 모든 Springboot 프로젝트는 계층형의 directory 구조를 고집해왔다. 사실 큰 이유는 없고 학부 당시 프로젝트에서 계층형으로 교수님이 진행하셨기 때문이 가장 컸다. 하지만 프로젝트 볼륨이 커지며 파일이 늘어날수록 내가 원하는 파일을 쉽게 찾을 수 없다는 단점을 느꼈고 이를 개선하고자 도메인형을 찾아보기 시작했다.

오늘은 계층형과 도메인형이 무엇인지를 함께 알아보고 장단점을 따져보자.


레이어 계층형

Springboot 프로젝트를 처음 생성하면 아무런 디렉토리 구조가 잡혀있지 않다.
그래서 사용자가 다양하게 내부 레이아웃을 구성할 수 있다.

보편적으로는 아래 같이 애플리케이션 아키텍처(MVC)를 기반으로 설계한다.

  • Controller : 사용자 요청과 이에 대한 응답 반환의 전반적인 처리가 일어나는 영역
  • Service : Cotroller와 Repository 사이에서 실질적인 애플리케이션 비즈니스 로직이 일어나는 영역
  • Repository : DB에 접근 및 통신하는 영역
ㄴsrc/main/java/com/example/demo
	ㄴ DemoApplication.java
    ㄴ controller
    ㄴ service
    ㄴ repository
    ㄴ domain
    ㄴ config

계층형 구조는 각 애플리케이션 계층을 대표하는 directory를 기준으로 코드가 구성된다.

  • 장점 : 전체 구조를 빠르게 파악할 수 있다.
  • 단점 : 하나의 디렉터리에 많은 class 파일이 모이게 된다. 모듈 단위로 분리 시에 어려움이 있다.

도메인형

스프렝 웹 계층에 주목하기 보다는 도메인에 주목하는 방식

ㄴsrc/main/java/com/example/demo
	ㄴ DemoApplication.java
    ㄴ domain
    	ㄴ user
          ㄴ controller
          ㄴ service
          ㄴ repository
          ㄴ domain
        ㄴ post
          ㄴ controller
          ㄴ service
          ㄴ repository
          ㄴ domain
    ㄴ global
    	ㄴ auth
        ㄴ common
        ㄴ config
  • 장점 : 각각의 도메인 별로 패키지 분리가 가능하여 계층혁 방식보다 관리가 직관적이고, 각각의 도메인들은 서로를 의존하는 코드가 없도록 설계하기 적합해서 코드의 재활용성이 향상된다.
  • 단점 : 프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어렵다.

domain

  • domain을 담당하는 directory

global

  • 프로젝트 전방위적으로 사용되는 객체들로 구성된다.
    • config : 스프링 각종 설정
    • common : 공통으로 사용되는 Value 객체들
    • auth : 인증/인가에 사용되는 설정

무엇이 더 나은가?

계층형을 실제로 프로젝트에서 사용하다보면 하나의 디렉토리에 너무 많은 클래스가 모이게 된다. 프로젝트 볼륨이 조금만 커지더라면 몇십개의 클래스들이 길게 나열되는 것이다. 이는 파악하기도 어렵고 이런 파일 관리에 오히려 더 많은 시간을 쏟게 된다.

도메인형을 적용하게 되면 관련 코드가 자연스럽게 하나의 디렉토리에 모이기 때문에 개발에도 훨씬 수월하다. 클래스명이라던가 변수 이름 등도 같은 도메인에서 빠르게 찾아보면서 공통화된 코드를 작성할 수 있다.

패키지 방식에서 '이렇게 해라'라고 정해진 답은 없지만 요즘의 추세에 따르면 도메인형으로 관리하는게 트렌드인 듯 하다. 실제로도 그게 편하고


ref
https://velog.io/@jsb100800/Spring-boot-directory-package
https://cheese10yun.github.io/spring-guide-directory/
https://hyeran-story.tistory.com/160

profile
기록이 주는 즐거움
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 8월 25일

계층형으로 가져가되 계층 내부적으로 도메인으로 분리하는 방법은 어떻게 생각하시나요?

1개의 답글