티스토리 뷰





반응형

영속성 컨텍스트(entityManager)

영속성 컨텍스트는 데이터를 대신 관리해주는 JPA의 기능이라고 볼 수 있을 것 같습니다.

객체가 관리대상(영속상태)이 된다면 트랜잭션이 끝나고 insert나 update같은 기능을 대신 처리하게 해줍니다.

 

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

위 상태처럼 그냥 객체(member)를 생성하고 어떤 처리도 되지 않은 상태를 비영속이라 합니다.

 

여기서 영속 상태를 만들어주기 위해서는 아래와 같이 하면 됩니다.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

//객체를 저장한 상태(영속)
em.persist(member);

하지만 아직 DB에 저장된 상태는 아니다. 영속성 컨텍스트 내 1차 캐시에 논리적으로 저장된 상태다.

@id : Entity => "member1" : member

형태로 기본키와 객체가 매핑된다.

 

이때 조회문을 날렸을 때

1차 캐시에 데이터 있는지 확인하여 있으면 DB를 조회하지 않고 그 값을 가져온다.

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

 

하지만 1차 캐시에 없는 key값을 조회하려 한다면 DB에서 조회 후

1차 캐시에 적재 후 데이터를 리턴한다.

이후에 member2를 조회할 경우 DB를 거치지 않고 1차 캐시에 있는 데이터를 리턴

Member findMember = em.find(Member.class, "member2");

 

이렇게 때문에 동일한 key로 호출된 객체는 같은 주소값을 가지게 된다.

자바에서 데이터는 같아도 객체주소가 다르기에, 성립하지 않는 객체 간 ==이 성립하게 되는 것이다.

Member findMember1 = em.find(Member.class, "member1");  //처음 호출 시 DB에서 데이터 조회 후 1차 캐시 적재
Member findMember2 = em.find(Member.class, "member1");  //1차 캐시에 있는 주소값을 불러옴

findMember1 == findMember2 // true

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

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin();

em.persist(memberA);
em.perSist(memberB);
//이렇게 했을 때 DB에 바로 insert가 되지않는다.

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

이렇게 실행될 경우 insert 쿼리를 한 방에 보낼 수 있어서 네트웍 비용이 절감될 수 있다.

즉, 성능적인 이점을 얻을 수 있다.

JPA에서의 Update

Member member = em.find(Member.class, 150L);
member.setName("ZZZZ");

tx.commit();

이런식으로 값을 바꿔주면 커밋 때 update문이 실행된다.

이게 가능한 이유는 1차 캐시에 스냅샷이라는 항목으로 처음 find 했을 때의 정보를 가지고 있다.

그리고 현재의 Entity와의 값이 다를 경우 변경 감지를 하여 자동으로 update문이 실행되는 것이다.

 

출처 : https://www.inflearn.com/course/ORM-JPA-Basic

반응형

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

JPA @MappedSuperclass  (0) 2023.05.28
자바 ORM 표준 JPA 연관관계  (0) 2023.05.27
자바 ORM 표준 JPA DDL, 기본키 매핑  (0) 2023.05.25
자바 ORM 표준 JPA 플러시, 준영속  (0) 2023.05.24
Spring JPA @Modifying - clearAutomatically  (0) 2022.10.29
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
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