- 자바 진영의 ORM 기술 표준
- JPA를 구현하는 대표적인 구현체 하이버네이트, EclipseLink, DataNucleus -> 하이버네이트가 대표적이므로 구현체로 하이버네이트를 쓴다고 생각하자!
ORM(Object-relational mapping 객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- 중간에서 ORM 프레임워크가 매핑 작업
- 개발자가 직접 JDBC를 사용하는 것이 아니라 JPA가 중간에서 이 역할을 대신한다.
JPA 저장 동작
- MemberDAO에서 데이터를 저장할 경우
- JPA에게 Member 객체를 넘긴다.
- JPA가 Member 객체를 분석해서 적절한 INSERT쿼리를 생성
- JPA가 JDBC API를 사용하여 DB에 보내고 결과(ResultSet)를 받는다.
JPA 조회 동작
- MemberDAO에서 조회를 할 경우
- JPA에 찾으려는 id값을 보낸다.
- JPA는 SELECT 쿼리를 작성해서 DB에서 결과를 반환해온다.
- 패러다임 불일치를 해결한다.
JPA를 사용하는 이유?
- Java Persistence 에 넣어주면 알아서 튀어나온다!
생산성
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
유지보수
- 쿼리를 따로 손댈 필요없이 컬럼이 추가되거나 삭제되어도 해당 컬럼만 수정해주면 된다.
- JPA에 필드만 추가하면 되고, SQL은 JPA가 처리한다.
패러다임의 불일치 해결
- JPA와 상속 - 저장
- 개발자가 할일 : jpa.persist(album);
- 나머진 JPA가 처리
- INSERT INTO ITEM ...
- INSERT INTO ALBUM ...
- JPA와 상속 - 조회
- 개발자가 할일 : Albeum 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는 지연로딩이라는 기능이 있어서 자유롭게 객체를 탐색 할 수 있다.
- JPA를 통해 가져오는 데이터는 믿을 수 있는 데이터가 된다.
- JPA에서는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
- 즉, 같은 트랜잭션에서 조회할 경우에는 자바 컬렉션을 통해서 꺼내오는 것처럼 member1 == member2가 같다는 것이 보장된다는 뜻
JPA의 성능 최적화 기능
- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 조회 성능 향상
- 첫번 째로 조회 호출할 경우 SQL을 통해 디비에 들려서 값을 가져온다.
- 동일한 호출이 있을 경우 캐싱을 통해 데이터를 보관하고 있고, 따로 디비에 들리지않고 바로 값을 반환해준다.
- SQL을 1번만 실행한다.
- DB Isolation Level을 한단계 낮춰준다.
트랜잭션을 지원하는 쓰기 지연(버퍼링 기능)
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모아둔다.
- 커밋하는 순간 JDBC BATCH SQL을 기능을 사용하여 한번에 SQL을 전송한다.
지연 로딩과 즉시 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
- ex) 쿼리를 따로 보내서 실제 사용되는 경우에만 내보낼 경우 지연로딩
- ex) Member를 사용할 때 Team을 같이 사용해야 하는 경우가 99% 이상이다 일 경우 즉시 로딩을 사용한다.
JPA에서는 스위치 끄고 켜듯이 옵션을 통해 제어할 수 있다.
JPA를 잘 쓰기 위해서는 ORM만 잘 알아야한다기 보다는 RDB도 놓지말고 지속적인 학습이 필요하다
'Dev > JPA' 카테고리의 다른 글
RS) 영속성 컨텍스트 (0) | 2022.02.01 |
---|---|
RS) JPA 어플리케이션 실습 (0) | 2022.02.01 |
RS) SQL 중심적인 개발의 문제점 (0) | 2022.02.01 |
JPA의 사용 (0) | 2021.04.09 |
프록시와 연관관계 관리 (0) | 2020.08.08 |