N+1

JPA

[JPA] 페치전략 + 영속성 컨텍스트 등록 방식에 따른 N+1 문제

페치 전략에 따라도 다르지만 영속성 컨텍스트에 어떻게 추가하는지에 따라 또 달라집니다. EAGER Fetch EntityManager.find() find 메소드와 EAGER 페치전략을 사용하면 inner join으로 N+1문제 없이 주로 같이 조회가 되는 연관관계의 경우에 사용할 수 있습니다. EntityManger.createQuery() EAGER 페치전략을 사용해도 EntityManger.createQuery(JPQL)를 사용하면 한 번의 쿼리에 정보를 모두 가져오지 않지만 EAGER 페치전략을 사용하기 때문에 곧바로 N+1 문제가 터집니다. Spring Data JPA JpaRepository의 기본구현체인 SimpleJpaRepository의 findById 와 findAll, 커스텀 find..

개발로그

[Mybatis] JPA 고수인 내가 Mybatis 세계에선 뉴비?

사실 JPA 고수 아닙니다.   자바 백엔드 시작을 김영한님의 강의를 보고 시작한만큼 DB접근 기술을 JPA밖에 몰랐었고, 올해 초에 프로그래머스에서 진행한 단순 CRUD 구현을 그만 ! 스터디를 들으면서 JDBC Template를 써보긴했지만 스터디 커리큘럼을 따라가면서도 테이블 정의하는 것과 PrepareStatment로 쿼리짜는 게 귀찮아 DBA의 튜닝 쿼리를 빠르게 적용할 수 있겠다는 장점만 기억하는 것과 JPA를 쓰고 싶다는 생각만 했었던 것 같습니다. JPA를 한번 더 추상화한 스프링 데이터 JPA를 사용하면서 얼마나 많은 부분이 추상화된지 이론적으로 공부는 했지만 마이바티스를 다뤄보면서 직접 테이블 생성과 쿼리를 짜며 프로젝트를 진행하며 사용한 후기를 정리합니다. Mybatis-Spring ..

JPA

[JPA] N+1, Fetch Join, JPQL @Query 사용 후기

N+1 문제 이전에 김영한님의 JPA 강의 중 연관관계 어노테이션에 @XToOne에 Fetch.Type을 LAZY를 추천한다. @XToMany는 기본으로 LAZY가 걸려있지만 @XToOne은 EAGER가 걸려 SELCT 하는 엔티티가 참조하는 엔티티도 모두 불러오기 때문이다. 참조 타입을 LAZY로 걸고 해당 엔티티를 사용하지 않으면 N+1 문제를 발생하는 쿼리를 발생시키지 않지만 LAZY를 걸어도 해당 엔티티를 사용하면 엔티티 프록시 객체는 모든 값을 가지고 있지 않기 때문에 값을 가져오기 위해 (영속성 컨텍스트,DB)로 N+1 문제를 발생하는 쿼리를 날린다. Join, Fetch Join Spring Data JPA가 제공해주는 것 외에도 JPQL을 사용해야하는 경우엔 @Query를 사용한다. JPQ..

비오베베
'N+1' 태그의 글 목록