JPA로 DB 다루기

JaeGu Jeong·2024년 2월 19일
0

개발 도구들

목록 보기
7/12

목적

스프링부트 객체를 DB에서도 OOP처럼 사용하기 위해서 사용했습니다.

N+1 문제

예를 들어 JPA 기본 기능인 findAll()은 테이블 전체 데이터를 쉽게 불러올 수 있습니다.
문제는 조회하려는 엔터티에 다른 엔터티와 관계가 있거나 다음과 같이 컨테이너를 사용할 때 입니다.

정수배열을 엔터티에서 테이블을 분리해서 객체ID로 연결된 상태입니다.
이 상태에서 다시 조회하면 쿼리가 중복으로 불러지게 됩니다.

3개의 객체가 들어있는 테이블에 findAll()을 하였습니다.
엔드포인트,메인 테이블,서브 테이블 순으로 조회하는 모습입니다.
응답까지 "40 ~ 109ms"정도 측정되었습니다.

JPQL로 쿼리를 최적화 해보겠습니다.

"LEFT JOIN FETCH"로 메인 테이블을 기준으로 정수배열 테이블을 왼쪽으로 합칩니다.

이렇게 하고 다시 조회를 하면 DB가 한번만 호출되도록 만들 수 있습니다.
추적 도구로 살펴보겠습니다.

109ms -> 4ms 속도 향상

실제로 엔드포인트가 호출되고 DB에 쿼리가 한번 들어가고 마무리 되었습니다.
속도는 "4 ~ 11ms"로 최대 20배 성능 향상 되었습니다.
DB에 입출력이 얼마나 많은 비용을 사용하는지 좋은 예시입니다.

영속성 컨텍스트

JPA의 동일한 트랜잭션에서 객체를 캐싱하고 변경감지 및 지연로딩을 통해 효율적인 DB 접근 처리합니다.

'@' 기반 설정

JPA는 주로 애노테이션을 사용하여 객체와 데이터베이스 간의 매핑을 설정합니다. 이를 통해 XML 기반의 설정보다 간결하고 직관적인 설정이 가능합니다.

JPQL (Java Persistence Query Language)

JPA는 SQL을 사용하는 대신에 JPQL이라는 객체 지향 쿼리 언어를 제공합니다. JPQL은 엔티티 객체를 대상으로 쿼리를 작성할 수 있어 SQL과 별개로 객체 지향적인 쿼리를 사용할 수 있습니다.

트랜잭션 관리

JPA는 트랜잭션 관리를 지원하며, 애플리케이션에서 데이터베이스 트랜잭션을 시작하고 커밋 또는 롤백하는 기능을 제공합니다.

복합 키와 상속 관계 매핑

JPA는 복합 키 및 상속 관계에 대한 매핑을 지원합니다. 복합 키나 다양한 종류의 상속 전략을 사용할 수 있습니다.

표준 인터페이스

JPA는 자바 표준 명세로서 여러 ORM 프레임워크에서 구현하고 있으며, 따라서 특정 ORM 프레임워크에 종속되지 않습니다. 이는 애플리케이션의 ORM 프레임워크를 변경하더라도 코드를 크게 수정하지 않아도 되는 이점을 제공합니다.

profile
BackEnd Developer

0개의 댓글