[Springboot] JPA, N + 1 쿼리 증가 문제
·
Programming/Springboot
JPA를 사용하다 보면 LAZY로딩에 의해서 더 많은 쿼리가 나가는 경우가 발생한다. 쿼리를 보낼 때 연관된 내용을 바로 찾지 않고 필요할때 다시 쿼리를 보내서 찾는 LAZY 방식을 사용하여 N+1 쿼리 문제가 발생하게 된다. ToOne에 관계는 fetch join을 사용하여 한번에 값들을 모두 조회할 수 있지만 ToMany 같은 컬렉션 조회는 한개는 상관없지만 여러개를 fetch join을 걸게되면 MultipleBagFetchException 에러가 나게된다. properties설정에 하이버네이트의 default_batch_fetch_size 글로벌 옵션을 걸거나 필요한 엔티티에 어노테이션 @BatchSize를 붙이면 된다. 이 옵션은 설정한 size만큼 in절로 묶어서 한번에 가져오기 때문에 쿼리를..
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 3
·
Programming/Springboot
자바 ORM 표준 JPA 프로그래밍 - 기본편김영한님 강의듣고 정리하기 1. 값 타입 JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류기본값 타입 (int, double, Integer, Long 등)임베디드 타입 컬렉션 값 타입 임베디드 타입새로운 값 타입을 직접 정의할 수 있다.주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.@Embeddable :..
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 2
·
Programming/Springboot
자바 ORM 표준 JPA 프로그래밍 - 기본편김영한님 강의듣고 정리하기 1. 다양한 연관관계 매핑연관관계 매핑시 고려사항 3가지다중성다대일 : @ManyToOne일대다 : @OneToMany일대일 : @OneToOne다대다 : @ManyToMany단방향, 양방향테이블 : 외래키 하나로 양쪽 조인 가능, 사실 방향이라는 개념이 없음객체 : 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향연관관계의 주인연관관계의 주인 : 외래키를 관리하는 참조주인의 반대편 : 외래키에 영향을 주지않음, 단순조회만 가능 다대일 [N:1]다대일 단방향 - 가장 많이 사용하는 연관관계다대일 양방향 - 외래키가 있는 쪽이 연관관계의 주인, 양쪽을 서로 참조하도록 개발 일대다 [1:N]일대다 단방향일(1)이 연관관계의 주인테이..
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 1
·
Programming/Springboot
자바 ORM 표준 JPA 프로그래밍 - 기본편김영한님 강의듣고 정리하기 1. JPA 시작하기스프링과 스프링 데이터 JPA를 쓰지않고 JPA 사용해보기public class JpaMain { public static void main(String[] args) { // 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체의 공유 EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야한다.) EntityManager em = emf.createEntityManager(); // JPA의 모든 데이터 ..