[Spring] SpringBoot 패키지 구조

SuIn Woo·2023년 1월 26일
16
post-thumbnail

Spring Boot 프로젝트 구조


                                 [그림1] 기본적인 Spring Boot 프로젝트 아키텍처

Spring Boot의 기본적인 프로젝트 아키텍처는 [그림1]과 같으며, 아키텍처에 사용되는 용어들을 알아보고 실제 프로젝트 작업시 패키지 구성 방법도 알아보려고 한다.

용어 정리

Controller

  • ClientService의 중간자 역할!

    Client에서 보낸 요청 URL에 따라 적절한 응답을 한다.
    이 때, Client(View)에서 Request Body에 담긴 데이터(DTO)를 Service에 넘겨주고, Service에서 처리하고 Response Body에 담겨 반환된 데이터(DTO)를 돌려주는 역할을 한다.

    나만의 정리!!!

    손님Client이 가게 직원Controller에게 김치볶음밥을 주문Request
    요리사가 만든 김치볶음밥Response을 사용자에게 전달

Service

  • Business Logic을 통한 데이터 가공자 역할!

    Client의 요청(request)에 대해 어떤 처리를 할지 결정하는 부분이다.
    한마디로 요청들어온 부분을 개발자가 어떻게 변환하여(가공하여) 다시 사용자에게 전달할지 결정하는 부분이다.

    나만의 정리!!!

    직원Controller가 전달해준 주문을 요리Service하여 다시 직원에게 전달

DAO(Repository)

  • 실제 DB에 접근하기 위한 객체!

    실제로 DB에 접근하여 데이터를 CRUD 하는 객체이다.
    Service와 DB를 연결해주는 역할을 하고 있으며, 인터페이스와 이에 대한 구현체를 만들어서 구현체에 CRUD관련 기능을 구현하고, 이를 DI(Dependency Injection) 해주는 방식으로 사용된다.

    DAO 패턴 vs Repository 패턴

    DAO(Data Access Object) 패턴은 Data Persistence의 추상화이며, 영구 데이터 저장소에 가까운 것으로 추정
    Repository 패턴은 객체의 상태를 관리하는 저장소로 추정되며, 영구 저장소가 아닌 객체의 상태를 관리하는 저장소
    DAO는 Repository를 사용하여 구현할 수 없지만, Repository는 DAO를 사용해 구현할 수 있음

Entity

  • DB 테이블에 대응하는 하나의 클래스!

    실제 DB의 테이블과 매칭될 핵심 클래스이다.
    최대한 외부에서 Entity 클래스의 Setter method를 사용하지 않도록 해당 클래스 안에서 필요한 logic을 구현해야한다. 이 때, Constructor(생성자) 또는 Builder를 사용한다.

DTO

  • 데이터 교환을 도와주는 우편물 상자 역할!

    DTO는 계층간 데이터 교환을 도와주는 객체이다.
    세부적인 로직을 갖고 있지 않은 순수한 데이터 객체라고 생각하면 된다. 오직 Getter/Setter method만 가지고 있으며, 계층간 데이터 교환시 사용한다.

    Entity 클래스와 DTO 클래스를 분리하는 이유

    DB와 View 사이의 역할 분리를 위해서이며 DTO는 순수하게 데이터를 담고 있다는 점이 Entity와 유사하지만, 목적 자체가 전달이므로 읽고, 쓰는 것이 모두 가능함
    JPA 사용시 Entity 객체는 단순히 데이터를 담는 객체 이상으로 DB와 중요한 역할을 하며 DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 다르게 Entity의 생명주기도 달라 분리하며 사용함

패키지 구조 종류

레이어 계층형


                                                [그림2] 레이어 계층형

  • 장점
    각 계층을 대표하는 디렉터리 기준으로 코드들이 구성되어 해당 프로젝트의 이해가 상대적으로 낮아도 전체적인 구조를 빠르게 파악할 수 있는 장점이 있다.

  • 단점
    디렉토리에 클래스들이 너무 많이 모이고, 모듈 단위로 분리 시 어려움이 존재한다.

도메인형


                                                 [그림3] 도메인형

  • 장점
    도메인 디렉터리 기준으로 코드를 구성하며 관련 코드들이 응집해 있으며 모듈 단위로 분리할 때 유리하다.

  • 단점
    프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어려우며 개발자의 성향에 따라 도메인을 구분하는 기준이 다를 수 있어 파일을 찾는데 어려움이 있을 수 있다.


결론

Spring 패키지 구조를 크게 레이어 계층형과 도메인형으로 나누어 알아봤지만 실제로 실무에서는 프로젝트가 성장함에 따라 프로젝트 구조도 유동적으로 변경할 수 있어야 하므로 프로젝트 진행 시 많은 고민을 통해 구조를 결정해야할 것 같다.


참고 자료

Spring-12-DAO-DTO-Entity와-스프링-패키지의-전체-구조
DAO와 Repository의 차이점
역할 분리를 위한 Entity, DTO 개념과 차이점
Spring Guide - Directory

5개의 댓글

comment-user-thumbnail
2023년 1월 27일

잘 읽었습니다!
스프링의 MVC 패턴만 대략 아는 정도였는데, 그런 패턴을 지키기 위해 패키지 구조가 어떻게 나뉘는지 알 수 있었네요.
다만, DTO가 초반부터 설명됐으면 더 이해하기 좋았을 것 같아요!
그리고 데이터를 다루는 DTO, DAO ,Entity 의 차이가 무엇일까요?

답글 달기
comment-user-thumbnail
2023년 1월 29일

개인적으로 스프링이 진입장벽(모르는 용어, 어려운 구조)이 높아 매번 이해하기가 어려웠는데, 이번 글을 읽고 나니 대략적으로 어떤 구조로 이루어져있는지 알 수 있을 것 같아요. 조만간 Spring에 대해 빠르게 배우는 시간을 가질 텐데 초장부터 헤매기 전에 이 글을 읽고 전체적인 구조를 파악하면 좋겠네요!
그런데 개인적으로 DAO, DTO에 대해서도 쉽고 현실적인 예시가 들어가 있으면 좋겠어요 살짝 어렵네요ㅎㅎ

답글 달기
comment-user-thumbnail
2023년 1월 29일

이해하기 쉽게 예시를 들어주셔서 이해가 한결 쉬웠어요!! CRUD가 무엇인지에 대해 보완하시면 더더 좋은 글이 될것 같네요!!ㅎㅎ

답글 달기
comment-user-thumbnail
2023년 1월 29일

오... 정리 감사합니다!!

스프링을 딱 한번 실습 때 사용해봤는데 어떤 구조로 이루어져있는지 몰라 너무 어렵게만 느껴졌는데요..

이렇게 정리해주시니 좀 이해가 가네요!!!

답글 달기
comment-user-thumbnail
2023년 1월 29일

좋은 글 잘 읽었습니다!
스프링 토이 프로젝트를 하면서 controller, service, repository 영역 구분에 대해 모호하게 알고 있었는데 이번 글로 머릿속에서 잘 정리할 수 있었습니다!

답글 달기