매일 한줄 코딩

[JPA]영속성 컨텍스트 본문

develop/JPA(ORM)

[JPA]영속성 컨텍스트

ShipJH 2022. 12. 22. 15:44

2. 영속성 컨텍스트

영속성 컨텍스트란?

  • 엔티티를 영구 저장하는 환경 이라는 뜻
  • 영속성 컨텍스트는 논리적인 개념
  • 눈에 보이지 않음
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근

 

0.영속성 컨텍스트의 이점

애플리케이션이랑 데이터베이스 사이에 무언가의 상태가 있다. (영속성 컨텍스트)

  • 1차 캐시
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
  • 변경 감지 (Dirty Checking)
  • 지연 로딩(Lazy Loading)

등등 의 이점을 가진다.

 

1. 1차 캐시

1-1. 엔티티 조회, 1차 캐시

//객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

//...

//객체를 저장한 상태(영속) // 디비에 저장되는 상태는 아님. 엔티티컨텍스트에 저장.
**//1차 캐시에 저장**
em.persist(member);

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

// ...

저장하고, 디비에 커밋전 조회하게 되면.. 디비접근하지 않고, 영속 컨텍스트에서 조회한다.

1-2. 데이터베이스에서 조회

Member findMember1 = em.find(Member.class, "member2");  //DB 조회.
Member findMember2 = em.find(Member.class, "member2");  //1차 캐시에서 조회.

1차 캐시에 없으므로, DB에 조회하여 member2를 1차 캐시에 저장하고 member2를 반환한다.

또다시 member2를 조회하면 1차캐시에서 갖고있기 때문에 DB를 조회하지 않는다.

다만, 영속 컨텍스트는 트랜젝션 안에서만 영속 컨텍스트내에 이점만 있으므로, 트랜젝션 단위가 끝나면 큰 의미는 없다. 비지니스 로직이 복잡하면 필요하겠지만 큰 이점은 없음.


2. 영속 엔티티의 동일성(identity) 보장

Member findMember1 = em.find(Member.class, "member2");  //DB 조회.
Member findMember2 = em.find(Member.class, "member2");  //1차 캐시에서 조회.

findMember1 == findMember2 // true 동일성 보장.

 

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

// ...
// 1차캐시에 저장하고, insert 문을 생성해서 쓰기지연SQL 저장소에 저장해둔다.
em.persist(memberA); 
em.persist(memberB);
// 이때 까지도 insert sql을 데이터베이스에 보내지 않는다.

tx.commit(); //이때에 DB 에 insert 문이 실행된다.

hibernate.jdbc.batch_size 라는 옵션을 주게되면

모았다가 한번에 커밋할 수 있는 장점을 가진다. ( 버퍼링 기능 )

 

4. 변경 감지 (Dirty Checking)

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작

// 영속 엔티티 조회
Member memberA = em.find(Member.class, 100L);

// 영속 엔티티 데이터 수정
memberA.setUsername("hi"); 
**// 조회된 100L를 영속성 컨텍스트에 가져오고, 유저의 이름을 hi로 변경된다.**
**// 값만 바꿔도 업데이트 쿼리가 나간다.**

**//em.update(member) 이런 코드가 있어야 하지 않을까? => 없어도 된다.** 
transaction.commit(); // [트랜잭션] 커밋

변경을 감지하기 때문에 update()이러한 메소드 같은 것이 없더라도,

영속성 컨텍스트에 엔티티와 스냅샷을 비교해서 변경이 감지되면 쓰기지연 SQL저장소에 저장해두고 업데이트 쿼리를 날린다.

 

5. 엔티티 삭제

Member memberA = em.find(Member.class, "memberA"); // 조회한
em.remove(memberA); //엔티티 삭제

'develop > JPA(ORM)' 카테고리의 다른 글

[JPA] 엔티티 매핑  (0) 2022.12.22
[JPA] 준영속 상태  (0) 2022.12.22
[JPA] 플러시  (0) 2022.12.22
Comments