영속성과 트랜잭션

전현진·2025년 5월 7일

Spring

목록 보기
13/14

영속성이란?

  • 프로그램이 종료 된 이후에도 데이터가 사라지지 않는 성질

  • 메모리가 아닌 디스크에 데이터를 영구히 보존하겠다는 의미를 강하게 가짐

JPA 영속성

  • JPA는 객체(Entity)와 데이터베이스 테이블(Table)간의 중간자 역할을 하며, 자바 객체를 데이터베이스에 ‘영속’시키는 과정을 관리하기 위한 라이브러리

  • 여러 객체를 관리하기 위한 환경에서 영속성 컨텍스트(Persistence Context) 라는 메모리 영역을 필요

  • JPA에서의 영속성은 영속성 컨텍스트(Persistence Context) 에 등록한 객체의 추이를 관찰하다 DB에 어떻게 영구히 저장할 것인가를 정하는 과정

  • 상태

    • 영속 (managed) : 영속성 컨텍스트에 등록된 상태

    • 비영속 (new/transient) : 영속성 컨텍스트에 등록되지 않은 상태

    • 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태, 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없음

    • 삭제 (removed) : 영속성 컨텍스트에서 제외되며 SQL 저장소에 delete문을 저장

    • 반영 (flush) : 현재 영속성 컨텍스트에 상태를 확인하여 SQL 생성 후 데이터베이스에 query를 전송, commit 전이기 때문에 데이터베이스에 실제로 저장되지 않은 상태

@Transactional

  • 데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위

  • 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산을 의미

  • 핵심 4대 속성(ACID)

    1. Atomicity (원자성) – 전부 성공 or 전부 실패
    2. Consistency (일관성) – 트랜잭션 전/후의 데이터 일관성 유지
    3. Isolation (격리성) – 동시에 실행되는 트랜잭션 간 간섭 방지
    4. Durability (지속성) – 트랜잭션이 완료된 내용은 반드시 저장

@Transactional 어노테이션

  • @Transactional을 클래스나 메서드에 붙이면, 해당 범위가 트랜잭션이 되도록 보장

  • 적용된 범위에서는 프록시 객체가 생성되어 자동으로 커밋(commit) 또는 롤백(rollback)을 진행

  • 예외 발생 시, rollback을 통해 DB에 결과가 반영되지 않는다

영속성 컨텍스트(Persistence Context)

  • 엔티티 객체의 상태를 관리하는 JPA의 1차 캐시

  • DB와의 연결이 아니라 JPA가 관리하는 메모리 상의 공간이라고 할 수 있다.

  • 주요 기능

    • 객체의 영속성 관리
      • JPA는 엔티티 객체가 영속 상태로 들어가거나 나갈 때 이를 추적
      • 영속성 컨텍스트 내에서 엔티티 객체는 1차 캐시로 유지되며, 이를 통해 데이터베이스와의 상호작용을 최적화
    • 변경 감지(Dirty Checking)
      • 엔티티 객체의 상태가 변경되면, JPA는 이를 자동으로 감지하고 DB에 업데이트
      • @Transactional을 사용하면 트랜잭션 커밋 시점에 자동으로 변경된 엔티티가 DB에 반영
    • 엔티티의 동일성 보장
      • 동일한 엔티티 객체는 영속성 컨텍스트 내에서 한 번만 존재하게 됩니다. 즉, 동일한 ID를 가진 객체는 하나의 인스턴스로 관리
      • DB에서 여러 번 조회해도 영속성 컨텍스트에서 동일한 객체를 반환

영속성 컨텍스트 상태

  • Transient (비영속 상태) : 영속성 컨텍스트에 아직 등록되지 않은 객체이다. new 키워드로 생성된 상태로, 아직 DB에 저장되지 않았다.

  • Persistent (영속 상태) : 영속성 컨텍스트에 의해 관리되는 상태입니다. 즉, DB에 저장되어 있고, JPA가 이 객체의 변경 사항을 추적한다. 객체가 영속성 컨텍스트에 존재하며, 변경된 상태는 자동으로 감지되어 트랜잭션이 끝날 때 DB에 반영함.

  • Detached (분리 상태) : 영속성 컨텍스트에서 분리된 상태로 객체는 더 이상 영속성 컨텍스트에 의해 관리되지 않는다. 객체가 영속성 컨텍스트에 의해 관리되지 않으므로, 변경된 내용은 DB에 반영되지 않지만 DB에서 다시 조회해 재연결할 수 있다.

  • Removed (삭제 상태) : 영속성 컨텍스트에서 삭제된 상태로 삭제된 엔티티는 더 이상 DB에서 관리되지 않는다. remove() 메서드를 호출하면, 엔티티는 영속성 컨텍스트에서 제거되고 DB에서도 삭제됨.


참고 :

spring 캠프, 발제/특강 : 영속성과 Transaction 세션,
https://star7sss.tistory.com/823,
https://pixx.tistory.com/262,
챗GTP

profile
안녕하세요

0개의 댓글