Today I Learned - 52
Spring - 12
- JPA, Java Persistence API
- @Query 애너테이션
JPA(Java Persistence API)
- JPA(Java Persistence API)란?
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 자바 ORM 기술에 대한 표준 API(자바에서 제공)
ORM(Object Relation Mapping): 자바 클래스와 DB테이블을 매핑 (sql을 매핑하지 않음!!!)
- 단점
- (1) 복잡한 쿼리 처리 어려움
Native SQL 써서 해결할 수 있지만, 그러면 특정 DB에 종속되는 문제
- (2) 성능 저하 위험
객체 간 매핑 설계 잘못하면 성능 저하 발생
- (3) 학습시간, 오래 걸림
- (1) 복잡한 쿼리 처리 어려움
Mapper vs ORM
- (1) SQL Mapper
- SQL ←
mapper
→ 자바 객체(Object 필드) - SQL문 명시하여 디비 조작(직접적)
- 단순히 필드를 매핑시키는 것이 목적
- ex. Mybatis, jdbcTemplate
- SQL ←
- (2) ORM(Object-Relation Mapping/객체-관계 매핑)
- DB 테이블 ←
ORM
→ 자바 객체(Object 필드) - 객체 간 관계를 바탕으로 SQL문 자동 생성(간접적)
SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.
- DB 데이터의 관계를 자바 객체에 반영하는 것이 목적
- ex. JPA, Hibernate
- DB 테이블 ←
JPA 동작 방식
- 동작 흐름
(1) Entity Manager Factory
-> create 작업
(2) Entity Manager
-> operation 작업
(3) Persistence Context(Entity1, Entity2…) - Entity: 데이터베이스의 테이블에 1 대응하는 클래스
@Entity
가 붙은 클래스는 JPA에서 관리 - Entity Manager Factory: 엔티티 매니저 인스턴스를 관리하는 주체
- 애플리케이션 실행 시 한 개만 생성
- 사용자 요청이 오면, ‘Entity Manager’ 생성
-
Entity Manager: Persistence Context에 접근, Entity 대한 DB 작업 제공
- Persistence Context(영속 컨텍스트): Entity를 영구 저장하는 환경
Entity 생명주기
- (1) New(비영속)
- New 키워드로 생성된 상태
- (2) Managed(영속)
- Entity가 Persistence Context에 저장된 상태
- 트랜잭션, 커밋 시점에 데이터베이스에 반영됨
- (3) detached(준영속)
- 저장되었던 Entity가 분리된 상태
- (4) removed(삭제)
- Persistence Context와 DB에서 삭제된 상태
- 관련 메서드
- find(): Persistence Context에서 Entity 검색
없을 경우 DB에서 찾아서 Persistence Context에 저장
- persist(): Entity를, Persistence Context에 저장
- remove(): Entity를, Persistence Context에서 삭제
- flush(): Persistence Context에 저장한 내용을 DB에 반영
- find(): Persistence Context에서 Entity 검색
Persistence Context 사용 장점
- 버퍼링, 캐싱
APP과 DB 사이에 중간 계층 생성 => 버퍼링, 캐싱 가능
- (1) 1차 캐시
1차 캐시로 존재, Map<key, value> 형식으로 저장
- (2) 동일성 보장(트랜잭션)
항상 특정 키 값에 매핑된 특정 엔티티 조회됨
- (3) 트랜잭션을 지원하는 ‘쓰기 지연’
- (4) 변경 감지
- 1차 캐시, 처음 불러온 엔티티의 스냅샷 갖고 있음
- => 1차 캐시에 저장된 내용과 스냅샷 비교
- => 변경 내용 있을 시, Update SQL문을 쓰기 지연 SQL 저장소에 보관
- => 커밋 시점에 변경 내용을 자동 반영
Spring DATA JPA @Query
- @Query 애너테이션 사용
- JPQL(Java Persistence Query Language)라는 객체지향 쿼리 사용
SQL과 비슷
- JPQL(Java Persistence Query Language)라는 객체지향 쿼리 사용
- 특징
- 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
- SQL을 추상화해서 사용하기 때문에, 특정 DB에 종속되지 않음
- JPQL로 작성했다면, DB가 변경되어도 애플리케이션에 영향없음
- 단점
- 해당 쿼리문에 오타가 생겨도, 컴파일 오류 잡아내지 못함
- Spring Data JPA Querydsl
- @Query 단점 보완을 위한 기능