이번 포스팅에서는 영속 → 준영속의 상태 변화를 알아보자. 📂 준영속 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라고 한다. 따라서, 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. 영속 상태의 엔티티를 준영속 상태로 만드는 방법엔 크게 3가지가 있다. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 em.clear() : 영속성 컨텍스트를 완전히 초기화 em.close() : 영속성 컨텍스트를 종료 순서대로 한 번 알아보자. 1️⃣ 엔티티를 준영속 상태로 전환 : detach() em.detach() 메소드는 특정 엔티티를 준영속 상태로 만든다. - detach() 테스트 코드 public void test..
📂 플러시 플러시( flush() )는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 구체적으로 다음과 같은 일이 일어난다. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리가 만들어 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.(등록, 수정, 삭제 쿼리) 📂 플러시 호출 방법 영속성 컨텍스트를 플러시하는 방법은 아래의 3가지이다. em.flush() 를 직접 호출 트랜잭션 커밋 시 플러시가 자동 호출 JPQL 쿼리 실행 시 플러시가 자동 호출 하나씩 살펴보자. 1️⃣ 직접 호출( em.flush() ) 엔티티 매니저의 flush() 메소드를 직접 호출..
영속성 컨텍스트의 특징은 다음과 같은 것들이 있다. 영속성 컨텍스트는 엔티티를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분하기 때문에, 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다. JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 저장된 엔티티를 데이터베이스에 반영한다. 이를 플러시(Flush)라고 하는데, 다음 포스팅에서 알아보도록하자. 영속성 컨텍스트가 왜 필요하고 어떤 이점이 있는지 엔티티를 CRUD하며 하나씩 알아보자. 1️⃣ 엔티티 조회 영속성 컨텍스트는 내부에 캐시를 가지고 있는데, 이를 1차 캐시라고 한다. 영속 상태의 엔티티는 모두 이곳에 저장된다. 쉽게 얘기하면 영속성 컨텍스트 안에 Map이 하나 있는데, Key는 @Id로 매핑한 식별자이..