Spring/Spring Jpa 5

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

spring jpa를 활용한 데이터 저장 성능 향상(saveAll(), bulk insert)

Spring boot를 이용하여 프로젝트 과제를 하다가,20만 건 이상의 데이터를 저장시키는 작업이 필요했다. “그냥 저장시키면 되겠지”라는 안일한 생각으로 저장로직을 작성해 저장을 시켜보니무려 40분 이라는 시간이 걸리는 게 아닌가.. 내 기준 40분이면 밥🍚 먹고 설거지까지 마칠 시간이라 도저히 용납할 수 없었다.그래서 어떻게 성능을 올릴 수 있을까 고민하는 시간을 가져봤다. 1. @Transactional 쓰기 지연을 활용할 수 없을까?어디서 가장 크게 성능 저하가 일어날까 고민해봤을 때db에 저장될 때 성능저하가 크게 일어나지 않을까 추측하였다. 왜냐하면 db에 작업을 할 때에는 매 번 db에 연결하기 위해 작업이 필요하기 때문이다.그래서 db에 연결하는 횟수를 줄이기 위한 방법을 고민하게 되었..

Spring/Spring Jpa 2024.05.16