BE전문가 프로젝트
JPA란? 본문
JPA
-Java Persistence API
- 자바 진영의 *ORM 기술표준
*ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
= 대중적인 언어에는 대부분ORM 기술이 존재(type script, python 등)
JPA는 애플리케이션과 JDBC 사이에서 동작함
개발자가 직접 JDBC API를 사용하는 것이 아닌 JPA에게 명령하면 API를 사용하하도록 함
JPA 동작(저장)
적절한 sql문을 만들어 jdbc API를 통해 db로 보냄
JPA는 표준 명세
- jpa는 인터페이스의 모음
- jpa 2.1 표준 명세를 구현한 3가지 구현체(하이버네이트, EclipseLink, DataNuceus) 80%이상이 하이버네이트
JPA의 장점
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
생산성
- 저장 : jpa.persist
- 조회 : member memeber = jpa.find(memberId)
- 수정 : member.setName
- 삭제 : jpa.remove(member)
유지보수
- JPA : 필드만 추가하면 됨, SQL은 JPA가 처리해줌
JPA와 패러다임의 불일치 해결
1. JPA와 상속
2. JPA와 연관관계
3. JPA와 객체 그래프 탐색
4. JPA와 비교하기
1. JPA와 상속 - 저장
데이터를 저장할 때 기존에는 insert문을 2개 만들어야해지만, jpa가 쿼리문을 알아서 2개 생성하여 db에 보내준다.
1. JPA와 상속 - 조회
ex) movie 테이블을 가져오고 싶다면 알아서 join해서 가져온다.
2,3 JPA와 연관관계, 객체 그래프 탐색
자바 컬랙션에 넣었던것 처럼 getTeam으로 쉽게 하위 개체를 가져올 수 있다.
JPA와 비교하기
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
JPA의 성능 최적화 기능
1. 1차 캐시와 동일선(identity)보장
2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
3. 지연 로딩(Lazy Loading)
1. 1차 캐시와 동일성 보장
1. 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
2. DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read보장
JPA에서는 캐싱을 하여 sql이 한번만 실행된다.(트랜잭션 사이에서의 캐싱이기 때문에 성능에는 큰 차이가 없다.)
2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)(버퍼링기능)
1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
메모리에 저장했다가 commit되는 순간 쿼리 3개를 한번에 보내준다.
3. 지연 로딩(Lazy Loading)
- 지연로딩 : 객체가 실제 사용될 때 로딩
member를 꺼내온 후 하위 객체인 team을 가져올 때 알맞은 쿼리문을 다시 보낸다.
- 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
member를 조회할 때 Team을 항상 가져온다면 member를 조회할 때 join으로 한방쿼리를 작성하여 팀을 같이 가져오는 것이 더 효율적일 것이다. JPA에는 옵션을 통해 member를 가져올 때 team을 항상 같이 가져오도록 할 수 있다.
옵션에 따라 지연로딩, 즉시로딩으로 바꾸어가며 사용할 수 있다.
'JPA' 카테고리의 다른 글
JPQ의 작동원리와 JPA 애플리케이션 개발 및 JPQL 맛보기 (0) | 2022.09.18 |
---|---|
JPA 프로젝트 생성(HelloWolrd) 후 DB 설정 (0) | 2022.09.05 |
JPA 탄생배경 (0) | 2022.08.03 |
1.3 Products Service 설계 - Products(ProductService.interface) (0) | 2022.05.12 |
1.2 Products Repository 설계 - Products(ProductRepository.interface) (0) | 2022.05.12 |