[Spring] MVC 모델 구조
SpringBoot 프로젝트 구조
Spring Boot의 기본적인 프로젝트 아키텍처는 위와 같으며, 아키텍처에 사용되는 용어들을 알아보고 실제 프로젝트 작업시 패키지 구성 방법도 알아보려고 한다.
Controller
Client
와Service
의 중간자 역할!Client에서 보낸 요청 URL에 따라 적절한 응답을 한다.
이 때, Client(View)에서 Request Body에 담긴 데이터(DTO)를 Service에 넘겨주고, Service에서 처리하고 Response Body에 담겨 반환된 데이터(DTO)를 돌려주는 역할을 한다.
Service
Business Logic
을 통한 데이터 가공자 역할!- _Client의 요청(request)*_에 대해 어떤 처리를 할지 결정하는 부분이다.
한마디로 요청들어온 부분을 개발자가 어떻게 변환하여(가공하여) 다시 사용자에게 전달할지 결정하는 부분이다.
DAO(Repository)
- 실제
DB에 접근
하기 위한 객체!실제로 DB에 접근하여 데이터를 CRUD 하는 객체이다.
Service와 DB를 연결해주는 역할을 하고 있으며, 인터페이스와 이에 대한 구현체를 만들어서 구현체에 CRUD관련 기능을 구현하고, 이를 DI(Dependency Injection) 해주는 방식으로 사용된다.
DAO 패턴 vs Repository 패턴
DAO는 Repository를 사용하여 구현할 수 없지만, Repository는 DAO를 사용해 구현할 수 있음Repository 패턴은 객체의 상태를 관리하는 저장소로 추정되며, 영구 저장소가 아닌 객체의 상태를 관리하는 저장소DAO(Data Access Object) 패턴은 Data Persistence의 추상화이며, 영구 데이터 저장소에 가까운 것으로 추정
Entity
DB 테이블에 대응
하는 하나의 클래스!- _실제 DB의 테이블과 매칭*_될 핵심 클래스이다.
최대한 외부에서 Entity 클래스의 Setter method를 사용하지 않도록 해당 클래스 안에서 필요한 logic을 구현해야한다. 이 때, Constructor(생성자) 또는 Builder를 사용한다.
DTO
데이터 교환
을 도와주는 우편물 상자 역할!DTO는 계층간 데이터 교환을 도와주는 객체이다.
세부적인 로직을 갖고 있지 않은 순수한 데이터 객체라고 생각하면 된다. 오직 Getter/Setter method만 가지고 있으며, 계층간 데이터 교환시 사용한다.
Entity 클래스와 DTO 클래스를 분리하는 이유
JPA 사용시 Entity 객체는 단순히 데이터를 담는 객체 이상으로 DB와 중요한 역할을 하며 DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 다르게 Entity의 생명주기도 달라 분리하며 사용함DB와 View 사이의 역할 분리를 위해서이며 DTO는 순수하게 데이터를 담고 있다는 점이 Entity와 유사하지만, 목적 자체가 전달이므로 읽고, 쓰는 것이 모두 가능함
레이어 계층형
- 장점
각 계층을 대표하는 디렉터리 기준으로 코드들이 구성되어 해당 프로젝트의 이해가 상대적으로 낮아도 전체적인 구조를 빠르게 파악할 수 있는 장점이 있다. - 단점
디렉토리에 클래스들이 너무 많이 모이고, 모듈 단위로 분리 시 어려움이 존재한다.
도메인형
- 장점
도메인 디렉터리 기준으로 코드를 구성하며 관련 코드들이 응집해 있으며 모듈 단위로 분리할 때 유리하다. - 단점
프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어려우며 개발자의 성향에 따라 도메인을 구분하는 기준이 다를 수 있어 파일을 찾는데 어려움이 있을 수 있다.
결론
Spring 패키지 구조를 크게 레이어 계층형과 도메인형으로 나누어 알아봤지만 실제로 실무에서는 프로젝트가 성장함에 따라 프로젝트 구조도 유동적으로 변경할 수 있어야 하므로 프로젝트 진행 시 많은 고민을 통해 구조를 결정해야할 것 같다.
참고 자료
Spring Guide - Directory - Yun Blog | 기술 블로그
Spring Guide - Directory - Yun Blog | 기술 블로그
cheese10yun.github.io
역할 분리를 위한 Entity, DTO 개념과 차이점
'Entity, DTO 개념과 차이점 (+ VO)' - Entity Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체입니다. (DB의 테이블과 1:1로 매
wildeveloperetrain.tistory.com
DAO와 Repository의 차이점
조급하지 말자, 천천히라도 꾸준히 공부하자
isaac56.github.io
[ Spring ] 12. DAO & DTO & Entity와 스프링 패키지의 전체 구조
DAO & DTO & Entity DAO Data Access Object repository package 실제로 DB에 접근하는 객체 Persistance Layer(DB에 dat를 CRUD하는 계층)이다. Service와 DB를 연결하는 고리의 역할 SQL을 사용해 (개발자가 직접 코딩) DB에 접
coder-in-war.tistory.com