JPA
SQL 중심 개발의 문제점
패러다임의 불일치 (객체 VS Relational DataBase)
객체와 RDB의 차이
- 상속
-
Album 저장
객체 분해
INSERT INTO ITEM…
INSERT INTO ALBUM… -
Album 조회
Album, Item join
각 객체 생성…
- 연관관계
- 객체는 참조를 사용 : member.getTeam();
- 테이블은 외래 키를 사용 : JOIN ON M.Team_ID = T.TEAM_ID
- 데이터 타입
- 처음 실행하는 SQL 의 join 범위에 따라 탐색 범위 결정됨.
- 모든 객체를 미리 로딩할 수는 없음.
- 계층 분할이 어렵다
- 데이터 식별 방법
ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
JPA
- 객체 중심으로 개발
- 생산성 up!
- 패러다임의 불일치 해결
- 데이터 접근 추상화 벤더 독립성
JPA 성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티 반환
String memberId="100";
Member m1=jpa.find(Member.class,memberId); //SQL
Member m2=jpa.find(Member.class,memberId); //캐시
println(m1===m2) //true
- DB Isolation Level이 ReadCommit 이여도 애플리케이션에서는 Repeatable Read 보장
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
- JDBC BATCH SQL 기능을 사용해서 트랜잭션 커밋하는 순간 한번에 SQL 전송
- 지연로딩
- 지연로딩 : 객체가 실제 사용될때 로딩
- 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
JPA 방언
- JPA는 특정 데이터 베이스에 종속적이지 않다.
- JPA에서는 이를 Dialect라는 추상화된 방언 클래스를 제공하고 각 벤더에 맞는 구현체를 제공한다. ```xml
```
JPA 구동 방식
- EntityManagerFactory는 하나만 생성해서 어플리케이션 전체에서 공유(singleton)
- EntityManager는 스레드간에 공유 X
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행