본문 바로가기

JPA3

[Spring] @OneToOne 에서 N+1 문제 해결하기 직장을 다니면서 기존에 개발했던 프로젝트를 리펙토링 하고 디벨롭하기는 체력도 시간도 되지 않아 입사 초 때는 해야 할 일을 밀어두다가 요즘 다시 예전 기억을 떠올리며, 시간이 될 때 마이브러리 옛날 코드를 보면서 조금씩 천천히 디벨롭해야겠다는 생각이 들었다. 가장 마지막에 개발했던 추천 피드를 개발할 때, @OneToOne에서의 N+1에 대해서 기록하고자 한다. (현 직장에서는 JPA를 사용하지 않고 Mabatis를 사용하기 때문에 JPA에 대해서 많이 까먹은 부분이 많았다.. ) 먼저 @OneToOne 에서의 N+1 가 발생했던 스토리에 대해서 소개하자면.. 현재는 마이브러리에서 "추천 피드"를 조회하는 QueryDsl는 아래와 같다. 조금 복잡하고 보완해야 할 점이 많지만, 이 QueryDsl를 작성.. 2024. 3. 18.
[Spring] JPA Fetch Join 사용시, MultipleBagFetchException 발생 SWM 프로젝트를 하면서, Fetch Join을 사용하여 N+1 문제가 발생하지 않고 연관 관계로 연결되어 있는 엔티티를 조회하려고 했었다. Book 엔티티에는 @ManyToOne 관계로 BookCategory를 가지고 있고, @OneToMany(mappedBy= "book") 관계로는 bookAuthor와 BookTranslator로 가지고 있다. 따라서 Fetch Join을 통해서 Book 엔티티를 조회할 때, Book과 연관 관계를 맺고 있는 BookCategory, BookAuthor, BookTranslator 그리고 BookAuthor와 연관관계를 맺고 있는 Author, BookTranslator와 연관관계를 맺고 있는 Translator까지 모두 조회하려고 했었다! N+1 문제가 발생하지 .. 2023. 8. 3.
[Spring] 벌크 연산 벌크 연산이란 여려 데이터를 한 번에 수정하거나 삭제하는 방법이다. 실제 벌크 연산을 하지 않을 경우, 어떤 성능적 이슈가 생기는지 예시를 통해서 알아보자. @Entity @AllArgsConstructor @NoArgsConstructor class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int age; public void getOlder() { this.age += 1; } } Member member1 = new Member("john", 15); Member member2 = new Member("tom", 19); Member membe.. 2023. 5. 15.