Spring/Spring Jpa 4

LazyInitializationException과 LazyLoading의 동작원리

@Transactional이 붙지 않은 메서드 내에서 LazyLoading된 필드를 접근 시 하이버네이트가 LazyInitializationException을 발생시킨다.왜냐하면 Lazy Loading이 동작하려면 영속성 컨텍스트가 필요하지만, 이게 닫혀있기 때문이다.그럼 Hibernate는 어떻게 이를 알아챌까?Lazy Loading의 동작과정LazyLoading은 프록시 객체를 사용해서 동작한다.특정 엔티티가 LazyLoading이 붙은 필드가 있다면, Hibernate는 이 엔티티의 프록시 객체를 생성한다.class Room$HibernateProxy extends Room { private List places = new PersistentBag(); // Lazy Loading Proxy}..

Spring/Spring Jpa 2025.02.19

@ManyToMany를 사용하면 안 되는 이유

@ManyToMany 를 실무에서 사용하면 안된다는 얘기를 많이 들었고, 그래서 항상 관계를 풀어서 사용했었다.이번에 다시 관계를 풀어 사용하면서 왜 풀어야하나 생각해보니 답이 떠오르지 않아 이를 정리해본다.@ManyToMany@Entitypublic class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany @JoinTable( name = "student_course" // 중간 테이블의 이름 ) private List courses = new ArrayList(); // 기본 생성..

Spring/Spring Jpa 2024.10.15

OSIV란? (feat.OSIV를 통한 성능 최적화)

OSIV(Open Session In View)란?OSIV란 Lazy Loading에 관련된 설정으로세션(세션이란 영속성 컨텍스트와 DB 커넥션을 관리하는 주체이다.)을 유저에게 응답할 때(View단, Controller단)까지 열어두거나, 닫아 두는 기능이다.OSIV를 켜면 트랜잭션(@Transactional)이 종료된 이후에도 데이터베이스 세션이 열려있기 때문에, 뷰에서 지연 로딩이 발생할 수 있다.디폴트로 열어져(On) 있다. 개발자는 임의로 키거나 끌 수 있다.Jpa에서는 OEIV(Open Entity In View)라고 부른다.Hibernate에서는 그대로 OSIV(Open Session In View)라고 부른다. OSIV를 설정해야 하는 이유OSIV on 해두는 경우,요청에서 응답까지의 시간..

Spring/Spring Jpa 2024.09.25

Eager Loading(즉시 로딩) vs Lazy Loading(지연 로딩) 중 어느 전략을 사용해야 할까?

스프링 Jpa에서는 연관관계를 언제 DB에서 가져올 지 로딩 전략을 통해 결정할 수 있다.이에 대해서는 즉시 로딩(Eager) or 지연 로딩(Lazy)가 존재한다. 지연 로딩(Lazy Loading)지연 로딩 = 어떤 엔티티를 조회하였을 때 연관된 엔티티는 Proxy 객체( like 빈 객체)로 넣고, 실제로 사용될 때 DB 조회를 통해 가져온다.지연 로딩은 N + 1 문제가 발생할 수 있다,  N + 1 문제란? 더보기이는 1개의 쿼리로 N개의 데이터를 조회할 때, N개의 추가 쿼리가 발생하는 상황을 의미한다.예를 들어 jpa를 통해 리스트(예를 들어 게시글)를 조회한다고 했을 때,한 번의 쿼리(게시글 목록 조회)가 필요하다.이 조회를 통해 N개의 리스트 원소를 가져왔다고 하자. 가져온 각 게시글 안..

Spring/Spring Jpa 2024.09.24