본문 바로가기

전체 글102

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.
JPA란? JPA 는 데이테베이스 기술이라기 보다 애플리케이션 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해주는 객체지향 기술이다. JPA 을 이용해 객체 관점에서 복잡한 문제를 다루는데 만 집중하면 자칫 이면에서 일어나는 데이터베이스 작업의 최적화를 놓칠 수 있다. 데이터베이스는 중요한 IT 자산이며, 확장에 비용이 많이드는 리소스로 항상 최적화를 염두해 두어야 한다. JPA/Hibernate 는 SQL 쿼리를 직접 작성할 때보다 월등한 개발속도와 유지보수성을 누릴 수 있다. JPA 를 사용해서 얻을 수 있는 가장 큰 효과 SQL이 아닌 객체 중심으로 개발하여 생산성 및 유지보수의 향상 테스트 작성의 용이 개발단계에서의 DB 마이그레이션 용이 2022. 3. 11.
JPA) 1차 캐시 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시 라고 한다. 영속 상태 엔티티는 모두 이곳에 저장된다. 쉽게 이야기 하면 영속성 컨텍스트 내부에 Map으로 된 컬렉션이 있는데 이곳에 id를 식별자로 하는 엔티티 인스턴스가 저장된다. Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); em.persist(member); 1차 캐시의 키는 식별자 값이다. 그리고 식별자 값은 DB의 기본 키와 매핑되어있다. 따라서 영속성 컨텍스트에 데이터를 저장하고 조회하는 모든 기준은 DB 기본 키값이다. 1차 캐시에서 조회 em.find() 를 호출 하면 우선 1차 캐시에서 식별자 값으로 엔티티를 찾는다. 만약 .. 2022. 3. 11.