본문 바로가기
반응형

hibernate6

Hibernate Fetch Join시 메모리에서 페이징 처리 사전 차단하기 Hibernate (Spring Data JPA) 를 사용하다보면 종종 HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 의 WARN (경고) 로그 메세지를 만난다. 해당 로그는 페이징 처리할때 여러 엔티티를 Fetch Join 을 하면 발생한다. Fetch Join은 N+1 문제를 해결하는 가장 자주 사용되던 방식이다. 하지만, 경고 메시지에서 언급했듯이 페이징 처리시에 사용할 경우 페이징이 전혀 적용되지 않고, 조건에 해당하는 모든 데이터를 가져와 메모리에 올려두고 사용한다. 조건에 해당 하는 데이터 전체를 가져오기 때문에 당연히 성능 상 이슈가 되며, 이를 메모리에 올려두고 페이징을 처리하니 이.. 2023. 10. 2.
JPA Entity Select에서 Update 쿼리 발생할 경우 JPA Entity를 단순히 조회만 하였는데도, 예상치 못하게 Update 쿼리가 발생하는 경우가 있습니다. 이를테면 다음과 같은 경우인데요. find로 조회만 하는데,다음과 같이 select와 update 쿼리가 발생 하였습니다.신기한 것은 전체 컬럼에 대한 Update 쿼리가 발생한것입니다. 이렇게 트랜잭션 내에서 Update 쿼리가 발생하면 보통은 Dirty Checking이 발생했음을 의심해볼만 한데요. 의심이라고 말씀드리는 이유는 실제로 다른 원인이 있을수도 있기 때문입니다. 자 그럼 왜 이렇게 발생했는지 실제 예제 코드와 함께 보겠습니다. 1. 예제 코드 먼저 위에서 발생한 Entity를 비롯한 서비스 코드는 다음과 같습니다. Order @Getter @NoArgsConstructor @Ent.. 2020. 11. 28.
Querydsl (JPA) 에서 Cross Join 발생할 경우 JPA 기반의 환경에서 Querydsl를 사용하다보면 @OneToOne 관계에서 Join 쿼리 작성시 주의하지 않으면 Cross Join이 발생할 수 있습니다. CrossJoin 이란 집합에서 나올 수 있는 모든 경우를 이야기 합니다. 예로 A 집합 {a, b}, B 집합 {1,2,3}이며 이들의 CrossJoin은 AxB로 다음과 같습니다. {(a, 1), (a, 2), (a, 3), (b, 1), (b, 2), (b, 3)} 당연히 일반적인 Join보다 성능상 이슈가 발생하게 됩니다. 이번 시간에는 어떤 경우에 이런 Cross Join이 발생하는지, 어떻게 해결할 수 있는지 확인해보겠습니다. 모든 코드는 Github에 있습니다. 1. 테스트 환경 테스트 환경은 다음과 같습니다. Spring Boot .. 2020. 11. 16.
Querydsl Select 필드로 Entity 사용시 주의 사항 JPA 기반의 애플리케이션 개발에서 복잡한 조회가 필요할때는 Querydsl을 많이 사용합니다.아무래도 Querydsl로 추상화된 상태에서 쿼리를 작성하다보면 실제 어떻게 쿼리가 발생하는지 확인하지 않고 개발할때가 많습니다. 이를테면 쿼리 한번으로 해결하기 위해 select 필드에 Entity를 그대로 선언하는 경우가 바로 그런 경우인데요.(아래와 같은 쿼리일때입니다.) // customer는 Customer queryFactory .select(Projections.fields(EntityB.class, ... EntityA.EntityC) // EntityA의 EntityC 를 바로 선언 ) .from(EntityA) .where(..조건문..) .fetch() 위와 같이 쿼리를 작성하게 되면 Ent.. 2020. 8. 13.
Spring Boot Data JPA 2.0 에서 id Auto_increment 문제 해결 안녕하세요? 이번 시간엔 Spring Boot JPA 2.0 에서 PK의 Auto_increment 문제를 알아보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후기를 정리하는 Github, 이 모든 내용을 담고 있는 블로그가 있습니다. ) 문제 회사의 신규 시스템 구축을 Spring Boot 2.0으로 진행하게 되었습니다. 진행 도중 Spring Data Jpa의 @GeneratedValue가 기존과 다르게 작동하는걸 발견하게 되었습니다. 예를 들어 아래와 같이 1.5.x 에서 사용하던대로 엔티티 클래스를 생성했습니다.2.0에서도 기본 전략이 AUTO임을 확인하고 테스트 코드를 작성했는데요. 이렇게 M.. 2018. 5. 12.
2) 스프링부트로 웹 서비스 출시하기 - 2. SpringBoot & JPA로 간단 API 만들기 이번 시간엔 SpringBoot & JPA로 간단한 API를 만들 예정입니다. Tip) 아직 SI 환경에선 Spring & MyBatis 를 많이 사용하지만, 쿠팡/우아한형제들/NHN Entertainment 등 자사 서비스를 개발하는 곳에선 SpringBoot & JPA를 많이 사용하고 있습니다. 특히 기존 프로젝트 환경을 개편하시는 분들은 거의 위 스택으로 전환하려고 합니다. SpringBoot & JPA로 진행하시면 진짜 집중해야할 비지니스 로직에만 집중할수 있습니다. (Express, Django, Rails 못지않게 생산성이 좋습니다.) 자사 서비스를 운영하는 회사에선 점점 더 많이 사용되고 있기 때문에 이런 회사로 가고자 하시는 분들은 이번 기회에 꼭! 시작해보셨으면 합니다. 첫번째 기능으로 .. 2017. 12. 28.

728x90
반응형