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 생성 가능