1. 관계형 DB와 객체지향의 한계 ( SQL 중심적인 개발 문제점 )
- 객체지향 프로그래밍에서 관계형DB를 사용함에 있어 아래와 같은 차이가 있다.
- 상속 : 객체지향 (O), DB (X)
- 연관관계 : 객체 (자유로움) , DB (복잡함)
- 객체다운 모델링 : 객체 (O), DB (X)
- 엔티티 신뢰 문제 : 객체(O), DB(X)
- 또한 모든 객체를 미리 로딩할 수는 없다.
- JPA를 사용하면, 객체와 관계형 DB의 패러다임 불일치를 해결할 수 있다.
2. ORM?
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
3. JPA란?
- Java Persistence API로 자바 진영 ORM 표준 기술이다.

- JPA는 인터페이스의 모음이며, 애플리케이션과 JDBC 사이에서 동작한다.
JPA 사용이유
- SQL 중심적인 개발에서 객체 중심으로 개발
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
- 생산성
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(“변경할 이름”)
- 삭제: jpa.remove(member)
- 유지보수
- 기존 필드 변경시 모든 SQL을 수정해야 했지만,
- JPA는 SQL은 JPA가 처리하기 때문에, 필드만 추가하면 된다.
- 패러다임의 불일치 해결 1)~4)
1) JPA와 상속

- 저장 시

- 기존 SQL을 작성했을 때는 ITEM과 ALBUM에 INSERT문을 각각 작성해야 했다면, JPA에서는 알아서 INSERT문을 작성해서 처리한다.
- 조회시

2) JPA와 연관관계
3) JPA와 객체 그래프 탐색

- 연관된 객체를 저장하면, MEMBER에서 TEAM의 객체를 자유롭게 탐색 후 사용할 수 있다.
- 또한 기존에는 DAO에서 SQL문을 연관된 데이터끼리 잘작성해야하고 확인하고 사용해야 했다면, JPA에서는 엔티티를 신뢰할 수 있게 되서 TEAM과 연관된 ORDER나 다른 객체를 자유롭게 사용할 수 있게 된다.
4) JPA와 비교하기

- MYSQL과 같은 SQL문을 직접 작성할 때에는 데이터를 가져와서 인스턴스를 NEW하는 작업을 거치기 때문에 member1과 member2는 같지 않다.
- JPA는 같은 파라미터로 넘어가서 조회한 데이터는 저장해두었다가 조회한 목록에서 가져와 사용하기 때문에 member1==member2는 true가 된다.
4. JPA 성능 최적화 기능
ㄱ) 1차 캐시와 동일성(identity) 보장

- 앞서 말한 것처럼 조회한 데이터를 짧은 시간동안 캐싱을 하고 데이터를 다시 쿼리를 조회하지 않고 캐싱하고 있는 데이터를 그대로 반환한다.
ㄴ) 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)


- 트랜잭션을 사용하기 위해서 JDBC의 복잡한 배치 기능을 JPA에서는 옵션 하나만 사용하면 쿼리를 메모리에 모았다가 한번에 네트워크로 연결한다.
ㄷ) 지연 로딩(Lazy Loading)

- 지연 로딩은 MEMBER 객체를 가져오는 쿼리가 먼저 진행되서 가져와 지고, TEAM객체를 사용하기 위해 먼저 Team에 담아 놓지만 실제로 쿼리를 가져오지는 않고, getName()과 같이 실제로 사용될 때 쿼리가 가져와진다.
- 즉시 로딩은 어차피 MEMBER 객체를 사용할 때는 TEAM도 사용하기 때문에 옵션을 추가해주면 한번에 같이 가져올 수 있다.