# JPA 소개

객체를 자바 컬렉션에 저장, 조회하듯이 DB에 저장, 조회하기 위해 등장

JPA란?

* Java Persistence API
* 자바 진영의 ORM 기술 표준

ORM이란?

* Object-relational mapping(객체 관계 매핑)
* 객체는 객체대로 설계
* 관계형 데이터베이스는 관계형 데이터베이스대로 설계 - ORM 프레임워크가 중간에서 매핑
* 대중적인 언어에는 대부분 ORM 기술이 존재

JPA는 애플리케이션과 JDBC 사이에서 동작한다!

![Java - JPA - DB 구조](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeU6gJGTr81p0_RvuOV%2F-MeU6wWuLMOWH76z4Eru%2FScreen%20Shot%202021-07-13%20at%206.07.55%20PM.png?alt=media\&token=043f7122-9cbc-4761-847c-3a9f30a208d9)

![JPA 동작 - 저장](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeU6gJGTr81p0_RvuOV%2F-MeU74qUGRra6a1ILBTL%2FScreen%20Shot%202021-07-13%20at%206.08.24%20PM.png?alt=media\&token=6796308e-232d-4688-8fa6-0081b49ee8bc)

![JPA 동작 - 조회](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MeU79bRwldvdyE1CDcz%2F-MeU7IDkba0oQKZeteG7%2FScreen%20Shot%202021-07-13%20at%206.09.35%20PM.png?alt=media\&token=ba1cdce4-8928-4fb5-86ad-99203d6699bb)

JPA는 표준 명세(Specification)

* JPA는 인터페이스의 모음이다.
* JPA 2.1 표준 명세를 구현한 3가지 구현체\
  하이버네이트, EclipseLink, DataNucleus

JPA를 사용해야하는 이유

* SQL 중심적인 개발에서 객체 중심으로 개발
* 생산성 향상
* 유지보수 편리
* 패러다임의 불일치 해결
* 성능 향상
* 데이터 접근 추상화와 벤더 독립성 - 표준

JPA와 CRUD = 생산성 향상

• 저장: jpa.persist(member)\
• 조회: Member member = jpa.find(memberId) \
• 수정: member.setName(“변경할 이름”)\
• 삭제: jpa.remove(member)

유지보수 편리 : 기존에는 필드 변경시 모든 SQL 수정\
Member 객체에 필드하나 추가할 경우 발생하는 SQL 쿼리

```sql
INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES
SELECT MEMBER_ID, NAME, TEL FROM MEMBER M
UPDATE MEMBER SET ... TEL = ?
```

JPA에서 필드 수정 : 필드만 추가하면 됨, SQL은 JPA가 처리한다!

JPA와 패러다임의 불일치 해결\
1.JPA와 상속\
2.JPA와 연관관계\
3.JPA와 객체 그래프 탐색\
4.JPA와 비교하기

JPA와 상속 - 저장\
개발자는 아래 코드만 작성하면 나머지 SQL 쿼리는 JPA가 처리해준다!\
SQL 처리 : INSERT INTO ITEM ... INSERT INTO ALBUM ...

```java
jpa.persist(album);
```

JPA와 상속 - 조회\
개발자는 아래 코드만 작성하면 나머지 SQL 쿼리는 JPA가 처리해준다!\
객체 타입과 식별자만 넣어주면됨! find(Member.class,id)\
SQL 처리 : SELECT I.\*, A.\*\
&#x20;  FROM ITEM I\
&#x20;  JOIN ALBUM A ON I.ITEM\_ID = A.ITEM\_ID

```java
Album album = jpa.find(Album.class, albumId);
```

JPA와 연관관계, 객체 그래프 탐색\
연관관계 저장

```java
member.setTeam(team);
jpa.persist(member);
```

객체 그래프 탐색

```java
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
```

신뢰할 수 있는 엔티티, 계층\
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다!

JPA의 성능 최적화 기능

1. 1차 캐시와 동일성(identity) 보장\
   \- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상\
   \- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind) \
   \- 트랜잭션 커밋할 때까지 INSERT SQL 모음(**커밋하는 순간에 DB에 INSERT SQL 모아 보냄**)\
   \- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
3. 지연 로딩(Lazy Loading)\
   \- UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화

   \- 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋

지연 로딩과 즉시 로딩\
• 지연로딩:객체가실제사용될때로딩\
• 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회

(여담)OOP, RDB 다룬는 기술 둘 다 잘해야한다. 특히(의외로?) 둘 중 하나만 꼽자면 RDB 다루는 기술이 더 중요하다고 한다.
