728x90
반응형
JPA 란?
- Java Persistence API 의 약자이다.
- 자바 진영 표준 ORM
ORM 이란?
- Object-relational mapping 객체관계 매핑
- 객체는 객체대로 설계 한다.
- 관계형 데이터 베이스는 관계형 데이터베이스대로 설계한다.
- ORM 프레임 워크가 객체와 데이터베이스를 중간에서 매핑해준다.
- 대중적인 안에는 대부분 ORM 기술이 존재
JPA의 역사
- 과거에는 EJB 라는 ORM이 있었는데 문제가 많았다.
성능 문제, 복잡성 등등 - 그래서 개발자가 하이버네이트를 만들었다.
- 하이버네이트를 좀더 개선한 것이 JPA 이다.
JPA의 구조
- JPA 의 코드는 대부분 인터페이스 이다.
- 그래서 상속받아서 구현한 것을 써야한다.
- 보통 Hibernate를 많이 사용한다.
JPA의 동작
기본동작
JPA 는 JDBC API로 DB 에 SQL 문을 날려준다.
JPA 동작 - 저장
- 저장할 객체를 JPA에게 넘겨준다.
- JPA 는 넘어온 객체를 분석한다.
- SQL 문을 생성한다.
- JDBC API 를 통해 Insert 문을 수행한다.
JPA 동작 - 조회
JPA를 사용해야 되는 이유
SQL 중점에서 객체중심으로 개발
SQL 중점에서 이제 객체를 직접 저장하고 조회 할수 있다.
생산성
반복적인 CRUD를 그만해도된다.
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName("변경이름")
- 수정이 좀 중요하다 영속성 준영속성을 뒤에 배우는데
영속성일때 즉 JPA가 관리하는 객체일때 객체의 속성을 변경하면 알아서 update 문이 나간다. - 삭제: jpa.remove(member)
유지보수
새로운 tel 이 추가 되면 SQL 문을 수정할 필요가 없다
애초에 SQL 문을 사용하지 않고 객체를 저장하기 때문이다.
public class Member {
private String memberId;
private String name;
private String tel; // 새로운 필드 추가
}
패러다임의 불일치 해결
아래와 같은 구조일때 저장과 조회를 객체기준에 맞게 할 수 있다.
저장
조회
비교
- 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
- 캐싱기능을 사용한다.
- 원리는 다음과 같다.
member2를 찾을때 key 값이 동일하면
member1을 반환해 준다.
그렇기 때문에 비교 연산이 가능해진다.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); //SQL문 수행
Member member2 = jpa.find(Member.class, memberId); //캐시
member1 == member2; //같다.
JPA의 성능 최적화 기능
1차 캐시와 동일성 보장
- 위 예제에서 처럼 캐시를 사용한다.
- 그렇게 되면 SQL 문을 한번만 실행한다.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); //SQL문 수행
Member member2 = jpa.find(Member.class, memberId); //캐시
member1 == member2; //같다.
트랜잭션을 지원하는 쓰기 지연
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
지연 로딩과 즉시 로딩
지연로딩
- 지연로딩은 다음과 같이 수행된다.
- 개발자가 객체를 사용할때 SQL 문이 각각 수행된다.
Member member = memberDAO.find(memberId); // member에 대한 select 문 실행
Team team = member.getTeam();
String teamName = team.getName(); // Team에 대한 select 문 실행
즉시로딩
- 미리 다 조회 해둔다.
- SELECT M.*, T.* FROM MEMBER JOIN TEAM …
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
참고:
https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21683?speed=1&tab=note
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2021.07.30 |
---|---|
[JPA] JPA CRUD 기본 (0) | 2021.07.30 |
[JPA] JPA 환경설정 (0) | 2021.07.29 |
[JPA] JPA를 사용하는 이유 (0) | 2021.07.27 |
[JPA] JPA를 배워야 하는이유 (0) | 2021.07.27 |
댓글