티스토리 뷰

JPA에서 중요한 두 가지

- ORM

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

 

영속성 컨텍스트

- JPA를 이해하는 데 가장 중요한 용어

- "엔티티를 영구 저장하는 환경"

- 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념

- EntityManager를 통해서 영속성 컨텍스트에 접근

 

엔티티의 생명주기

- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태

- 영속(managed) : 영속성 컨텍스트에 관리되는 상태

- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태

- 삭제(removed) : 삭제된 상태

 

비영속

- 객체를 생성한 상태

Member member = new Member();
member.setId("member1");
member.setName("회원1");

영속

- 객체를 저장한 상태

Member member = new Member();
member.setId("member1");
member.setName("회원1");

// 영속
EntityManger.persist(member);

준영속

- 엔티티를 영속성 컨텍스트에서 분리 em.detach(member);

 

삭제

- 객체를 삭제한 상태 em.remove(member);

 

영속성 컨텍스트의 이점

- 1차 캐시

- 동일성(identity) 보장

- 트랜잭션을 지원하는 쓰기 지연

- 변경 감지 (Dirty Checking)

- 지연 로딩 (Lazy Loading)

 

엔티티 조회, 1차 캐시

- JPA는 조회할 때 1차 캐시에서 조회할 수 있다

- 트랜잭션 커밋(commit)되기 전에 1차 캐시에서 조회할 수 있기 때문에 SELECT 쿼리가 안 나간다.

Member member = new Member();
member.setId("member1");
member.setName("회원1");

// 영속 1차 캐시에 저장됨
EntityManger.persist(member);

// 1차 캐시에서 조회
Member findMember = EntityManger.find(Member.class, "member1");

데이터베이스에서 조회

영속 엔티티의 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");

System.out.println(a == b) // true

- 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션 차원에서 제공

 

엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

transaction.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit();

- 영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 있다.

- 트랜잭션이 커밋되면 해당되는 SQL을 DB에 날린다.

- transaction.commit()

엔티티 수정 - 변경 감지(Dirty Checking)

- 엔티티 객체를 수정하고 싶으면 set으로 가능하다.

- em.update(엔티티)가 없는 이유는 1차 캐시에서 엔티티와 스냅삿을 비교해서 가져와서 update를 하기 때문이다.

 

엔티티 삭제 

- 삭제 대상 엔티티 조회하여 삭제한다 

- em.remove(Entity)

 

플러쉬(Flush)

- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영

- 변경 감지, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록

- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

 

- em.flush() : 직접 호출

- 트랜잭션 커밋 : flush 자동 호출

- JPQL 쿼리 실행 : flush 자동 호출

 

- 영속성 컨텍스트를 비우지 않음

- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화

- 트랜잭션이라는 작업 단위가 중요

 

준영속 상태

- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)

- 영속성 컨텍스트가 제공하는 기능을 사용 못함

- em.detach(entity), em.clear(), em.close()

 

출처 : 자바 ORM 표준 프로그래밍

'Back-end Programming > JPA' 카테고리의 다른 글

JPA 고급 매핑  (0) 2021.04.17
JPA 다양한 연관관계 매핑  (0) 2021.04.17
JPA 연관관계 매핑 기초  (0) 2021.04.16
JPA 엔티티 매핑(Entity Mapping)  (0) 2021.04.15
JPA (Java Persistence API) 소개 및 시작하기  (0) 2021.04.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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 31
글 보관함