본문 바로가기

👩‍💻TIL/JPA4

[JPA] N+1 문제 발생 원인과 해결방법 [JPA] N+1 문제 발생 원인과 해결방법 💡 원인 [JPA] 영속성 관리, 준영속 상태와 지연 로딩, N+1 문제 발생 원인 JPA를 사용하여 개발할 때, 성능상 주의해야 할 것이 N+1 문제이다. 📌 즉시 로딩과 N+1 일반적으로 제공되는 find() 메소드 등을 사용할 때는 jpa가 내부적으로 join문에 대한 쿼리를 만들어서 반환을 하기 때문에 즉시 로딩이 큰 문제가 없어 보이기도 합니다. 그러나 JPQL을 사용할 때, 문제가 발생합니다. JPA는 JPQL을 사용할 때는 글로벌 페치 전략을 참고하지 않고 오직 JPQL 만 사용하기 때문에, 즉시 로딩 / 지연 로딩 구분 없이 쿼리문만 따르게 됩니다. List classrooms = em.createQuery("select c from Classr.. 2022. 8. 31.
[JPA] 영속성 관리, 준영속 상태와 지연로딩, N+1 문제 발생 원인 [JPA] 영속성 관리, 준영속 상태와 지연 로딩, N+1 문제 발생 원인 💡 들어가면서 스프링 환경에서 JPA를 사용할때, 트랜잭션 범위의 영속성 컨텍스트 전략이 기본으로 사용된다. 이름 그대로, 트랜잭션의 범위가 영속성 컨텍스트의 생존 범위가 같다는 의미이다. 트랜잭션을 시작할때, 영속성 컨텍스트가 생성되며, 끝날 때 종료한다. 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다. 더보기 추가 그래서 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다. 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용한다고 해도, 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르기 때문에 멀티 스레드 상황에서 안전하다. 스프링에서는 트랜잭션과 멀티 스레드 상황을 컨테이너가 처리해주어, 개발자.. 2022. 8. 31.
[hibernate]org.hibernate.HibernateException: No Session found for current thread 에러 해결 org.hibernate.HibernateException: No Session found for current thread 가 발생했을 경우 높은 확률로 @Transactional이 빠진 상태이다. 따라서, service나 해당 메소드가 거쳐가는 클래스에 아래와 같이 @Transactional 어노테이션을 추가해주면 해당 에러가 해결된다. 2020. 9. 4.
[JPA/Hibernate] Restrictions 다중 조건 설정하기 [JPA/Hibernate] Restrictions 다중 조건 설정하기 최근 Groovy&Grails를 사용하면서 JPA ORM 과 유사한 GORM을 사용하고 있다. GORM이란? GORM과 ORM은 기본 문법이나, 큰 틀이 거의 유사하다. 하이버네이트 쿼리문을 작성하는 과정에서 조건을 2개 설정할때 오류가 발생했는데 원하는 equal 조건을 담은 다음 and로 연결하니 쿼리가 아주 잘 돌아갔다😂 1. 먼저 Criterion으로 eq 조건을 담아준다. Criterion period = Restrictions.eq('period', searchPeriod) Criterion type = Restrictions.eq('type', searchType) Criterion username = Restrictio.. 2020. 8. 5.