SPRING

Spring JPA 영속성 컨텍스트

도원좀비 2025. 3. 26. 20:29

📚 영속성 컨텍스트(Persistence Context)

JPA의 핵심 개념으로, 엔티티 객체를 관리하고 저장하는 공간을 말합니다.

1️⃣ 영속성 컨텍스트의 특징

  • EntityManager를 통해 접근합니다.
  • 논리적 개념으로 1차 캐시 역할을 합니다.

2️⃣ 엔티티(Entity)의 생명주기

  • 비영속(new): DB와 무관한 새로운 상태
  • 영속(managed): 영속성 컨텍스트가 관리하고 DB와 동기화하는 상태
  • 준영속(detached): 영속 상태였으나 컨텍스트에서 분리된 상태
  • 삭제(removed): 삭제 대상으로 표시되고 트랜잭션 종료 후 실제 DB에서 삭제

📌 영속성 컨텍스트의 장점

1️⃣ 1차 캐시

같은 엔티티를 조회할 때 DB 접근을 최소화하여 성능을 높입니다.

  • 최초 조회 시 DB 접근 후 1차 캐시 저장
  • 이후 조회 시 캐시에서 반환하여 DB 접근 최소화

2️⃣ 동일성 보장

  • 동일 트랜잭션 내에서 같은 객체를 여러 번 조회해도 항상 같은 객체를 반환합니다.
  • Java Collection처럼 객체를 안전하게 관리할 수 있습니다.

3️⃣ 쓰기 지연 (Transactional Write-Behind)

  • 엔티티 변경 사항을 즉시 DB에 반영하지 않고 트랜잭션 commit 시점에 한 번에 SQL로 반영합니다.
  • 네트워크 비용을 줄이고 성능을 높입니다.

4️⃣ 변경 감지 (Dirty Checking)

  • Entity의 상태 변경을 영속성 컨텍스트가 자동 감지하여 트랜잭션 commit 시 자동으로 UPDATE SQL을 실행합니다.

5️⃣ Flush

  • 트랜잭션이 commit 될 때 자동 호출되며, 수동으로도 호출할 수 있습니다.
  • 영속성 컨텍스트의 변경 사항을 DB에 반영합니다.

📌 Entity와 매핑

1️⃣ Entity 기본 설정

  • Entity 클래스는 @Entity 어노테이션 필수
  • 기본 생성자 필수
  • PK 설정은 필수이며, @Id 어노테이션 사용
@Entity
@Table(name = "tutor")
public class Tutor {
    @Id
    private Long id;

    private String name;

    public Tutor() {}
    
    public Tutor(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}
 

2️⃣ DDL 자동생성 (hibernate.hbm2ddl.auto)

  • 개발 환경에서 주로 사용
  • 실무에서는 반드시 validate 또는 none 사용
설명
create 테이블 DROP 후 새로 CREATE
create-drop 시작시 생성, 종료시 삭제
update 변경 사항만 반영
validate 매핑이 정확한지 확인만
none 사용하지 않음

3️⃣ 제약조건 설정

  • @Column: DB 컬럼과 매핑
    • unique, nullable, length 등 설정 가능
  • @Table: 테이블 설정
    • 복합적인 unique 제약조건 설정 가능
@Column(unique = true, length = 20, nullable = false)

4️⃣ 주요 필드 매핑 어노테이션

  • @Temporal: 날짜와 시간 타입 매핑 (DATE, TIME, TIMESTAMP)
  • @Enumerated: Enum 타입 매핑 (ORDINAL 사용 지양, 반드시 STRING 사용 권장)
  • @Lob: 대용량 텍스트 저장
  • @Transient: DB 컬럼과 매핑하지 않을 때 사용

5️⃣ PK 생성 전략(@GeneratedValue)

  • PK 자동 생성 시 필수 사용
  • GenerationType.IDENTITY: MySQL의 AUTO_INCREMENT 사용
 
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
  • 트랜잭션 commit 시점이 아닌 persist 시점에 PK 생성 가능