JPA란?
JPA는 Java의 ORM(Object Releational Mapping) 표준으로,
자바 객체와 관계형 데이터베이스 테이블 간의 매핑을 쉽게 해주는 프레임워크입니다.
(데이터 액세스 계층의 구현을 간소화합니다)
JPA를 사용하면 복잡한 SQL 쿼리를 작성하지 않고도 데이터 관리&접근이 가능하기에,
개발 생산성과 유지보수에 유리합니다.
1. JPA인터페이스를 통해 CRUD작업을 간단한 코드를 작성할 수 있습니다.
2. DB에 독립적입니다. 따라서 DB를 변경하더라도 JPA 코드를 재사용할 수 있습니다.
3. 애플리케이션의 비즈니스 로직과 DB 구조 사이의 결합도가 낮습니다.(변경 사항 적용이 간편합니다)
JPA 주요개념
엔티티(Entity)는 데이터베이스의 테이블에 해당합니다.
자바 클래스에 @Entity를 붙입니다.
엔티티 매니저(Entity Manager)는 엔티티의 생명 주기를 관리하는 컴포넌트 입니다.
(엔티티의 CRUD를 담당합니다)
영속성 컨텍스트(Persistence Context)는 엔티티를 영구적으로 저장하는 환경을 말합니다.
DB와 동기화 되어 있기에 영속성 컨텍스트에 속한 자바 객체(엔티티)가 수정되면 DB에 적용됩니다.
JPA 최적화
JPA 엔티티를 설계할 때,
지연 로딩(Lazy Loading)과 즉시로딩(Eager Loading)이 있습니다.
즉시 로딩을 사용하면,
조회하는 테이블과 연관된 모든 테이블의 데이터를 조회하기 때문에 성능 저하가 발생할 수 있습니다.
따라서 지연로딩(Lazy Loading)을 사용하여 필요한 데이터만 조회합니다.
batch size를 설정하여, db에 요청하는 쿼리를 한 번의 round-trip으로 묶을 수 있습니다.
(sql문의 수는 변경되지 않지만 round-trip를 줄일 수 있습니다)
엔티티 데이터를 조회할 때, 그 엔티티와 연관된 엔티티가 있으면 n+1문제가 발생할 수 있습니다.
특정 사용자 정보만 조회하고자 할때,
사용자 엔티티와 연관된 엔티티가 있으면,
최초에 사용자 정보(1: 1명의 사용자)를 조회하고,
연관된 엔티티(N: 사용자와 관련된 게시글엔티티, 댓글엔티티)를 함께 조회하는 문제입니다.
이를 해결하기 위해 fetch join, entity graph를 사용할 수 있습니다.
JOIN을 다중으로 사용할 때에도 성능 문제가 발생할 수 있습니다.
View나 집계함수용 테이블을 생성하는 것(역정규화)으로 이를 해결합니다.
인덱스가 적용되지 않은 데이터에 WHERE, JOIN 사용 시 slow쿼리가 발생할 수 있습니다.
인덱스를 적절하게 적용해야 합니다.
다만, 인덱스는 테이블 업데이트 시 갱신 등의 비용이 발생하기 때문에 적절하게 필요한 부분에 사용하는 것이 중요합니다.
(과도하게 사용하지 말아야 합니다)
'Java' 카테고리의 다른 글
[JPA(Jakarta Persistence API)] 엔티티 매핑 (0) | 2024.03.12 |
---|---|
[JPA(Jakarta Persistence API)] 영속성 관리 (0) | 2024.03.12 |
[Spring Boot Actuator] metrics monitoring(Prometheus 와 Grafana를 활용한) (0) | 2024.03.01 |
[Spring Boot Actuator] 기초, 엔드포인트 설정 (0) | 2024.03.01 |
[Redis Cache] Cache miss 전략 (0) | 2024.02.27 |