JPA(Java Persistence API) 기초

bagt13·2022년 8월 12일
0

JPA

목록 보기
9/13

JPA (Java Persistence API)란?

자바 진영의 ORM 기술의 표준(추상체)으로써, 구현체로는 Hibernate가 있다.


ORM (Object-relational mapping)

객체와 데이터베이스의 차이를 ORM 프레임워크가 중간에서 매핑하여 해결해준다.


JPA는 애플리케이션과 JDBC 사이에서 동작한다



✅ JPA의 장점

1. 생산성

JPA는 쿼리를 작성해주기 때문에, 기존의 애플리케이션 개발 방식인 객체 중심으로 편리하게 개발할 수 있다.


2. 유지보수

기존의 SQL문을 직접 작성하여 쿼리를 날릴 때에는, 객체의 필드에 변경사항이 생기면 모든 SQL을 수정했어야 했다.

  • JPA의 경우 필드를 변경하면 변경내용을 알아서 SQL에 반영해준다.

3. 자유로운 객체 그래프 탐색 가능

JPA를 사용하면 일반적인 객체 참조 방식을 사용하기 때문에, 자유로운 객체 그래프 탐색이 가능하다.



JPA의 성능 최적화 기능

JPA의 장점 중 하나인 높은 생산성을 언급했는데, JPA는 다음과 같은 기능을 통해 높은 생산성을 제공한다.

  • 1차 캐시와 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 지연 로딩(Lazy Loading)


JPA의 구동 방식

위 과정을 거쳐 EntityManager를 생성할 수 있으며, 이 EntityManager를 통해 영속성 컨텍스트에 접근할 수 있다.


❗️ 주의할 점

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다

  • 엔티티 매니저쓰레드간에 공유하지 않는다. (사용하고 버려야 한다)

  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다



✅ 영속성 컨텍스트

영속성 컨텍스트의 이점

  1. 1차 캐시와 동일성(identity) 보장
  2. 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
  3. 변경 감지(Dirty Checking)
  4. 지연 로딩(Lazy Loading)

1. 1차 캐시와 동일성 보장

엔티티 조회 시 1차 캐시에서 먼저 조회하고, 없을 경우 DB에서 조회한다.
DB에서 조회한 엔티티는 1차캐시에 저장되며, 해당 객체는 동일한 트랜잭션 내에서 동일한 객체임을 보장한다.


2. 쓰기 지연 (transactional write-behind)

Entity를 영속화(persist)하면 일단 영속성 컨텍스트와 쓰기 지연 SQL 저장소에 저장되며, 이후 커밋(commit) 시에 모든 쿼리가 DB에 날아간다.


3. 변경 감지 (Dirty Cheking)

엔티티에 변경사항이 생길 경우, 1차 캐시의 엔티티와 스냅샷을 비교해서 UPDATE SQL을 생성하여 쿼리를 날려준다.


4. 지연 로딩 (Lazy Loading)

DB에서 객체를 조회할 때에, 연관된 객체들을 모두 가져오는 것이 아니라, 해당 객체가 사용되는 시점에 DB에 쿼리를 날려 데이터를 가져온다.

즉시 로딩으로 설정할 수는 있으나, 대부분의 경우 지연 로딩을 사용하는 것이 권장된다.



✅ JPQL

JPA를 사용하면 엔티티 객체를 중심으로 개발할 수 있지만, 검색 쿼리를 작성할 경우에 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문에, 문제가 발생한다.

-> 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 이 필요하다


JPQL이란?

테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이며, SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.


기존 SQL문과의 차이점

  • JPQL : 엔티티 객체를 대상으로 쿼리
  • SQL : DB 테이블을 대상으로 쿼리

예시

Spring Data JPA를 사용한 예시이긴 하지만, @Query 내부의 jpql문은 jpql의 가장 기본적인 형태이며, jpql에서 지원하는 fetch join을 사용한 예시이다.



  • fetch Join을 정리한 내용 : JPA fetch join에 대하여
  • 자료 출처 : 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편
profile
주니어 백엔드 개발자입니다😄

0개의 댓글