JPA란 Java Persistence API의 약자로 자바 진영의 ORM 기술 표준이다.
ORM(Object-Relational Mapping)
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
- ORM 프레임워크가 중간에서 매핑해준다.
- 대중적인 언어에는 대부분 ORM 기술이 존재한다.
JPA(Java Persistence API)
- 현재 자바 진영의 ORM 기술 표준으로 인터페이스의 모음이다.
- JPA 2.1 표준 명세를 구현한 3가지 구현체로는 Hibernate, EclipseLink, DataNucleus가 있다.
- JPA 버전
- JPA 1.0(JSR 220) 2006년 : 초기 버전. 복합 키와 연관관계 기능이 부족하다.
- JPA 2.0(JSR 317) 2009년 : 대부분의 ORM 기능을 포함, JPA Criteria가 추가됨
- JPA 2.1(JSR 338) 2013년 : 스토어드 프로시저 접근, 컨버터(Converter), 엔티티 그래프 기능이 추가됨
JPA의 동작 과정
JPA는 애플리케이션과 JDBC 사이에서 동작한다. 즉, 개발자가 직접 JDBC API를 사용하는 것이 아니라 JPA 내부에서 JDBC API를 사용해 SQL을 호출하고 DB와 통신한다.
JPA 동작 - 저장
JPA 동작 - 조회
JPA를 왜 사용해야 하는가?
1. SQL 중심적인 개발에서 객체 중심으로 개발
2. 생산성
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
JPA를 사용할 때는 따로 쿼리 작성을 할 필요 없이 그냥 불러서 쓰면 된다. 특히 수정이 굉장히 간단하다.
3. 유지보수
기존 : 필드 변경시 모든 SQL을 수정해야 한다.
JPA : 필드만 추가하면 되고 SQL은 JPA가 처리한다.
4. 패러다임의 불일치 해결
4.1 JPA와 상속
- 저장
- 개발자가 할 일
- jpa.persist(album)
- 나머진 JPA가 처리
- INSERT INTO ITEM ...
- INSERT INTO ALBUM ...
- 개발자가 할 일
4.2 JPA와 연관관계
객체의 참조로 연관관계 저장이 가능하다.
member.setTeam(team);
jpa.persist(member);
4.3 JPA와 객체 그래프 탐색
신뢰할 수 있는 엔티티, 계층
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //자유로운 객체 그래프 탐색
member.getOrder().getDelivery();
}
}
JPA는 지연 로딩이라는 기능이 있어서 실제 객체를 조회하고 사용하는 시점에 SQL이 나가서 값을 가져올 수 있다.
4.4 JPA와 비교하기
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다.
동일한 트랙잭션에서 조회한 엔티티는 같음을 보장한다.
5. 성능
5.1 1차 캐시와 동일성(identity) 보장
1) 같은 트랙잭션 안에서는 같은 엔티티를 반환한다. (약간의 조회 성능 향상)
2) DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read를 보장한다.
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
SQL을 1번만 실행한다.
5.2 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
INSERT
1) 트랜잭션을 커밋할 때까지 INSERT SQL을 모은다.
2) JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 전송한다.
transaction.begin(); //[트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터 베이스에 보내지 않음
transaction.commit(); //[트랜잭션] 커밋
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보냄
5.3 지연 로딩(Lazy Loading)
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회
지연 로딩 예시에서 team 객체의 값을 건들때, 실제로 필요할 때 두번째 쿼리문이 실행되기 때문에 두번 통신을 한다. member를 사용할 때 거의 team도 사용한다면 member를 사용할 때 항상 team도 같이 가져오도록 option을 설정할 수 있다.(즉시 로딩)
6. 데이터 접근 추상화와 벤더 독립성
7. 표준
참고
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'개발 > JPA' 카테고리의 다른 글
[JPA] Hibernate 그리고 Spring Data JPA (0) | 2024.08.15 |
---|---|
[JPA] 영속성 관리 (0) | 2022.04.05 |
JPA 시작 (0) | 2022.04.02 |