2024. 1. 2. 21:03ㆍWeb/JPA
Java Persistence API
자바 진영의 ORM 기술 표준 이다.
ORM 이란
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관게형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
JPA는 애플리케이션과 JDBC 사이에서 동작
예를들어 member 객체를 저장해줘 라고 JPA에 던지게 되면 JPA는 객체를 분석하게된다
INSERT SQL을 알아서 만들어 쿼리까지 DB로 날려주게된다.
패러다임 불일치 해결 할 수 있다.
엔티티 오브젝트를 다 만들어서 던져주게 된다.
생산성 - JPA와 CRUD
저장 : jpa.persist(member)
조회 : Member member = jpa.find(member)
수정 : member.setName("변경할 이름")
삭제 : jpa.remove(member)
JPA와 패러다임의 불일치 해결
1. JPA와 상속
2. JPA와 연관관계
3. JPA와 객체 그래프 탐색
4. JPA와 비교하기
JPA와 상속 - 저장
개발자가 할일
jpa.persist(album);
나머지 JPA가 처리
INSERT INTO ITEM ...
INSERT INTO ALBUM ...
JPA와 상속 - 조회
개발자가 할일
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와 연관관계, 객체 그래프 탐색
연관관계 저장
member.setTeam(team);
jpa.persist(member);
객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
JPA와 비교하기
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다.
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
JPA의 성능 최적화 기능
1. 1차 캐시와 동일성(identity) 보장
2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
3. 지연로딩(Lazy Loading)
1차 캐시와 동일성 보장
1. 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
2. DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
SQL 1번만 실행
트랜잭션을 지원하는 쓰기 지연 - INSERT
1. 트랜잭션을 커밋할 때싸지 INSERT SQL을 모음
2. JDBC BATCH SQL 기능을 사용해서 하번에 SQL 전송
transaction.begin();
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 여기 까지 INSERT SQL을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transation.commit(); // [트랜잭션] 커밋
이처럼 버퍼라이팅이 가능하다
트랜잭션을 지원하는 쓰기 지연 - UPDATE
1. UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
2. 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
transaction.begin(); // [트랜잭션] 시작
changeMember(memberA);
changeMember(memberB);
비즈니스_로직_수행(); // 비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.
// 커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.
transation.commit(); // [트랜잭션] 커밋
지연 로딩과 즉시 로딩
지연 로딩 : 객체가 실제 사용될 때 로딩
즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
지연로딩
Member member = memberDAO.find(memberId); ------> SELECT * FROM MEMBER
Team team = member.getTeam();
String teamName = team.getName(); --------------> SELECT * FROM TEAM
즉시로딩
Member member = memberDAO.find(memberId); ------> SELECT M.*, T.*
Team team = member.getTeam(); FROM MEMBER
String teamName = team.getName(); JOIN TEAM ...
'Web > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 (0) | 2024.01.29 |
---|---|
[JPA] 영속성 관리 (0) | 2024.01.22 |
[JPA] JPA 프로젝트 생성 (1) | 2024.01.17 |