jpa 11

[Spring Boot] Specification과 QueryDSL

1. JPA Specification 개념 • Spring Data JPA에서 제공하는 동적 쿼리 작성 기능. • Java 객체 기반으로 조건을 조합하며, Criteria API를 내부적으로 활용. • 복잡한 쿼리를 작성하면서도, 조건을 재사용할 수 있도록 설계되었다. 구성 요소 • Specification 인터페이스: 동적 쿼리의 조건을 정의. • Predicate: 조건문을 의미하며, CriteriaBuilder를 통해 생성.Specification의 주요 메서드 • toPredicate() • 동적 쿼리의 핵심 메서드로, 필터 조건을 정의. 기본 형태Specification specification = (root, query, criteriaBuilder) -> { // 조건 정의 ret..

[Spring Boot] List<Sort.Order>와 Sort.Order.desc()

출처 : ChatGPTSpring Data JPA 또는 Spring에서 정렬을 설정할 때 사용되는 코드. 주로 데이터베이스에서 데이터를 정렬하여 가져오기 위한 요청을 만들 때 활용된다구조 설명 1. Sort 클래스:  • Spring Data JPA에서 제공하는 클래스.  • 정렬 조건(오름차순, 내림차순)을 정의할 때 사용.  • 여러 컬럼에 대한 정렬 기준을 설정할 수 있다. 2. Sort.Order 클래스:  • 단일 정렬 조건(컬럼 이름과 방향)을 정의한다.  • 정렬 방향:  • Sort.Order.asc() → 오름차순 정렬.  • Sort.Order.desc() → 내림차순 정렬.List sorts = new ArrayList();sorts.add(Sort.Order.desc("columnN..

[Spring Boot, JPA] EntityManager

JPA에서 데이터베이스와 상호작용하기 위해 사용되는 핵심 인터페이스JPA의 영속성 컨텍스트를 관리하고, 엔티티의 생명주기를 제어하며, 데이터베이스 작업(저장, 업데이트, 삭제 등)을 수행한다엔티티매니저는 JPA 표준 사양에 속하며, 스프링부트에서는 보통 Hibernate가 이를 구현체로 사용한다 주요 역할1. 영속성 컨텍스트 관리엔티티를 영속성 컨텍스트에 저장하고 관리한다영속성 컨텍스트는 엔티티의 1차 캐시 역할을 수행하며, 엔티티 상태를 추적한다2. 엔티티 상태 관리Transient : 영속성 컨텍스트에 포함되지 않은 상태Persistent : 영속성 컨텍스트에 포함되어 관리되는 상태Detached : 영속성 컨텍스트에서 분리된 상태Removed : 삭제 예정 상태3. 데이터베이스 작업 처리데이터 저장..

[JPA] N + 1 문제

데이터베이스와 관련된 성능 이슈로, JPA나 ORM을 사용할때 자주 발생한다한번의 쿼리로 해결할 수 있는 작업이 여러번의 쿼리로 나뉘어 실행되면서 성능 저하를 유발하는 문제 동작 과정1. 1개의 쿼리 실행먼저 1 에 해당하는 쿼리를 실행해 특정 엔티티의 리스트를 가져온다예 : SELECT * FROM orders; (주문 데이터를 조회)2. N개의 추가 쿼리 실행가져온 각 엔티티와 연관된 데이터를 조회하기 위해 N개의 추가 쿼리가 실행된다예 : 각 주문에 연관된 고객 데이터를 가져오는 쿼리예제 및 동작 설명Order 와 Customer 관계 (@ManyToOne) :@Entitypublic class Order { @Id @GeneratedValue private Long id; @..

BE/Java 2025.01.06

[Spring Boot, JPA] 관련 어노테이션

1. 엔티티(Entity)관련 어노테이션@Entity이 클래스가 JPA에서 관리되는 엔티티임을 선언데이터베이스 테이블에 매핑된다주의사항 : 반드시 기본 생성자 (public or protected)가 필요하다@Entity가 붙은 클래스는 final일 수 없다@Entitypublic class User { @Id @GeneratedValue private Long id; private String name;} @Table엔티티 클래스와 매핑될 데이터베이스 테이블을 지정한다기본적으로는 클래스 이름을 테이블 이름으로 사용하지만, 커스텀 이름을 지정할 때 사용한다속성 :name : 매핑할 테이블 이름schema : 스키마 이름catalog : 카탈로그 이름uniqueConstraints :..

[Java] @IdClass

JPA에서 복합키를 매핑하는 방법중 하나, 복합키를 정의하는 별도의 클래스를 사용복합키를 지정할때 @IdClass 를 사용하여 엔티티와 연결 복합키두개 이상의 컬럼을 조합하여 기본키로 사용하는 것을 의미설정 방식1. 식별자 클래스 정의복합키에 포함될 필드를 정의한 클래스를 작성2. 엔티티 클래스와 연결엔티티에서 어노테이션을 사용하여 식별자 클래스를 지정하고, 각 필드를 @Id로 선언예제테이블 구조 :Order---------------------------------order_id (PK)product_id (PK)quantity 식별자 클래스 정의 :import java.io.Serializable;import java.util.Objects;public class OrderId implements S..

BE/Java 2024.12.31

[Spring Boot, Java] Cascade

Cascade (영속성전이)는 특정 엔티티의 상태변화 (예: 저장, 삭제)가 연관된 엔티티에도 전이되도록 설정하는 기능연관관계가 있는 엔티티들 간에 일일이 상태를 동기화하지 않아도, 부모 엔티티의 상태변화를 통해 자식 엔티티의 상태도 자동 변경된다종류1. CascadeType.PERSIST부모 엔티티를 저장할때, 연관된 자식 엔티티도 함께 저장된다자식 엔티티를 따로 persist() 하지 않아도 된다@Entitypublic class Parent { @Id @GeneratedValue private Long id; @OneToMany(cascade = CascadeType.PERSIST) private List children = new ArrayList();}// 사용 예시Pare..

[Spring Boot, JPA] 스냅샷

JPA에서 변경 감지(Dirty Checking) 기능을구현하기 위해 사용하는 내부 메커니즘 중 하나엔티티의 초기상태를 복사하여 저장한값을 의미, 이를 통해 엔티티 객체의 변경 여부를 감지할 수 있음 스냅샷이 필요한 이유JPA는 데이터베이스와 객체 간 동기화를 위해 엔티티의 변경 여부를 확인해야 한다이를 위해 엔티티가 영속성 컨텍스트에 저장될때 스냅샷을 만들어 초기 상태를 기록한다트랜잭션이 커밋되거나 flush()가 호출될때 현재 엔티티의 상태와 스냅샷을 비교하여 변경사항이 있는지 판단한다스냅샷 작동 방식1. 엔티티 영속 상태로 전환em.persist() 를 호출하거나 데이터베이스에서 조회하여 엔티티가 영속성 컨텍스트에 저장되면, 스냅샷이 생성된다스냅샷은 엔티티의 초기 상태를 복사하여 저장한 데이터2. ..

[Spring Boot, JPA] 영속성 컨텍스트

영속성 컨텍스트 (Persistance Context)JPA 에서 엔티티 객체를 관리하는 메모리 상 저장소.JPA는 영속성 컨텍스트를 통해 데이터베이스와 상호작용하며, 엔티티의 생명주기를 관리하고, 데이터베이스 작업을 효율적으로 처리한다핵심 개념1. 엔티티 관리영속성 컨텍스트는 엔티티 객체를 생성, 읽기, 수정, 삭제 등 다양한 방식으로 관리한다엔티티는 JPA에서 데이터베이스의 한 행에 해당하는 자바 객체를 말함2. 1차 캐시영속성 컨텍스트는 1차 캐시로 작동하며, 데이터베이스 접근을 최소화하기 위해 객체를 메모리에 저장한다동일한 트랜잭션 내에서 같은 엔티티를 다시 조회하면, 데이터베이스에 쿼리를 보내지 않고 1차 캐시에서 데이터를 반환한다3. 변경 감지 (Dirty Checking)영속성 컨텍스트는 엔..

[Spring Boot] @ManyToOne, @OneToMany

JPA 에서 사용하는 관계 매핑 어노테이션.데이터베이스 테이블간의 연관 관계를 자바 객체로 표현할때 사용.@ManyToOne (다대일 관계)의미여러개의 엔티티가 하나의 엔티티에 연결된 관계ex) 여러명의 학생이 하나의 학급에 소속되는 경우예제@Entitypublic class Student { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "class_id") // 외래 키를 매핑 private ClassRoom classRoom; // 한 명의 학생은 하나의 학급에 소속}다대일 관계를 나타냄JoinColumn은 외래키를 매핑하는데 사용, 위 예제에서는 cl..