JPA
ORM
- ORM Object Relational Mapping
- 자바 객체의 RDB 테이블을 매핑해서 SQL 작성 없이도 자바 코드로 데이터를 다루는 기술
- JPA Java Persistence API
- 자바의 ORM 표준 인터페이스
- 자바 객체와 데이터베이스를 연결해서 데이터를 관리한다.
- Hibernate
- JPA 인터페이스를 실제로 구현한 대표적인 프레임 워크
- 내부적으로 JDBC를 활용함
엔티티와 엔티티 매니저
-
엔티티: 데이터베이스의 테이블과 매핑되는 객체. 즉, 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체
-
엔티티 매니저: 엔티티를 관리하고, 데이터베이스와 애플리케이션 사이에서 객체를 생성/수정/삭제하는 역할을 함 -> 얘를 만드는
- 예시) 회원 2명이 가입한다고 하면?
영속성 컨텍스트 Persistence Context
- 성능 개선에 관심이 많으면 파고들어야 할 부분 (아래와 같은 최적화 기능 제공)
- 1차 캐시
- 반복적인 데이터 조회를 DB가 아닌 메모리에서 처리해 성능을 높임
- 쓰기 지연 Transactional Write-Behind
- 쿼리를 모았다가 트랜잭션 커밋 시점에 한꺼번에 실행해서 DB 부하를 줄임
- 변경 감지 Dirty Checking
- 엔티티의 상태 변화를 감지해서 자동으로 update 쿼리를 생성한다.
- 지연 로딩 Lazy Loading
- 데이터가 실제 필요한 시점에 쿼리를 날려서 불필요한 리소스 낭비를 방지함
엔티티의 생명주기
- 비영속: 객체만 생성된 상태
- 관리: 영속성 컨텍스트에 저장되어 JPA의 관리를 받는 상태
- 분리: 한 번 관리되었다가 연결이 끊긴 상태
- 삭제: 삭제가 예약된 상태
스프링 데이터 JPA
- 추상화: JPA를 더 쉽게 사용하도록 클래스 레벨에서 한 번 더 추상화
- JpaRepository: 해당 인터페이스를 상속받는 것만으로도 기본적인 CRUD 가능
- 쿼리 메서드: 메서드 이름만으로 쿼리를 자동 생성하며, 페이징 및 정렬 기능을 지원함
JPQL 과의 차이점
| 구분 | JPA (Spring Data JPA) | JPQL | Querydsl |
|---|---|---|---|
| 정체성 | 자바 ORM 기술 표준 및 추상화 라이브러리 | JPA 전용 객체지향 쿼리 언어 | JPQL 작성을 돕는 타입 세이프 빌더 |
| 작성 방식 | 인터페이스 메서드 이름 기반 | 문자열(String) 기반 쿼리 작성 | 자바 코드 기반 (Q-Class 활용) |
| 에러 감지 | 컴파일 시점 (메서드 명칭 등) | 런타임 시점 (실행 시 오류 발견) | 컴파일 시점 (자바 문법 체크) |
| 동적 쿼리 | 처리하기 매우 어려움 | 문자열 조합으로 가능 (가독성 낮음) | 매우 강력하고 편리함 |
| 가독성 | 단순 쿼리 시 좋음, 복잡해지면 최악 | SQL과 유사하여 익숙함 | 자바 코드로 작성되어 유지보수 좋음 |
| 성능 최적화 | 기본 기능만으로는 한계 있음 | Fetch Join 등으로 성능 개선 가능 | JPQL의 최적화 기능을 모두 활용 가능 |
참고: https://yozm.wishket.com/magazine/detail/2160/