[내일배움캠프 Spring 3기] 3 Layer Architecture, 영속성 컨텍스트

jiiim_ni·2026년 2월 9일

3 Layer Architecture

3 Layer Architecture는 소프트웨어 시스템을 세 개의 논리적 계층으로 분리하는 아키텍처

3개의 레이어로 분리

  1. Controller Layer (Persentation Layer라고도 함)
  2. Service Layer (Business Layer, Application Layer라고도 함)
  3. Repository Layer (Data Layer라고도 함)

3 Layer Architecture의 목적

  • 관심사의 분리
    • 각 계층은 고유한 책임만 담당
    • 변경 사항의 영향 범위 최소화
  • 유지보수성 향상
    • 코드의 가독성과 이해도 증가
    • 독립적인 테스트 가능
  • 재사용성 증대
    • 각 계층을 독립적으로 재사용
    • 모듈화된 설계
  • 확장성 개선
    • 특정 계층만 변경하여 기능 확장
    • 새로운 기술 도입 용이

Controller Layer

일반 사용자가 애플리케이션과 상호작용하는 사용자 인터페이스 및 커뮤니케이션 계층

@RestController
public class HelloController {
		// ...
}

해야 할 일

  • HTTP 요청 매핑
  • 요청 파라미터 검증
  • 응답 데이터 변환
  • 예외 처리 및 에러 응답

하지 말아야 할 일

  • 비즈니스 로직 처리
  • 데이터베이스 직접 접근
  • 복잡한 데이터 변환

Repository Layer

데이터베이스와의 상호작용을 담당
실제 데이터베이스에서 데이터를 저장하거나 가져오는 계층

public interface UserRepository extends JpaRepository<User, Long> {
		// ...
}

해야 할 일

  • CRUD 연산 구현
  • 쿼리 최적화
  • 데이터 매핑

하지 말아야 할 일

  • 비즈니스 로직 처리
  • HTTP 응답 생성
  • 사용자 인터페이스 관련 작업

레이어간 통신 규칙

허용되는 통신

  • 상위 -> 하위: 상위 계층이 하위 계층을 호출
  • 같은 계층: 동일 계층 내 컴포넌트 간 통신

금지되는 통신

  • 하위 -> 상위: 하위 계층이 상위 계층 직접 호출
  • 계층 건너뛰기
    • 잘못된 예) Controller가 Repository 직접 호출

DTO(Data Transfer Object)

데이터를 전달하기 위한 순수 데이터 객체

스프링은 Client의 요청을 받고, 이 요청을 자바 코드로 변환하여 처리함
이때, 사용자의 Request 데이터를 자바 코드에 담아 Controller에 옮겨줄 객체가 필요한데, 이 객체가 바로 DTO


영속성 컨텍스트

영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 뜻하며 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함
엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트 한 개를 만들어 엔티티를 보관하고 관리

JPA가 엔티티를 관리하는 임시 저장소

영속성 컨텍스트가 하는 일

  1. 엔티티를 임시로 보관
  2. 변경사항을 추적 (더티체킹)
  3. 데이터베이스와 동기화

엔티티의 생명주기

엔티티 생명주기(Entity Lifecycle)란 엔티티 객체가 생성되어 소멸하기까지 거치는 여러 상태의 변화 과정을 의미

비영속

영속성 컨텍스트와는 아무런 관계가 없는 상태

쉽게 말하자면, DB에 한 번도 갔다오지 않은 상태

영속

엔티티가 영속성 컨텍스트에 의해 관리되는 상태

쉽게 말하자면, DB를 갔다 온 상태
트랜잭션 내에서 데이터베이스를 한 번이라도 갔다 온 엔티티를 관리


@Transactional 기본

트랜잭션
여러 작업을 하나의 단위로 묶어서 모두 성공하거나 모두 실패하게 하는 것

이 특성을 원자성이라고 함

  • @Transactional의 속성
    • readOnly : true 설정 시, 읽기 전용으로 사용하여 성능을 최적화 (CUD 작업 불가)
    • propagation : 트랜잭션 전파 규칙을 정의합니다. (e.g., REQUIRED, REQUIRES_NEW)
    • isolation : 트랜잭션의 격리 수준을 설정하여 동시성 문제를 제어
    • rollbackFor : 특정 예외가 발생했을 때 강제로 롤백하도록 지정

JpaRepository 활용

JpaRepository CRUD

JpaRepository를 사용하면 쿼리를 작성하지 않고도 쉽게 DB에 데이터를 CRUD 할 수 있음

  • Create: 데이터 새로 넣기 -> save(entity)
  • Read: 데이터 읽기 -> findById, findAll
  • Update: 값 바꾸기 -> (트랜잭션 안에서) 엔티티의 필드만 변경 -> 커밋 시 자동 UPDATE (더티체킹)
  • Delete: 삭제 -> delete(entity), deleteById(id), deleteAll()

이러한 메서드들을 ‘쿼리메서드’라고 함

0개의 댓글