JPA 소개
Java Persistence API
자바 진영의 ORM 기술 표준 (인터페이스)
ORM: Object Relational Mapping(객체 관계 매핑) 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
ORM 프레임워크가 중간에서 매핑

JPA의 동작
1. 저장
- Entity 분석
- INSERT SQL 생성
- JDBC API 사용
- 패러다임 불일치 해결
2. 조회
- SELECT SQL 생성
- JDBC API 사용
- ResultSet 매핑
- 패러다임 불일치 해결
JPA는 인터페이스의 모음
JPA 2.1 표준 명세를 구현한 3가지 구현체: 하이버네이트, EclipseLink, DataNucleus
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성: CRUD 코드가 만들어져 있음.
- 유지보수: 필드만 추가하면 됨, SQL은 JPA가 처리
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
JPA의 CRUD
• 저장: jpa.persist(member)
• 조회: Member member = jpa.find(memberId)
• 수정: member.setName(“변경할 이름”)
• 삭제: jpa.remove(member)
JPA와 패러다임의 불일치 해결
JPA와 상속
JPA와 연관관계
JPA와 객체 그래프 탐색 : 지연로딩 사용하여 신뢰할 수 있는 엔티티
JPA와 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
JPA의 성능 최적화 기능
1차 캐시와 동일성(identity) 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음 -> JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
- UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화 -> 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
지연 로딩(Lazy Loading)
- 지연 로딩: 객체가 실제 사용될 때 로딩. 쿼리가 많아진다는 단점
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회. 리소스 낭비되는 단점
* 중간 계층이 존재하면 버퍼링과 캐싱이 가능해진다.
* 지연 로딩 기반 개발. 최적화 단계에서 부분적으로 즉시 로딩 적용
* ORM은 객체와 RDB를 모두 잘 아는 상태에서 사용해야 한다.
02. JPA 시작
초기 설정: Maven project
라이브러리 추가
라이브러리 버전 관리


JPA 설정하기 - persistence.xml
• JPA 설정 파일
• /META-INF/persistence.xml 위치
• persistence-unit name으로 이름 지정
• javax.persistence로 시작: JPA 표준 속성
• hibernate로 시작: 하이버네이트 전용 속성
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.
SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능인 데이터베이스 방언을 지원한다.
ex. H2Dialect, OracleDialect, MySQLDialect 등
*JPA 구현체가 바뀌면 옵션들도 바뀌어야 한다.
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
JPA 구동 방식

엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다)
엔티티 매니저는 데이터베이스 커넥션과 물려서 실행되기 때문에 사용한 후 반드시 close 해줘야 한다.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행 (RDB의 특성)
*JPA가 커밋 시점에 엔티티에 변경을 감지하여 update 쿼리를 날린다.
*기본적으로 엔티티명, 필드명과 같은 이름의 테이블, 컬럼과 매핑된다. 옵션을 통해 다른 이름 지정 가능
@Entity
@Table(name = "USER")
class Member {
@Column(name = "username")
private String name;
}
JPQL 객체 지향 쿼리
테이블 간 조인이나 조건, 통계 등 복잡한 쿼리가 필요한 경우
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
테이블이 아닌 엔티티 객체를 대상으로 검색
특정 데이터베이스의 SQL에 의존하지 않게 미리 설정한 데이터베이스에 맞는 쿼리가 나간다.
'Advance I > Springboot & JPA' 카테고리의 다른 글
| 22.05.30 (0) | 2022.05.30 |
|---|---|
| 22.05.29 (0) | 2022.05.29 |
| 22.05.26 :: 자바 ORM 표준 JPA 프로그래밍 - 기본편 (0) | 2022.05.28 |
| 22.05.18 (0) | 2022.05.19 |
| 22.05.17 (0) | 2022.05.17 |