2023. 9. 13. 11:25ㆍLecture/JPA
이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 3-2강을 듣고 정리한 글입니다.
1차 캐시
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//1차 캐시에 저장됨
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
em.persist를 하면 영속 컨텍스트에 등록을 하는 개념이다.
그다음 em.find를 하게되면 먼저 1차 캐시에서 조회를 하게 된다. 없다면 DB에서 조회한 후 가져오게 된다. 이때에도 영속 컨텍스트에 등록이 된다.
영속 엔티티의 동일성 보장
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
영속 컨텍스트에 member1이 등록되어있다고 가정하면 a와 b는 같은 객체를 가지고 오기 때문에 비교를 했을 때 true를 반환한다. 내가 알고 있는 mybatis에서는 DB에 종속되어있기 때문에 DB에서 조회한 후 객체에 넣기 때문에 a == b를 했을 때는 false를 반환한다.
엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin();
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit();
엔티티 수정 - 변경 감지
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
transaction.commit();
em.find해서 찾아온 객체를 em.persist할 필요없이 객체의 필드를 변경하게 되면 commit이 이뤄질 때 영속 컨텍스트에 있는 객체와 비교하여 자동으로 변경을 감지해 update 구문을 실행한다.
이점은 JPA가 참 편한 것 같다. 계속해서 mybatis와 비교하게 되는데 나는 처음 배울때부터 지금 현업을 할 때까지 mybatis 밖에 사용하지 않았기 때문에 더 차이를 느끼는 것 같다. mybatis에서는 update 쿼리를 직접 짜두고 수정이 필요할 때마다 해당 서비스를 호출해 직접 update를 시켰지만 JPA는 위와 같이 영속 컨텍스트에 있는 것과 자동으로 비교해서 update 쿼리를 실행하니 말이다.
엔티티 수정이 되는 과정
스냅샷은 처음에 조회했을 때의 정보를 나타낸다.
변경된 엔티티와 스냅샷과 비교한 후 update 쿼리를 생성해 마지막 commit되는 시점에 쿼리를 실행시킨다.
'Lecture > JPA' 카테고리의 다른 글
JPA(9) - 준영속 상태 (0) | 2023.09.13 |
---|---|
JPA(8) - 플러시 (0) | 2023.09.13 |
JPA(6) - 영속성 컨텍스트 (0) | 2023.09.12 |
JPA(5) (0) | 2023.09.12 |
JPA(4) (0) | 2023.09.12 |