본문 바로가기

Back-End/JPA21

JPA) 병합 merge 준영속 상태의 엔티티를 영속상태로 만드려면 merge 를 사용한다. 새로운 영속상태의 엔티티를 반환한다. merge 실행 파라미터로 넘어온 준영속 엔티티 식별자값으로 1차캐시에서 조회 만약 1차캐시에 없으면 DB를 조회한다음 1차 캐시에 저장 조회한 영속 엔티티에 이전값을 채워넣는다. member와 mergeMember는 다른 인스턴스기 떄문에 보통은 병합시 사용했던 변수를 참조해서 하는것이 좋다. 비영속 병합 비영속 상태의 엔티티도 영속상태로 변경할 수 있다. 정리 병합은 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 없으면 DB를 조회한다. 만약 DB에도 없다면 새로운 엔티티를 생성하여 병합한다. 병합은 영속상태 여부를 판단하지 않는다. 그저 식별자 값으로 조회가 가능하면 불러서.. 2022. 3. 11.
JPA) 준영속 상태 영속성 컨텍스트가 관리하는 영속상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라고 한다. 따라서 준영속 상태의 엔티티는 영속성 컨텍스트의 기능을 사용할 수 없다. 영속상태의 엔티티를 준영속으로 만드는 방법은 3가지 이다. em.detech() 호출 em.detech() 를 호출하는 순간 부터 영속성 컨텍스트에 관리를 받지 못하고 1차 캐시 부터 쓰기지연 SQL 까지 해당 엔티티를 관리하기 위한 정보가 제거된다 영속상태 였다가 영속성 컨텍스트가 더이상 관리하지 않게된 상태를 준영속 상태라고한다. 이떄는 어떠한 영속성 컨텍스트의 기능이 실행되지 않는다. DB에 저장도 되지않음. 2. em.clear() em.detech가 하나의 엔티티를 준영속으로 만들었다면 em.clear() 는 영속성 컨텍스.. 2022. 3. 11.
JPA) Flush 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영한다. 구체적으로 다음과 같은 일이 발생한다. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티와 스냅샷을 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티는 SQL을 만들어 저장소에 저장 DB에 전송한다. 영속성 컨텍스트를 플러시하는 방법은 3가지 이다. 직접 em.flush() 를 호출 트랜잭션 커밋시 자동으로 호출 JPQL 쿼리 실행시 자동으로 호출 직접 호출 방식은 테스트 또는 타 프레임워크와 JPA를 쓸 떄빼고 거의 미사용 커밋시 자동 호출하는 이유는 변경 내용을 DB에 전달하지 않고 커밋만 하면 내용의 변화가 없기 때문에 꼭 커밋전 호출해서 반영을 해야한다 이러한 문제를 방지하기 위해서 자동호출이 실행된다. persist로 3개의 객체를 .. 2022. 3. 11.
JPA) 변경 감지 (Dirty Check) JPA로 엔티티를 수정할 떄 단순히 조회해서 데이터만 변경하면 된다. 트랜잭션 커밋 직전에 수정하는 기능을 써야하는 데 따로 없다. 사실 JPA는 변경 감지 기능을 사용해서 엔티티의 변화를 DB에 자동반영한다. JPA는 영속성 컨텍스트에 엔티티를 보관할 때, 최초 상태를 복사해서 저장해 두는데 이것을 스냅샷 이라고 한다. 그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. 순서 트랜잭션 커밋시 EM 내부에서 먼저 flush가 호출 된다. 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다. 변경된 엔티티가 있으면 쓰기 지연 저장소에 SQL을 보낸다. 쓰기지연 저장소의 SQL을 DB로 전달한다. DB 트랜잭션을 커밋을 한다. 변경 감지 는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티만.. 2022. 3. 11.
JPA) 영속성 컨텍스트 개념 및 특징 엔티티를 영구 저장하는 환경이라는 뜻이다. EM 으로 Entity를 저장하거나 조회하면 EM은 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 엔티티의 생명주기 엔티티에는 4가지 상태가 존재한다. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속 : 영속성 컨텍스트에 저장된 상태. 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 : 삭제된 상태 영속성 컨텍스트의 특징 영속성 컨텍스트와 식별자 값 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 떄문에 반드시 영속상태는 식별자 값이 있어야한다. 없다면 예외가 발생한다. 2. 영속성 컨텍스트와 DB 저장 JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영하는데 이것을 flush 라고 한다. 영속성 컨텍.. 2022. 3. 11.
JPA) EM, EMF EMF (엔티티 매니저 팩토리)는 말 그대로 EM(엔티티 매니저)를 만드는 공장인데 생성비용이 크다. 따라서 애플리케이션 전체에서 공유하도록 설계되어 있다. 반면 공장에서 생성되는 엔티티 매니저의 비용은 거의 없다. EMF 는 여러 스레드가 동시에 접근해도 안전하지만, EM 은 여러 스레드가 접근하면 동시성 문제로 인해서 공유하면 안된다. EM 은 예를들면 트랜잭션이 시작할 떄 커넥션을 획다. 2022. 3. 11.