본문 바로가기

JPA4

N + 1 Query, 쿼리 호출 증가 JPA Batch Fetch Size로 방지하자 granger.tistory.com/48 Spring data jpa Lazy N+1 query / querydsl join 적용하기 일반적으로 불필요하게 리소스를 낭비를 하지 않기 위해 N : 1 or 1: N 관계에 LAZY로 설정합니다. 이에 대한 예시로 Member Entitiy 와 Group Entity로 나누었고, 서로 양방으로 참조하고 있다고 가정하겠습 granger.tistory.com 앞서 글을 통해 N+1 query가 발생되는 경우를 알아보았다. JPA를 쓰다보면 의도치 않게 지연로딩에 의하여 더 많은 쿼리가 발생되어 조회가 된다. 이를 최적화 하기 위해 hibernate.default_batch_fetch_size, @BatchSize를 적용한다. ex) Spring Boot, app.. 2020. 9. 23.
Spring Data JPA 에서 getOne 과 findById 차이점 Spring Data JPA에서 getOne과 findById의 차이점은 무엇일까? 기본 데이터 저장소에서 개체를 검색하는 데 findById()및 getOne()메서드가 모두 사용된다. 그러나 레코드를 검색하는 기본 메커니즘은이 두 메소드에서 서로 다르다. 실제로 getOne ()은 데이터베이스에 충돌하지 않는 Lazy 조작이다. getOne () 메소드 getOne ()은 주어진 식별자를 가진 엔티티에 대한 참조를 반환한다. getOne은 내부적으로 EntityManager.getReference () 메소드를 호출한다. 문서에 따라 이 메소드는 데이터베이스에 충돌하지 않고 항상 프록시를 반환한다. (Lazy지연으로 가져온) 요청 된 엔티티가 데이터베이스에 존재하지 않으면이 메소드는 실제 액세스시 E.. 2019. 10. 25.
Spring data jpa Lazy N+1 query / querydsl join 적용하기 일반적으로 불필요하게 리소스를 낭비를 하지 않기 위해 N : 1 or 1: N 관계에 LAZY로 설정합니다. 이에 대한 예시로 Member Entitiy 와 Group Entity로 나누었고, 서로 양방으로 참조하고 있다고 가정하겠습니다. 여기서 Member의 테이블명은 cmember로 하였습니다. 새로 설치한 mysql 버전(8.0.17)에서 member테이블이 예약어로 잡혀있었기 때문에 ..ㅜ) https://dev.mysql.com/doc/refman/8.0/en/keywords.html 보면 8.0.17 부터 예약어가 추가된것을 알수 있습니다. 여기서 간단하게 두개의 테이블을 inner join 하여 select 하는 메소드를 만들었습니다. 다음은 테스트 할 데이터를 넣기 위해 만든 메소드 입니다.. 2019. 10. 12.
JPA Lazy Loading 개발환경 : Hibernate 5.3.7 , Spring Data JPA 2.1.5 @ManyToOne, @OneToOne FetchType=LAZY로 설정시 전체 Entitiy를 entitiyManager.find 호출할때 프록시 객체(Hibernate Proxy)가 생성되며 대상필드를 접근할때(get호출) 데이터 조회한다. 이때 데이터베이스를 조회해 실제 엔티티를 생성하는 것을 프록시 객체의 초기화라고 한다. 실제 데이터를 얻기 위해 getName()을 호출했을시 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성하고, 해당 객체의 참조를 target 변수에 보관한다. 프록시 객체는 target 변수에 저장된 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다. 1. Mem.. 2019. 8. 6.