JPA

JPA

QueryDSL from절 Sub Query 가능하게 하기

업무 중 QueryDSL관련 성능 튜닝을 진행하는 중 알게된 내용에 관해 기술합니다. 예제 코드는 github에 업로드 되어 있으며 repository내 테스트 코드로 확인 가능합니다. https://github.com/cobiyu/querydsl-subquery GitHub - cobiyu/querydsl-subquery Contribute to cobiyu/querydsl-subquery development by creating an account on GitHub. github.com QueryDSL에서 from subquery가 필요한 이유 커버링 인덱스 querydsl-jpa에서는 커버링 인덱스를 통한 조회 성능 튜닝의 경우에도 from절의 subquery가 불가능하기 때문에 아래와 같은 방식..

JPA

@Transactional에 관한 고찰 part 2

이전 글과 이어져서 작성되는 글입니다. https://cobbybb.tistory.com/25 @Transactional에 관한 고찰 (or 반성) @Transactional..??? Spring이 알아서 해주잖아..? Spring + JPA 로 개발하다 보면 눈에 보이지 않는 것들에 대해서 놓치고 개발하는 경우가 빈번하게 생깁니다. 생각보다 많은 개념이 들어가 있는 @Transaction cobbybb.tistory.com TransactionManager와 EntityManager 이전 글에서 Spring에서 @Transactional이 어떤 식으로 트랜잭션을 관리하는지에 TransactionManager를 중심으로 알아보았습니다. 이번엔 spring에서 일반적으로 사용하는 JPA의 Transacti..

JPA

@Transactional에 관한 고찰 (or 반성)

@Transactional..??? Spring이 알아서 해주잖아..? Spring + JPA 로 개발하다 보면 눈에 보이지 않는 것들에 대해서 놓치고 개발하는 경우가 빈번하게 생깁니다. 생각보다 많은 개념이 들어가 있는 @Transactional 조차도 말 그대로 Spring느님께서 다 알아서 해주니까요 😅 그러다가 장애 나거나 커스터마이징이 필요하다면...? 그러다 어느 순간 커스타마이징, 장애 등의 상황에서 대응하려고 보면 난감한 상황에 놓이게 됩니다. 그래서 구글링을 시작하지만, Spring이 알아서 해주던 영역이기 때문에 처음 보는 단어들뿐입니다. 그래서 Spring안에서 어떤 방식으로 @Transactional이 동작하는지 눈으로 확인해보려 합니다. @Transactional !!!! AOP ..

JPA

[JPA] 일반 Join과 Fetch Join의 차이

JPA를 사용하다 보면 바로 N+1의 문제에 마주치고 바로 Fetch Join을 접하게 됩니다. 처음 Fetch Join을 접했을 때 왜 일반 Join으로 해결하면 안되는지에 대해 명확히 정리가 안된 채로 Fetch Join을 사용했습니다. 어떤 문제 때문에 일반 join으로 N+1을 해결하지 못하는지를 시작으로 해서 Fetch Join, Join의 차이점을 정리해보겠습니다. 사용한 예제는 github에 업로드해두었으니 참고 바랍니다. https://github.com/cobiyu/join-fetchjoin-compare cobiyu/join-fetchjoin-compare Contribute to cobiyu/join-fetchjoin-compare development by creating an ac..

JPA

Proxy형태로 동작하는 JPA @Transactional

본 포스팅은 아래 키워드를 검색하는 분들에게 참고가 될 만한 글입니다. Methods annotated with '@Transactional' must be overridable jpa transactional private jpa transaction same class same class transaction not working call transaction method from other transaction 예제 코드는 아래 github에 작성되어 있습니다. https://github.com/cobiyu/transactional_proxy cobiyu/transactional_proxy Contribute to cobiyu/transactional_proxy development by creat..

JPA

[JPA] OneToOne 성능 튜닝 사례 1

본 예시는 제 github에 springboot의 h2를 사용한 형태로 레파지토리를 구성해놨습니다. (https://github.com/cobiyu/querydsl) 처음 JPA(Hibernate)를 도입하는 과정 중 제일 난감한 부분은 OneToOne이라고 생각합니다. 아래 테이블 구조를 참고로 문제 영역에 대한 예시를 설정해 보겠습니다. member는 1개의 phone만 소유 가능하며 소유하지 않을 수도 있음 member는 favorite이라는 N개의 찜한 상품을 소유할 수 있음 member는 favortie의 목록을 기반으로 order 테이블에 주문서를 생성 할 수 있음 "찜한 상품" 목록을 이용한 주문서 만들기 (https://github.com/cobiyu/querydsl 의 before 브랜치..

JPA

JPQL과 영속성 컨텍스트의 관계

flush 영속성 컨텍스트의 변경 내용을 DB에 반영하는 이벤트 JPQL JPQL : Jpa의 Entity 객체들을 이용해서 Query할수있는 객체 지향 쿼리 예제 /** * User.java */ @Entity @Getter @Setter @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; public User(String name) { this.name = name; } } 실행하려는 로직은 아래와 같습니다. user 4개 insert JPQL을 이용해서 4번째 insert한 user의 name을 "changed na..

JPA

MultipleBagFetchException과 default_batch_fetch_size

Class User{ @OneToMany List orderList; @OneToMany List couponList; } Class Order{ ... } Class Coupon{ ... } 위와 같은 구조에서 User의 두 가지 OneToMany인 order정보와 coupon정보를 한번에 모두 가져와야하는경우 fetch join으로 한번에 가져오거나 혹은 둘 다 Eager를 설정하는등의 방법이 생각난다. 하지만 JPA 입장에서 생각을해보면 애매해진다. 먼저 일반적인 OneToMany fetch조인의 동작방식을 생각해보자 1. jpql을 SQL의 join문으로 변경되서 DB에서 실행됨 2. DB에서 row단위로 NxM개의 row가 JPA에 전달됨 3. JPA는 전달받은 데이터를 각 엔티티의 id를 기반..

코비코비
'JPA' 카테고리의 글 목록