[JPA 2] JPA와 영속성 컨텍스트

HyeonJeong·2023년 1월 2일
0

spring JPA 공부하자

목록 보기
3/6

오늘은 JPA 공부에 대한 내용을 적어보려고 한다.

📌JPA 소개


1. 문제 상황

  • SQL 중심 개발 - 객체 CRUD를 위한 다양한 쿼리 필요
  • 객체(지향 프로그래밍)와 RDB 사이 패러다임 불일치
  1. 상속

    • DB에 저장할 객체에는 상속 관계 사용x
    • java 컬렉션에서 조회 : 부모 타입 조회 → 다형성
  2. 연관관계

    • 객체의 참조와 테이블의 PK(외래)키 대응을 위한 객체 모델링
    • 자바 컬렉션이 객체 관리
    • 처음 실행하는 SQL에 따라 탐색 범위 결정
    • 엔티티 신뢰 문제
    • 모든 객체 미리 로딩x
  3. 데이터 타입

  4. 데이터 식별 방법

    • 자바 컬렉션에서 조회시, 동등성 보장(==)

2. ORM 객체 관계 매핑 & JPA

  • 객체대로, RDB대로 설계 후 ORM 프레임워크가 중간에 매핑
  • JPA : 인터페이스 모음
    • 장점
      - 객체 중심 개발, 패러다임 불일치 해결, 표준
      - 생산성, 유지 보수, 성능
      - 데이터 접근 추상화와 벤더 독립성

      => JPA 사용 시, SQL은 알아서 처리

3. JPA와 패러다임의 불일치 해결

  • JPA와 상속 : persist → find
  • JPA와 연관관계 : set → persist
  • JPA와 객체 그래프 탐색 : find를 신뢰o
  • JPA와 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음

4. JPA 성능 최적화 기능

  1. 1차 캐시와 동일성 보장
    • 같은 트랜잭션 안에서는 같은 엔티티
    • 약간의 조회 성능 향상

  2. 트랜잭션을 지원하는 쓰기 지연
    • commit까지 모았다가 JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
    • UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화

  3. 지연 로딩
    - 객체가 실제 사용될 때 로딩 ↔ 즉시 로딩 : 한번에 연관된 객체까지 미리 조회


5. 동작 - JPA & JPQL

1. 프로젝트 생성 - Maven (과거) & pom.xml(라이브러리 추가)

  • 자바 라이브러리, 빌드 관리
  • 라이브러리 자동 다운로드 및 의존성 관리

2. JPA 사용

  • JPA는 특정 DB에 종속x = 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
    → 하이버네이트는 40가지 이상의 데이터베이스 방언 지원
  • 설정 정보 (persistence.xml) → EntityManagerFactory → EntityManager
    • 엔티티 매니저 팩토리 : 1개 생성해서 공유
    • 엔티티 매니저 : 쓰레드 간에 공유X

3. 객체 - 테이블 매핑

  • class : @Entity
  • PK 필드 : @Id

4. JPQL 객체 지향 쿼리 언어

  • JPA를 통해 엔티티 객체 중심 개발 가능하지만, 검색 쿼리 문제
  • 엔티티 객체를 대상으로 검색 시, 모든 데이터를 객체로 변환은 불가
  • SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리 ↔ 데이터베이스 테이블을 대상
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존X


0개의 댓글