Spring Boot 프로젝트 구조
[그림1] 기본적인 Spring Boot 프로젝트 아키텍처
Spring Boot의 기본적인 프로젝트 아키텍처는 [그림1]과 같으며, 아키텍처에 사용되는 용어들을 알아보고 실제 프로젝트 작업시 패키지 구성 방법도 알아보려고 한다.
용어 정리
Client
와 Service
의 중간자 역할!나만의 정리!!!
손님
Client
이 가게 직원Controller
에게 김치볶음밥을 주문Request
요리사가 만든 김치볶음밥
Response
을 사용자에게 전달
Business Logic
을 통한 데이터 가공자 역할!나만의 정리!!!
직원
Controller
가 전달해준 주문을 요리Service
하여 다시 직원에게 전달
DB에 접근
하기 위한 객체!DAO 패턴 vs Repository 패턴
DAO(Data Access Object) 패턴은 Data Persistence의 추상화이며, 영구 데이터 저장소에 가까운 것으로 추정
Repository 패턴은 객체의 상태를 관리하는 저장소로 추정되며, 영구 저장소가 아닌 객체의 상태를 관리하는 저장소
DAO는 Repository를 사용하여 구현할 수 없지만, Repository는 DAO를 사용해 구현할 수 있음
DB 테이블에 대응
하는 하나의 클래스!데이터 교환
을 도와주는 우편물 상자 역할!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
개인적으로 스프링이 진입장벽(모르는 용어, 어려운 구조)이 높아 매번 이해하기가 어려웠는데, 이번 글을 읽고 나니 대략적으로 어떤 구조로 이루어져있는지 알 수 있을 것 같아요. 조만간 Spring에 대해 빠르게 배우는 시간을 가질 텐데 초장부터 헤매기 전에 이 글을 읽고 전체적인 구조를 파악하면 좋겠네요!
그런데 개인적으로 DAO, DTO에 대해서도 쉽고 현실적인 예시가 들어가 있으면 좋겠어요 살짝 어렵네요ㅎㅎ
오... 정리 감사합니다!!
스프링을 딱 한번 실습 때 사용해봤는데 어떤 구조로 이루어져있는지 몰라 너무 어렵게만 느껴졌는데요..
이렇게 정리해주시니 좀 이해가 가네요!!!
잘 읽었습니다!
스프링의 MVC 패턴만 대략 아는 정도였는데, 그런 패턴을 지키기 위해 패키지 구조가 어떻게 나뉘는지 알 수 있었네요.
다만, DTO가 초반부터 설명됐으면 더 이해하기 좋았을 것 같아요!
그리고 데이터를 다루는 DTO, DAO ,Entity 의 차이가 무엇일까요?