오늘은 JPA 공부에 대한 내용을 적어보려고 한다.
📌JPA 소개
1. 문제 상황
- SQL 중심 개발 - 객체 CRUD를 위한 다양한 쿼리 필요
- 객체(지향 프로그래밍)와 RDB 사이 패러다임 불일치
-
상속
- DB에 저장할 객체에는 상속 관계 사용x
- java 컬렉션에서 조회 : 부모 타입 조회 → 다형성
-
연관관계
- 객체의 참조와 테이블의 PK(외래)키 대응을 위한 객체 모델링
- 자바 컬렉션이 객체 관리
- 처음 실행하는 SQL에 따라 탐색 범위 결정
- 엔티티 신뢰 문제
- 모든 객체 미리 로딩x
-
데이터 타입
-
데이터 식별 방법
2. ORM 객체 관계 매핑 & JPA
- 객체대로, RDB대로 설계 후 ORM 프레임워크가 중간에 매핑
- JPA : 인터페이스 모음
- 장점
- 객체 중심 개발, 패러다임 불일치 해결, 표준
- 생산성, 유지 보수, 성능
- 데이터 접근 추상화와 벤더 독립성
=> JPA 사용 시, SQL은 알아서 처리
3. JPA와 패러다임의 불일치 해결
- JPA와 상속 : persist → find
- JPA와 연관관계 : set → persist
- JPA와 객체 그래프 탐색 : find를 신뢰o
- JPA와 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음
4. JPA 성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티
- 약간의 조회 성능 향상
- 트랜잭션을 지원하는 쓰기 지연
- commit까지 모았다가 JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
- UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
- 지연 로딩
- 객체가 실제 사용될 때 로딩 ↔ 즉시 로딩 : 한번에 연관된 객체까지 미리 조회
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