JPA

1. 순환 참조란?JPA에서 엔티티 간 양방향 연관 관계를 설정하면 서로가 서로를 참조하는 구조가 만들어질 수 있다.이 자체는 잘못된 것은 아니지만, 직렬화(예: JSON 변환)나 무한 출력, 디버깅 시 순환 참조 예외로 이어질 수 있다.예를 들어 @OneToMany, @ManyToOne 구조를 모두 선언하면 순환이 생길 수 있다. 2. 디지몬을 예시로 살펴보자.디지몬 파트너 구조를 생각해보자.Tamer(테이머)는 여러 마리의 Digimon(디지몬)을 가질 수 있고,각 Digimon은 자신이 속한 Tamer를 알고 있다. 이 구조는 다음과 같이 모델링할 수 있다.@Entitypublic class Tamer { @Id @GeneratedValue private Long id; privat..
사실 거창하게(?) 적었지만 디지몬은 큰 의미없다.디지몬을 모르는 사람은 오히려 혼란스러울 수 있다.1. N + 1 문제란?N + 1 문제는 JPA에서 연관된 엔티티를 조회할 때, 불필요하게 많은 SQL 쿼리가 발생하는 현상을 말한다. 예를 들어, 1개의 쿼리로 N개의 엔티티를 가져온 다음,각각의 엔티티에 대해 추가로 또 다른 쿼리를 1개씩 실행한다면?→ 총 N + 1개의 쿼리가 실행된다. 이 현상은 대부분 JPA의 연관 관계 + 지연 로딩(LAZY) 설정이 맞물릴 때 발생하며,성능 병목의 대표적인 원인 중 하나다. 1.1 지연 로딩(LAZY)과 즉시 로딩(EAGER)JPA는 연관관계를 설정할 때 fetch 속성을 통해 해당 연관 객체를 언제 로딩할 것인지를 정의할 수 있다.@ManyToOne(fetch..
트랜잭션 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베스에 반영하는 JPA의 특징입니다. Dirty란 "상태의 변화가 생긴 정도"로 이해할 수 있으며, 즉 Dirty Checking이란 상태 변경 검사를 의미합니다. 더티 체킹의 기준 더티 체킹에서 "변화가 있다"의 기준은 최초 조회 상태입니다. JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷(Snapshot)을 만들어 놓습니다. 그리고 트랜잭션이 끝나는 시점에는 이 스냅샷과 비교해서 다른점이 있다면 Update Query를 데이터베이스로 전달합니다. 당연히 이러한 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용됩니다. 즉, Detach된 엔티티(준영속), DB에 반영되기 전 처음 생성된 엔티티(..
chillmyh
'JPA' 태그의 글 목록