본 게시글의 출처는 인프런 김영한님의 강의입니다.
강의명은 자바 ORM 표준 JPA 프로그래밍 - 기본편 입니다.
출처 : https://www.inflearn.com/course/ORM-JPA-Basic
SQL 중심적인 개발의 문제점
관계형 DB에 데이터를 저장하기 위해서는 똑같은 SQL문을 계속 작성해야한다.
객체와 관계형 데이터베이스의 차이
상속

Album 조회
1. 각각의 테이블에 따른 조인 SQL 작성
2. 각각의 객체 생성
3. 상상만 해도 복잡
4. 그래서 DB에 저장할 객체에는 상속 관계를 쓰지 않는다.
-> But, Java Collection에 저장하면? list.add() 조회도 list.get() 부모 타입으로 조회 후 다형성 활용도 가능
연관관계
- 객체는 참조를 사용 : member.getTeam()
- 테이블은 외래 키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID



즉, 객체답게 모델링 할수록 매핑작업만 늘어난다.
따라서 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 순 없을까?
JPA로 해결.
JPA 소개
JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 ORM이 존재


JPA는 표준 명세
- 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 수정
JPA와 패러다임의 불일치 해결
- JPA와 상속
- JPA와 연관관계
- JPA와 객체 그래프 탐색
- JPA와 비교하기
JPA와 상속



JPA와 연관관계


JPA와 비교하기

JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 지연 로딩(Lazy Loading)
1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatabel Read 보장

트랜잭션을 지원하는 쓰기 지연
-
트랜잭션을 커밋할 때까지 INSERT SQL을 모음
-
JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

-
UPDATE, DELETE로 인한 로우락 시간 최소화
-
트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋

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