본문 바로가기

JPA

자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 개념 정리

객체와 관계형 데이터베이스의 차이

  • 상속
  • 연관관계
  • 데이터 타입
  • 데이터 식별 방법

 

주의사항

  • EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유
  • EntityManager는 스레드 간에 공유하면 안 된다(사용하고 버려야 함)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

 

영속성 컨텍스트

  • 영속성 컨텍스트는 논리적인 개념
  • EntityManager를 통해서 영속성 컨텍스트에 접근한다

[영속성 컨텍스트의 이점]

  • 1차 캐시 : 반복 가능한 읽기(repeatable read) 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션에서 제공
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) : 트랜잭션 커밋 순간 DB에 SQL을 보낸다
  • 변경 감지 (Dirty Checking)
  • 지연 로딩 (Lazy Loading)

[1차 캐시] 1차 캐시에서 조회
[1차 캐시] 데이터베이스에서 조회
[동일성 보장]
[트랜잭션을 지원하는 쓰기 지연]
[트랜잭션을 지원하는 쓰기 지연]
[변경 감지] 영속 상태에서 자바 컬렉션처럼 set 해주면 commit 시점에 DB에 반영됨

 

[플러시(flush)]

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
  • 영속성 컨텍스트를 비우지는 않음
  • 트랜잭션이라는 작업 단위가 중요. 커밋 직전에만 동기화하면 됨

[플러시가 발생하는 경우]

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

[플러시 하는 방법]

  • em.flush() : 직접 호출
  • 트랜잭션 커밋 : 플러시 자동 호출
  • JPQL 쿼리 실행 : 플러시 자동 호출

[플러시 모드 옵션]

  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시

 

[준영속 상태]

  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
  • 영속성 컨텍스트가 제공하는 기능을 사용 못함

[준영속 상태로 만드는 방법]

  • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
  • em.clear() : 영속성 컨텍스트를 완전히 초기화
  • em.close() : 영속성 컨텍스트를 종료

 

Entity의 생명주기

  • 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속 (managed) : 영속성 컨텍스트에 관리되는 상태
  • 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제 (removed) : 삭제된 상태

 

JPQL

  • JPQL은 엔티티 객체를 대상으로 쿼리
  • SQL은 데이터베이스 테이블을 대상으로 쿼리
  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
  • SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않음