728x90
스프링의 계층 구조와 역할
스프링의 계층 구조는 프로그램을 명확하게 구분해 유지보수성과 확장성을 높이기 위한 설계 방식입니다.
이번 글에서는 각 계층의 역할과, 프로젝트 패키지를 어떻게 나누면 좋은지 정리해보았습니다.

스프링의 계층은 Presentation Layer, Business, Layer, Data Access Layer 크게 3개로 나눌 수 있다.
1. 스프링의 기본 계층 구조
스프링은 일반적으로 다음 3~4개의 계층으로 나눕니다.
1) 프레젠테이션 계층 (Presentation Layer)
- 브라우저에서 들어오는 요청과 응답을 처리합니다.
- 서비스·데이터 계층에서 발생한 예외를 처리합니다.
- @Controller, @RestController로 작성된 클래스가 속합니다.
2) 서비스 계층 (Service Layer)
- 비즈니스 로직을 구현하고 도메인 규칙을 검증합니다.
- 트랜잭션 관리 역할을 합니다.
- 컨트롤러와 데이터 계층 사이를 연결하여 두 계층이 직접 통신하지 않도록 합니다.
- @Service 애노테이션이 붙은 클래스가 해당됩니다.
3) 데이터 액세스 계층 (Data Access Layer)
- DB와 직접 통신하며 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
- MyBatis, JPA 등 ORM을 주로 사용합니다.
- @Repository 애노테이션으로 작성된 DAO/Repository 클래스가 여기에 속합니다.
4) 도메인 모델 계층 (Domain Layer)
- DB 테이블과 매칭되는 핵심 비즈니스 객체를 정의합니다.
- Entity 클래스라고도 부르며, 데이터 영속성을 담당합니다.
여기서 공통된 용어들을 살짝 정리하자면..
2. DTO, DAO, Entity 개념 정리
DTO (Data Transfer Object)
- 각 계층 간 데이터를 전달하기 위한 객체입니다.
- 로직 없이 단순히 데이터를 담는 역할만 합니다.
- 보통 getter, setter만 가지고 있으며, 화면이나 API 요청·응답용으로 사용됩니다.
DAO (Data Access Object)
- DB에 접근해 데이터를 조작하는 기능을 담당하는 객체입니다.
- MyBatis에서는 DAO 또는 Mapper, JPA에서는 Repository로 불립니다.
- 서비스 계층과 DB 사이의 연결고리 역할을 합니다.
Entity 클래스
- DB 테이블과 매핑되는 클래스이며, 도메인 로직만 포함합니다.
- 화면 로직(Presentation Logic)은 포함하지 않습니다.
- JPA를 사용할 때 핵심적인 역할을 담당합니다.
3. Domain과 DTO를 분리하는 이유
Domain 클래스와 DTO를 분리해야 하는 이유는 역할이 다르기 때문입니다.
Entity는 DB 구조와 밀접하게 연관되어 자주 변경되지 않지만,
DTO는 화면(View) 요구사항에 따라 자주 바뀝니다.

위 그림처럼 각 계층이 나눠져 있고 DTO, DAO를 통해서 설계를 하는 것을 알 수 있습니다.
따라서 DTO와 Entity를 분리하면
- 변경 파급을 줄이고,
- 보안상 노출될 필드를 제한하며,
- 유지보수가 쉬워집니다.
DTO는 Domain 객체를 복사해 화면용 데이터를 표현하는 용도로 사용하고,
Entity는 영속성(persistence)을 위한 내부 모델로 유지합니다.

4. Controller와 Service를 분리하는 이유
많은 초보 개발자들이 모든 비즈니스 로직을 @RestController 안에 작성하지만,
이렇게 되면 중복 코드가 생기고 유지보수가 어렵습니다.
서비스 계층을 따로 두면 다음과 같은 장점이 있습니다.
- 중복 제거: 공통 비즈니스 로직을 재사용 가능
- 확장성: 서비스 조합만으로 새로운 기능을 쉽게 구성
- 테스트 용이: 서비스 단위 테스트가 가능
- 의존 역전: 컨트롤러는 서비스 인터페이스만 의존하므로 구조가 유연
결국, 서비스 계층은 확장성·재사용성·유지보수성을 높이는 핵심 구조입니다.
참고 자료:
728x90
'Spring Boot' 카테고리의 다른 글
| 스프링부트x리액트 '카카오 로그인 하기' (JWT+OAuth2) [2] (6) | 2022.04.26 |
|---|---|
| 스프링부트x리액트 '카카오 로그인 하기(소셜 로그인 )' 카카오API+JWT+OAuth2 [1] (3) | 2022.04.26 |
| [Springboot] 컨트롤러에서 Json 데이터 받을 때 오류 out of START_ARRAY token..Cannot deserialize value of type JsonToken.. (0) | 2022.04.06 |
| Spring Boot 게시글 좋아요 기능 구현(좋아요 조회, 좋아요 판별) (0) | 2022.03.30 |
| 스프링부트 JWT 인증 과정 (0) | 2022.03.18 |
댓글