JAVA/Java

계층별, 기능별 패키지 구성

dodop 2021. 12. 12. 17:45

 

 

 

프로젝트를 진행하다 보면 패키지를 어떻게 구성할 것인가에 고민이 생긴다. 

프로젝트의 패키지 구성은 계층별, 기능별 구성으로 나눌 수 있다. 

 

 

 

계층별 구성

출처 구글

자바 계층을 나누자면 web layer, service layer, repository layer로 나뉠 수 있다. 

Web Layer (Presentation Layer) : 컨트롤러와 뷰 템플릿 영역으로 외부 요청과 응답에 관한 영역 

  • 여기서 사용자에게 보여지는 영역과 정보를 주고 받기 위해서 DTO를 사용 한다. 

Service Layer (Business Layer) : 도메인모델과 요청의 적합성 검증 및 트랜잭션 관리 (비지니스 로직 구현 파트는 아니다)

  • 상태와 행위를 갖는 Domain계층 에 메세지를 전달하는 역할을 수행한다. 
  • 프레젠테이션 영역과 데이터접근 영역이 직접적으로 통신하지 않도록 중간다리 역할을 해준다. 

Repository Layer (Data Access Layer) : DB와 직접적인 관계를 맺고 정보를 가져온다. 

 

 

├── 🗂backend
   ├── config

   ├── controller

   ├── service
   ├── domain
   ├── dto
   └──  repository

 

계층별로 나눈 프로젝트 패키지의 구조를 나타내면 위와 같다.

 

 

 

 

기능별 구성

 

클래스의 기능과 역할에 따라서 패키지를 구성하는 것이다. 예를 들어 User의 정보를 관여하는 패키지를 구성한다면, User패키지 안에 UserEntity, UserService, UserDTO, UserRepository가 포함되어 구성되게 된다. 프로젝트가 커질수록 패키지 안의 클래스 수가 증가하기 때문에 기능별 구성이 재사용성이 좋고 Package Principle을 잘 지키기는 이점이 있어 많이 사용된다. 

 

├── 🗂backend
   ├── common

   ├── user

    |   ├── User

    |   ├── UserController

    |   ├── UserService

    |   └── UserRepository

   └──  post

        ├── Post

        ├── PostController

        ├── PostService

        └── PostRepository

 

 

 

클린코드 작성을 위한 패키지 구성 (기능별 + 계층별)

 

클린코드를 작성하기 위해서 기능별, 계층별 구조를 모두 합하여 작성하는 방법도 존재한다. 

계층별로 나누고 기능별로 나누기 

├── 🗂backend
   ├── domain

    |   ├── user

    |    |   └──  User

    |   ├── post

    |    |   └──  Post

   └──  service

        ├── user

         |   └──  UserService

        ├── post

             └──  PostService

 

 

기능별로 나누고 계층별로 나누기 

├── 🗂backend
   ├── User

    |   ├── domain

    |    |   └──  User

    |   ├── service

    |    |   └──  UserService

   └──  Post

        ├── domain

         |   └──  Post

        ├── service

             └──  PostService

 

 

 

 

 

 

(참고한 사이트)

https://ssowonny.medium.com/package-by-feature-in-clean-architecture-projects-e14d25e3905e

 

Package by Feature in Clean Architecture Projects

It suggests using package by feature in your clean architecture projects.

ssowonny.medium.com

https://devlog-wjdrbs96.tistory.com/209https://sehun-kim.github.io/sehun/tdd/

 

[Spring] 스프링 웹 계층이란?

이번 글에서는 스프링은 어떤 계층이 존재하는지와 계층의 역할을 무엇인지, 프로젝트시 패키지를 어떻게 나누는 것이 좋은지에 대해 정리해보려 한다. 스프링의 계층은 Presentation Layer, Business,

devlog-wjdrbs96.tistory.com

https://sehun-kim.github.io/sehun/tdd/

 

[TDD] TDD의 기초개념을 알아보자

TDD 간 보기

sehun-kim.github.io

https://youngjinmo.github.io/2021/04/spring-web-layer/

 

스프링 웹 계층구조

스프링부트와 AWS로 혼자 구현하는 웹 서비스 책을 읽으며 프로젝트를 실습하던중, 정리해보면 좋을 부분인것 같아서 정리해보았다. Web Layer 컨트롤러와 뷰 템플릿 영역 외부 요청과 응답에 관한

youngjinmo.github.io

https://javaengine.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%98-%EA%B3%84%EC%B8%B5%EB%B3%84-%EA%B8%B0%EB%8A%A5%EB%B3%84-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0

 

스프링의 계층별, 기능별 패키지 구성하기

스프링의 계층별, 기능별 패키지 구성하기 자바 프로젝트를 진행하면 프로그래머들이, 여타 직장인들처럼 "오늘 점심메뉴는 뭘 먹을까?" 하듯 고민이 하는 부분이 한가지 있다. 물론 프로그래

javaengine.tistory.com

https://cheese10yun.github.io/spring-guide-directory/

 

Spring Guide - Directory - Yun Blog | 기술 블로그

Spring Guide - Directory - Yun Blog | 기술 블로그

cheese10yun.github.io