BE전문가 프로젝트

JPA란? 본문

JPA

JPA란?

원호보고서 2022. 8. 14. 13:32

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와 상속 - 저장

왼쪽이 객체 상속관계, 오른쪽이 Table 슈퍼타입 서브관계

데이터를 저장할 때 기존에는 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을 항상 같이 가져오도록 할 수 있다. 

 

옵션에 따라 지연로딩, 즉시로딩으로 바꾸어가며 사용할 수 있다.

Comments