JPA의 어노테이션과 엔티티 개념에 대해서 이전 글을 통해 정리하고 복습하는 과정을 거쳤다.
오늘은 CRUD 테스트 이전에 짚고 넘어가야만 했던 중요한 내용인 3 Layer Architecture의 개념을 추가 정리하고자 한다.
✅ 3 Layer Architecture
: 소프트웨어 시스템을 세 개의 논리적 계층으로 분리하는 아키텍처

세 개의 레이어로 분리
- Controller Layer (Persentation Layer라고도 함)
- Service Layer (Business Layer, Apllication Layer라고도 함)
- Repository Layer (Data Layer라고도 함)
📌 3 Layer Architecture의 목적
- 관심사의 분리
- 각 계층은 고유한 책임만 담당
- 변경 사항의 영향 범위 최소화
- 유지보수성 향상
- 코드의 가독성과 이해도 증가
- 독립적인 테스트 가능
- 재사용성 증대
- 각 계층을 독립적으로 재사용
- 모듈화된 설계
- 확장성 개선
- 특정 계층만 변경하여 기능 확장
- 새로운 기술 도입 용이
Controller Layer
: 일반 사용자가 애플리케이션과 상호작용하는 사용자 인터페이스 및 커뮤니케이션 계층
🌱 스프링 코드 예시
@RestController
public class HelloController {
//...
}
→ @RestController를 사용
✅ 해야할 일
- HTTP 요청 매핑
- 요청 파라미터 검증
- 응답 데이터 변환
- 예외 처리 및 에러 응답
❌ 하지 말아야 할 일
- 비즈니스 로직 처리
- 데이터베이스 직접 접근
- 복잡한 데이터 변환
Service Layer
: 비즈니스 로직을 처리하는 역할을 함. 백엔드의 모든 핵심 로직이 운영되는 계층
🌱 스프링 코드 예시
@Service
public class HelloService {
//...
}
✅ 해야 할 일
- 비즈니스 규칙 구현
- 데이터 유효성 검증
- 여러 데이터 소스 조합
- 트랜잭션 경계 설정
❌ 하지 말아야 할 일
- HTTP 관련 처리
- 데이터베이스 쿼리 작성
- UI 관련 로직
Repositoy Layer
: 데이터베이스와의 상호작용을 담당. 실제 데이터베이스에서 데이터를 저장하거나 가져오는 계층
🌱 스프링 코드 예시
public interface UserRepository extends JpaRepository<User, Long> {
//...
}
→ @Repository를 사용하지만, 이미 해당 기능을 갖고 있는 JpaRepository를 extends 하는 경우에는 추가로 @Repository를 붙이지 않아도 됨
✅ 해야 할 일
- CRUD 연산 구현
- 쿼리 최적화
- 데이터 매핑
❌ 하지 말아야 할 일
- 비즈니스 로직 처리
- HTTP 응답 생성
- 사용자 인터페이스 관련 작업
💡 레이어 간 통신 규칙
✅ 허용되는 통신
- 상위 → 하위 : 상위 계층이 하위 계층을 호출
- 같은 계층 : 동일 계층 내 컴포넌트 간 통신
❌ 금지되는 통신
- 하위 → 상위 : 하위 계층이 상위 계층 직접 호출
- 계층 건너뛰기
- 잘못된 예) Controller가 Repository 직접 호출
DTO(Data Transfer Object)
: 데이터를 전달하기 위한 순수 데이터 객체

코드 예시
- JSON 요청
{
"title" : "범죄도시11"
}
JSON형식으로 위처럼 요청을 보냈다면, 이를 Controller에서는 데이터를 DTO(자바 코드)로 받게 됨
- DTO
@Getter
public class CreateMovieRequest {
private String title;
}
순수하게 데이터를 담기위한 DTOfmf todtjd
JSON의 상황에 맞춰 DTO 클래스에도 동일한 필드를 작성
- Controller
@RestController
public class MovieController {
@PostMapping("/movies")
public void createMovie(@RequestBody CreateMovieRequest request) {
//...
}
}
영속성 컨텍스트
: 영속성 컨텍스트를 쉽게 풀어 말하면 JPA가 엔티티를 관리하는 임시 저장소를 의미
📌 영속성 컨텍스트가 하는 일
- 엔티티를 임시로 보관
- 변경사항을 추적 (더티체킹)
- 데이터베이스와 동기화
✅ 엔티티의 생명주기
: 엔티티 객체가 생성되어 소멸하기까지 거치는 여러 상태의 변화 과정을 의미

✅ @Transactional 기본
: 여러 작업을 하나의 단위로 묶어서 모두 성공하거나 모두 실패하게 하는 것. 이 특성을 원자성이라고 함
영속성 컨텍스트의 동작을 위한 전제조건은 트랜잭션 경계 안에 있어야 한다는 것인데, 이를 풀어 말하면
트랜잭션 내에서 데이터베이스를 한 번이라도 갔다온 엔티티를 관리 하는 것
@Transactional
- 여러 개의 작업을 하나의 단위로 묶어 실행. (원자성)
- @Transactional의 속성
- readOnly : true 설정 시, 읽기 전용으로 사용하여 성능을 최적화 (CUD 작업은 불가)
- propagation : 트랜잭션 전파 규칙을 정의. (e.g. REQUIRED, REQUIRES_NEW)
- isolation : 트랜잭션의 격리 수준을 설정하여 동시성 문제를 제어
- rollbackFor : 특정 예외가 발생했을 때 강제로 롤백하도록 지정
👉 readOnly를 제외한 나머지 속성은 후에 심화과정 학습 과정에서 상세하게 배울 예정
JpaRepository 활용
: JpaRepository를 사용하면 쿼리를 작성하지 않고도 쉽게 DB에 데이터를 CRUD 할 수 있음
- Create : 데이터 새로 넣기 → save(entity)
- Read : 데이터 읽기 → findById, findAll 등
- Update : 값 바꾸기 → (트랜잭션 안에서) 엔티티의 필드만 변경 → 커밋 시 자동 UPDATE (더티체킹)
- Delete : 삭제 → delete(entity), deleteById(id), deleteAll()
'Spring' 카테고리의 다른 글
| [Spring] Spring Data JPA 개념 정리하기 (0) | 2025.10.16 |
|---|