JPA시작

이승주·2024년 7월 23일

JPA 구동 방식

  • @Entity: JPA가 관리할 객체
  • @Id: 데이터베이스 PK와 매핑
    !주의: 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유, 엔티티 매니저는 쓰레드간에 공유X, ** JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발
  • 문제는 검색 쿼리
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL이 필요
  • JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공
    차이점은 JPQL(객체지향 SQL)은 엔티티 객체를 대상으로 쿼리, SQL은 데이터베이스 테이블을 대상으로 쿼리

영속성 컨텍스트!!

  • JPA에서 가장 중요한 2가지는 객체와 관계형 DB 매핑하기, 영속성컨텍스트이다.

  • 영속성 컨텍스트: "엔티티를 영구 저장하는 환경"이라는 뜻

  • EntityManager.persist(entity) -->DB에 저장하는게 아닌 엔티티는 영속성 컨텍스트에 저장

  • 영속성 컨텍스트는 논리적인 개념으로 엔티티 매니저를 통해서 영속성컨텍스트에 접근한다.

엔티티의 생명 주기

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

비영속

  • 객체를 생성하고 아무것도 안한 상태(JPA랑 전혀 관계가 없는 상태)

영속

->영속 상태가 된다고 DB에 쿼리가 날라가는게 아님. 트랜잭션 커밋하는 시점에 DB에 쿼리가 날라감.

준영속, 삭제


영속성 컨텍스트의 이점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지(Dirty checking)
  • 지연 로딩(Lazy loading)

엔티티 조회,1차캐시


영속엔티티의 동일성 보장

  • 1차 캐시로 반복가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

엔티티 등록(트랜잭션을 지원하는 쓰기 지연)

엔티티 수정(변경 감지)


업로드중..
->최초로 영속성컨텍스트로 들어왔을 떄 스냅샷을 찍고, 그 스냅샷과 비교하여 바뀌었으면 update쿼리를 만들어서 쓰기 지연 sql저장소에 만들어두다가 커밋될떄 들어가 반영됨.

플러시

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
    플러시 발생-> 변경 감지, 수정된 엔티티 쓰기 지연 sql 저장소에 등록, 쓰기 지연 sql 저장소의 쿼리를 데이터베이스에 전송

  • 영속성 컨텍스트를 플러시 하는 방법

  • em.flush() - 직접 호출

  • 트랜잭션 커밋 - 플러시 자동 호출

  • JPQL 쿼리 실행 - 플러시 자동 호출

!!플러시는 영속성 컨텍스트를 비우지 않고,영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화한다. 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면 됨.

profile
백엔드개발자가 되고싶습니다.

0개의 댓글