Intro

MINIMI·2023년 4월 10일

JPA

목록 보기
1/9
post-thumbnail

1-1. JPA 개념

1) JPA란?

  • 자바 진영의 ORM(Object Relational Mapping) 기술 표준으로 ORM 기술을 사용하기 위한 표준 인터페이스 모음

2) 특징

  • 영속성 컨텍스트가 엔티티를 생명주기를 통해 관리
  • native SQL을 통해 직접 SQL을 해당 DB에 맞게 작성
  • DBMS별로 dialect 제공

3) 사용 이유

  • 장점
    • 객체지향과 관계지향이라는 서로 다른 패러다임 불일치 해소
    • 객체지향 패러다임 중심의 개발 가능
    • 개발자가 SQL문을 직접 작성하지 않아도 되어서 생산성 향상
    • 설정 및 필드 변경시 SQL이 자동 수정 -> 유지보수성 향상
    • 캐시를 활용한 성능 최적화로 인해 트랜잭션 처리 시간 단축
  • 단점
    • 복잡한 SQL에 부적합
    • JPA를 제대로 이해하지 못하고 작성시 성능 저하 발생
    • 추가 라이브러리를 활용해야 할 수 있음

1-2. JPA 원리

1) 기본 동작 방식

  • Java 어플리케이션과 JDBC 사이에서 동작하며 내부적으로 JDBC API 활용
  • 엔티티를 저장하는 환경인 영속성 컨텍스트(Persistence Context)를 통해 엔티티 보관 및 관리

    엔티티(Entity) : @Entity @Table @Id @Column 과 같은 어노테이션을 통해 SQL이 아닌 DB 테이블과 매핑되게 작성 된 클래스

2) 엔티티의 영속성 컨텍스트에서의 생명 주기

  • 엔티티 매니저가 엔티티를 저장하는 공간으로 엔티티를 보관하고 관리
  • 엔티티 매니저가 생성될 때 하나의 영속성 컨텍스트가 만들어짐
  • 엔티티의 생명 주기

3) 영속성 컨텍스트가 엔티티를 관리하는 원리

  • 1차 캐시
    • 영속성 컨텍스트 내부에 Map으로 관리 되는 캐시이며, 이 곳에 있는 엔티티는 캐시에서 바로 불러와서 조회 성능이 올라감
  • 동일성 보장
    • 반복해서 호출 시 1차 캐시에서 같은 엔티티 인스턴스를 가져옴
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터 베이스에 저장(flush) 대신 쓰기 지연 SQL 저장소에 INSERT SQL을 차곡차곡 쌓게 됨.
    • 커밋시에 쿼리를 데이터 베이스로 보냄.
  • 플러시 절차
    • 영속성 컨텍스트에 보관할 때 최초 엔티티 상태를 복사해서 스냅샷으로 저장해두고, 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾아서 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 보냄
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 저장.
    • 플러시를 하는 경우
      • em.flush()를 직접 호출
      • 트랜잭션 커밋 시 플러시 자동 호출
      • JPQL 쿼리 실행 시 플러시 자동 호출
  • 변경 감지
    • SQL에 의존적이지 않도록 엔티티의 데이터 변경을 감지하고 데이터베이스에 자동으로 반영하는 기능
    • 영속성 컨텍스트에 보관할 때 최초 엔티티 상태를 복사해서 저장한 스냅샷과 이를 비교하여 감지.
    • 영속 상태의 엔티티에만 적용
  • 변경 감지 절차
    • 플러시 호출
    • 엔티티와 스냅샷 비교 후 변경 된 엔티티 찾기
    • 변경된 엔티티와 관련된 수정 쿼리 생성 후 쓰기 지연 SQL 저장소에 보냄
    • 쓰기 지연 저장소의 SQL을 데이터베이스로 보냄
    • 데이터베이스에서 트랜잭션 커밋
profile
DREAM STARTER

0개의 댓글