JPA(Java Persistence API)
- 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- JPA는 말 그대로 인터페이스, 특정 기능을 하는 라이브러리가 아니다.
- 스프링의 PSA에 의해서(POJO를 사용하면서 특정 기술을 사용하기 위해서)표준 인터페이스를 정해두었는데, 그중 orm을 사용하기 위해 만든 인터페이스가 바로 jpa이다.
- 기존 EJB에서 제공되던 엔티티 빈을 대체하는 기술이다.
- ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다.(sql을 매핑하지 않는다)
ORM(Object-Relation Mapping)
- DB 데이터 ←mapping→ Object 필드
- 객체를 통해 간접적으로 DB 데이터를 다룬다.
- 객체와 디비의 데이터를 자동으로 매핑한다.
- SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.
- 객체간 관계를 바탕으로 sql을 자동으로 생성한다
- Persistant API
- JPA, Hibernate
즉시 로딩과 지연 로딩(Eager Loading / Lazy Loading)
-
특정 엔티티를 조회할 때 연관된 모든 엔티티를 같이 로딩하는 것을 즉시 로딩(Eager Loading)
-
즉시 로딩은 연관된 엔티티를 모두 가져온다는 장점이 있지만,
실무에서 엔티티간의 관계가 복잡해질수록 조인으로 인한 성능 저하를 피할 수 없게 된다.
-
JPA에서 연관관계의 데이터를 어떻게 가져올 것인가를 fetch(패치)라고 하는데,
연관관계의 어노테이션 속성으로 'fetch'모드를 지정한다.
-
'즉시 로딩'은 불필요한 조인까지 포함해서 처리하는 경우가 많기 때문에 '지연 로딩'의 사용을 권하고 있다.
-
지연 로딩(Lazy Loading)은 가능한 객체의 초기화를 지연시키는데 사용하는 패턴이다.
N+1 문제
- Spring Data JPA 에서 제공하는 Repository의 findAll(), findById() 등과 같은 메소드를 사용하면 바로 DB에 SQL 쿼리를 날리는 것이 아니다.
- JPQL 이라는 객체지향 쿼리 언어를 생성, 실행시킨 후 JPA는 이것을 분석해서 SQL을 생성, 실행하는 동작에서 N+1 문제가 발생한다.
N+1 발생하는 경우는 2가지 경우이다.
N+1 문제 해결 방법
-
fetch join
- 미리 쿼리로 테이블을 조인해서 가져오기 때문에 Lazy, Eager 두개의 전략에 해당되는 해결법
- JPA가 제공하는 Pageable 기능 사용 불가
- 1 : N 관계가 2개인 엔티티를 패치 조인 사용 불가
-
Batch Size 조절
- 설정한 Size만큼 데이터를 미리 로딩한다.
- JPA의 페이징 API 기능처럼 개수가 고정된 데이터를 가져올 때 함께 사용하면 유용하게 사용 가능
- 글로벌 패치 전략을 즉시 로딩으로 변경해야하는 단점이 존재
이번주는 충격과 공포의 주..
꼬리에 꼬리는 무는 자괴감과 자기비하로 뇌절이 계속 온다.
멍 때리는 시간이 지속되면서 하루하루를 헛되이 쓰는 느낌이다.
다른 사람들이 도움의 손길을 줘도 어디서부터 잘못된 것인지 설명할 수 없어 거절하게 된다.
어렵다..ㅎ