JPA 소개 및 영속성 컨텍스트
강의참고 - 자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
ORM(Object-relational mapping 객체-관계 매핑)
- 객체지향 언어와 관계형 데이터베이스 간의 패러다임의 불일치를 해결 해주는 기술이다.
- SQL 중심의 개발에서 객체 중심의 개발이 가능해진다.
JPA(Java Persistence API)
- 자바에서는 ORM 프레임워크로 JPA(Java Persistence API)를 사용한다.
- JPA는 인터페이스의 모음으로 인터페이스의 구현체로 Hibernate, EclipseLink, DataNucleus 가 있다.
- 대표적으로 Hibernate를 사용한다.
- JAVA 애플리케이션과 JDBC 사이에서 동작한다.
- JAVA 애플리케이션에서 JPA를 호출하면, JPA 내부에서 JDBC를 사용해 SQL을 실행한다.
영속성 컨텍스트
- 영속성 컨텍스트는 논리적인 개념으로 눈에 보이지 않는다.
- EntityManager가 생성되면 1:1로 영속성 컨텍스트가 생성된다.
- EntityManager를 통해 영속성 컨텍스트에 접근할 수 있으며, Entity의 생명주기가 관리된다.
엔티티의 생명 주기
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- Member member = new Member();
- 영속(managed) : 영속성 컨텍스트에 관리되는 상태
- em.persist(member);
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- em.detach(member);
- 삭제(removed) : 삭제된 상태
- em.remove(member);
EntityManager를 통해 영속성 컨텍스트에 접근하는 방법
- persistence.xml 에서 설정 정보를 불러온다
- 해당 설정정보로 EntityManagerFactory를 생성한다.
- EntityManagerFactory에서 EntityManger를 생성한다.
- EntityManger를 통해 DB에 접근한다.
- 저장: em.persist(member)
- 조회: Member member = em.find(memberId)
- 수정: member.setName("변경할 이름")
- 삭제: em.remove(member)
플러시 (flush)
- 영속성 컨텍스트에 저장된 내용을 DB에 반영하려면 flush 를 호출한다.
- 영속성 컨텍스트의 변경을 감지하여 변경된 엔티티를 쓰기지연 SQL 저장소에 등록한다.
- 쓰기지연 SQL저장소의 쿼리를 DB에 전송한다.
- 플러시는 영속성 컨텍스트를 데이터베이스에 동기화하는 개념이다.
* 영속성 컨텍스트를 비우려면 flush호출 후에 em.clear()를 호출해야 한다.
- 영속성 컨텍스트를 flush 하는 방법
- em.flush() 를 호출
- 트랜젝션을 commit
- JPQL을 실행
영속 상태의 엔티티를 준영속상태로 변경하는 방법
- EntityManager의 detach() 메서드를 호출한다.
- EntityManager의 clear() 메서드를 호출한다. // 영속성 컨텍스트를 초기화
- EntityManager의 close() 메서드를 호출한다. // 영속성 컨텍스트를 종료
영속성 컨텍스트의 이점
- 1차 캐시
- 1차 캐시(영속성 컨텍스트) 에 엔티티를 저장해둔다.
- 동일성 보장
-같은 트랜젝션 안에서는 1차 캐시(영속성 컨텍스트)에 저장되어있는 같은 엔티티를 반환한다.
- 트랜잭션을 지원하는 쓰기지연 및 변경감지
- 1차 캐시(영속성 컨텍스트)에 CUD된 엔티티를 모아놨다가 트랜잭션을 커밋할 때 한번에 SQL을 전송한다.
* update 관련 메서드를 호출할 필요가 없다.
- 지연로딩
- 객체를 실제 사용할 때 SQL을 실행하여 로딩한다.
* 즉시로딩 : JOIN SQL로 연관된 객체를 미리 조회한다.