본문 바로가기

Spring/JPA34

영속성 컨텍스트 - 플러시 플러시 : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 - 플러시가 발생할 때의 예 1. 변경감지 2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록할 때 3. 쓰기지연 SQL 저장소의 쿼리를 데이터 베이스에 전송 - 플러시 하는 방법 1. em.flush() - 직접 호출 2. transaction.commit - 트랜잭션 커밋 3. JPQL 쿼리 실행 - 플러시는 영속성 컨텍스트를 비우지 않는다 : 영속성 컨텍스트의 소스를 DB에 적용시키는 것 뿐이다. - 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다. - 커밋 직전에만 동기화 하면된다. 플러시 모드 옵션 - 변경을 추천하지 않으며 자동(기본값)을 사용하자. 2022. 9. 20.
영속성 컨텍스트 - 변경 감지 영속성 컨텍스트에서의 변경감지에서 가장 핵심은 update 를 할 때, em.persist 로 다시 영속화 할 필요가 없다는 것이다. 변경감지란 무엇일까? 변경감지는 스냅샷 이라는 1차캐시에서 비롯된다. 1차 캐시에서는 그때그때마다 스냅샷을 찍어 캐시의 상태를 사진으로 찍어놓는다. 이 후, 데이터가 변경되면 스냅샷과 비교하여 변경된 것을 감지하고 update 쿼리를 DB에 날리게 된다. ( 틀린그림 찾기라고 생각하면 쉽다 ) 예제 ID 가 1(PK) 이고, NAME 이 memberA 인 데이터를 memberA에서변경으로 변경하려고 한다. tx.begin(); // 트랜잭션 시작 Member findMember = em.find(Member.class, 1L); findMember.setName("memb.. 2022. 9. 20.
영속성 컨텍스트 - 쓰기 지연 영속성 컨텍스트에서는 쓰기 지연 이라는 트랜잭션을 지원한다. em.persist 를 통해 영속성 컨텍스트로 들어가면 바로 DB 에 SQL 문을 날리는 것이 아닌, 쓰기 지연 SQL 저장소로 들어가게 된다. 이후, commit 을 하거나 flush 를 실행하면 DB 에 Insert 쿼리문이 넘어가게 되어 DB 에 저장되게 된다. tx.begin(); // 트랜잭션 시작 Member memberA = new Member(111L, "memberA"); Member memberB = new Member(112L, "memberB"); em.persist(memberA); em.persist(memberB); // 여기까지 DB 에 Insert SQL 을 보내지 않는다. tx.commit(); // 커밋해야 S.. 2022. 9. 20.
영속성 컨텍스트 - 동일성보장 같은 트랜잭션안에서의 엔티티는 조회 시 동일성을 보장한다. Member member1 = em.find(Member.class, 50L); Member member2 = em.find(Member.class, 50L); System.out.println(member1 == member2); // True + 동일성 보장으로 인해 발생하는 데이터 동기화 문제가 있으며, 어떻게 해결해야 하는지에 대해서는 추후 추가 https://devhyogeon.tistory.com/6 JPA의 동일성 보장으로 인해 발생하는 데이터 동기화 문제 이 글의 내용과 예제에는 Spring Data JPA에서 사용하는 벌크 연산과 @Modifying의 clearAutomatically attribute에 대한 이해가 필요하므로 아.. 2022. 9. 20.
영속성 컨텍스트 - 1차 캐시 영속성 컨텍스트의 이점 - 1차 캐시 영속성 컨텍스트 안에는 1차캐시가 들어있다. 1차 캐시는 EntityManager가 관리하는 영속성 컨텍스트 내부에 있는 첫번째 캐시이다. 1차 캐시의 동작과정 1. 조회 시 1차 캐시에 데이터가 있는지 확인 후 있으면 데이터를 가져온다. 2. 1차 캐시에 없다면 DB 에서 확인하기 위해 데이터를 요청한다. 3. DB 에 값이 있다면 1차 캐시에 저장 후, 이후 조회 시 1차 캐시에서 조회한다. 1차 캐시에 값이 저장 Member member = new Member(1L, "Jo"); em.persist(member); 조회 하는 방법 - em.find( 엔티티클래스, 찾는PK값 ) em.find(Member.class, 1L); 2022. 9. 20.
영속성 컨텍스트 - 엔티티 생명주기 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 먼저, 엔티티의 생명주기에 대해 확인해야 한다. 비영속과 준영속의 차이점에 대해 잘 확인하자. 1. 비영속 : 영속성 컨텍스트와 관계가 없는 상태 // 비영속상태 -> 생성만 한 상태 Member member = new Member(); member.setId(100L); member.setName("HelloJPA"); 2. 영속 : 영속성 컨텍스트에 관리되는 상태 // 영속상태 -> em.persist를 사용한다 em.persist(member); 3. 준영속 : 영속성 컨텍스트에 관계되어 있다가 분리된 상태 // 준영속상태 em.detach(member); 4. 삭제 : 삭제된 상태 //삭제 em.remove(member); 2022. 9. 20.
JPA 동작원리 JPA ( Java Persistence API ) - 자바 객체와 관계형 DB 사이를 매핑하는 ORM 기술 표준 - 스프링에서 제공하는 것이 아닌, JAVA 에서 제공하는 API - 라이브러리가 아닌, 인터페이스 구동방식 - 설정 정보를 조회 및 기준으로 하여 EntityManagerFactory를 생성한다. EntityManager는 하나만 생성하여 공유한다. - EntityManagerFactory 를 통해 EntityManager 가 생성된다 EntityManager는 쓰레드간 절대 공유하지 않는다. 사용하고 폐기한다. - JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다. 조회를 제외한 등록, 수정, 삭제 모두 META-INF/persistence.xml 예제 -persistence-unit.. 2022. 9. 20.