[JPA] [1] JPA 소개 - JPA는 무엇인가?
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com
인프런 김영한 님의 강의를 듣고 작성한 글입니다.
JPA?
- Java Persistence API의 줄임말
- 자바 진영의 ORM 기술 표준
ORM?
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어는 대부분 ORM이 존재
JPA는 애플리케이션과 JDBC 사이에서 동작

JPA는 JDBC 중간에서 동작하며 애플리케이션 코드를 바탕으로 JDBC 쿼리를 만들어 DB에 접근한다.
JPA 동작방식
저장

JPA가 Member객체를 받아서 알아서 분석 → INSERT SQL 생성 → JDBC API 사용
조회

회원 id 보냄 → 회원객체 분석 → SELECT SQL 생성 → JDBC API사용, ResultSet매핑, 패러다임 불일치 해결
JPA는 표준 명세

JPA는 실제 구현체가 아닌 인터페이스의 모음이다.
Hibernate, ElcipsseLink, DataNucleus와 같은 구현체들이 있지만, 우리는 Hibernate를 쓴다.
JPA를 왜 사용해야 하는가?
■ 생산성
JPA는 기본적인 CRUD 코드가 다 설정돼 있어 자바 컬렉션에서 코드를 사용하듯 사용할 수 있다.
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(“변경할 이름”)
- 삭제: jpa.remove(member)
■ 유지보수


과거엔 바꾸려면 왼쪽처럼 하나하나 일일이 바꿔줘야 했다. 하지만 JPA는 필드만 추가하면 알아서 처리해 준다.
■ 패러다임 불일치 해결
① JPA와 상속

저장
개발자가 할 일
- jpa.persiste(album)
JPA 처리하는 부분
- INSERT INTO ITEM ...
- INSERT INTO ALBUM ...
조회
개발자가 할 일
Album album = jpa.find(Album.class, albumId);
JPA가 처리하는 부분
SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
=> JPA가 알아서 조인해서 처리해 준다.
② JPA와 연관관계, 객체 그래프 탐색
연관관계 저장도 객체 컬렉션 동작처럼 간단한 코드로 진행 가능
연관관계 저장
member.setTeam(team);
jpa.persist(member)
객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
③ 신뢰할 수 있는 엔티티, 계층
지연 로딩이라는 기술로 문제없이 값을 꺼낼 수 있다.
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //자유로운 객체 그래프 탐색
member.getOrder().getDelivery();
}
}
④ JPA와 비교하기
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다.
기존 SQL 주도 개발에서 객체는 new를 통한 객체 생성 때문에 다르다고 나온다. 반면 JPA는 동일한 트랜잭션에서 조회한 엔티티는 같다고 보장한다.
JPA의 성능 최적화 기능
① 1차 캐시와 동일성(identity) 보장
같은 트랜잭션 안에선 같은 엔티티 반환 => 약간의 조회 성능 향상
캐시 : 이미 조회한 건 DB까지 가지 않고 중간에 있는 걸 반환해 줌 => 성능향상
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //tru
SQL을 1번만 실행
② 트랜잭션을 지원하는 쓰기 지연(tansactional write-behind)
1] 트랜잭션을 지원하는 쓰기 지연 - INSERT
1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음 (배치 방식)
2. JDBC BATCH SQL 기능을 사용해 한번에 SPL 전송

트랜잭션을 커밋하기 전까지만 보내면 되므로 배치형식으로 모아서 보냄
2] 트랜잭션을 지원하는 쓰기 지연 - UPDATE
1. UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
2. 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋

=> 자세한 내역은 차후 강의에서
③ 지연로딩
지연 로딩 : 객체가 실제 사용될 때 로딩
즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회

지연로딩 : Member가 필요할 땐 Member만 조회. 이후 연관관계에 있는 Team이 실제로 사용되면 팀에서 데이터를 가져와서 값을 채워 줌.
즉시 로딩 : Member와 Team이 웬만하면 같이 조회될 땐 같이 조회해 달라고 세팅할 수 있음. 그러면 Member를 부르면 자동으로 Team까지 한 번에 조회해 줌.
SQL로 지연/즉시 정책을 바꾸려면 쿼리를 전부 바꿔줘야 하지만, JPA를 이용하면 세팅 한 번으로 정책을 변경할 수 있다.