| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- MySQL
- jsp
- 서버
- 스프링부트
- web
- 데이터베이스
- JavaScript
- Next.js
- node.js
- SQL
- 자바
- oracle
- 정리
- java
- 스프링
- BACK-END
- 미니정리
- 디자인 패턴
- 코드테스트
- 코드 테스트
- 백엔드
- 오라클
- 자바스크립트
- spring
- jpa
- 프론트엔드
- 쿼리
- 프로그래머스
- 알고리즘
- 프런트엔드
- Today
- Total
참치코더의 꿈 메모장
JPA / Entitymanager와 영속성 컨텍스트 관계 정리 본문

영속성 컨텍스트
- 엔티티를 영구 저장하는 환경, 엔티티 매니저로 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에
엔티티를 보관하고 관리한다.
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.
영속성 컨텍스트 특징
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. (엔티티 객체의 필드값 == 영속성 컨텍스트의 구분값)
- 영속성 컨텍스트는 내부 지연 데이터베이스에서 사용자가 트랜잭션 범위 내에서 변경된 sql 쿼리 문을 가지고
있다가 트랜잭션을 커밋한 순간 해당 데이터가 데이터베이스에 완전히 반영된다.
(tx.commit(); -> 영속성 컨텍스트 내부에서 flush(); 실행)
- em.find(Member.class, "member1")을 호출하면 먼저 1차 캐시에서 엔티티를 찾고 만약 캐시에 데이터가 없다면
데이터베이스에서 데이터를 영속성 컨텍스트로 끌어온다.
엔티티의 생명주기
1. 비영속(new/transition)
- 엔티티 객체를 생성만 하고 엔티티 매니저에 등록을 하지 않은 상태
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 동작 끝
2. 영속(managed)
- 영속성 컨텍스트에 저장된 상태
em.persist(member);
// 동작 끝
3. 준영속(detached)
- 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않도록 떼어내는것
- em.close( )를 호출해서 영속성 컨텍스트를 닫거나 em.clear( )를 호출해서 영속성 컨텍스트를 초기화해도
영속성 컨텍스트가 관리하던 영속 상태의 엔티티는 준영속 상태가 된다.
- em.detach(member);
// 동작 끝
4. 삭제(removed)
- 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.
- em.remove(member);
플러시
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
영속성 컨텍스트를 플러시 하는 3가지 방법
1. em.flush()를 직접 호출
2. 트랜잭션 커밋 시 자동 flush() 호출
3. JPQL 쿼리 실행 시 플러시가 자동 호출된다.
주의점
- 플러시를 하면 영속성 컨텍스트에 보관된 캐시 내용을 지우면서 데이터베이스에 반영되는것이 아니라
영속성 컨텍스트에 변경된 캐시값을 확인하여 순차적으로 쓰기 지연 저장소에 저장된 쿼리 SQL문을
데이터베이스에 반영하는 것이다.
준영속
- 준영속 상태의 엔티티는 영속상태인 엔티티를 해제한 엔티티이기 때문에 영속상태가 제공하는 기능을
사용할 수 없다.
- 쉽게 말하면 해당 영속 컨텍스트 에서 관련 엔티티 정보를 관리하지 않는다.
영속 상태인 엔티티를 준영속 상태로 만드는 방법 3가지(영속 상태 해제 방법 3가지)
1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
2. em.clear() : 영속 컨텍스트를 완전히 초기화한다.
3. em.close() : 영속 컨텍스트를 종료한다.
준영속 상태의 특징
- 영속성 컨텍스트가 관리하지 않으므로, 1차 캐시, 쓰기 지연, 변경 감지, 지연로딩을 포함한 영속성 컨텍스트가
제공하는 어떠한 기능도 동작하지 않는다.
- 준영속 상태는 이미 한번 영속 상태였다 해제된것이기 때문에 반드시 식별자 값을 가지고 있다.(@ Id가 된 기본키값)
- 지연 로딩을 할 수 없다.
'JPA' 카테고리의 다른 글
| JPA - 양방향 매핑 과 설정 방법 정리 (0) | 2025.10.08 |
|---|---|
| JPA / 단방향 엔티티 연관관계(多 : 一) 정리 (0) | 2025.10.06 |
| JPA / 데이터 생성 시간 , 수정 시간 컬럼 자동 저장 방법(코드 위주) (0) | 2025.10.04 |
| JPA / IDENTITY 전략 VS SEQUENCE 전략 비교 정리 (0) | 2025.10.02 |
| JPA / 기본적인 동작과정 미니정리(코드 위주) (0) | 2025.09.30 |