본문 바로가기

JPA5

[JPA] 1 : N 연관관계에서 limit 사용 시 OutOfMemory가 발생하는 문제 해결 0. 이 글을 쓰게된 이유 팀원분이 성능 최적화를 하려고 짧은 시간에 많은 요청을 보내던 중 OutOfMemory 예외가 발생했다. 평소에는 괜찮다가 왜 이런 문제가 발생했는지 알아보던 중에 배웠던 것을 기록하기위해 이 글을 쓰게 되었다. 1. Entity 연관관계 다음과 같이 Roadmap Entity와 RoadmapTag Entity가 있고, 이 둘은 1 : N 연관관계를 가지고있었다. 로드맵 실제로는 이것보다 훨씬 연관관계가 많고 복잡한 엔티티이지만 해당 연관관계만 보여주겠다. 로드맵 태그 2. 문제 상황 로드맵과 로드맵 태그를 같이 조회하는 상황이다. 이때, 로드맵 태그가 Lazy Loading이 설정이 되어있으니, 각 로드맵의 태그에 접근할때마다 쿼리가 나갈것이다. 그래서 fetch join을 .. 2023. 10. 5.
[JPA] 기본키 생성 전략 0. 이 글을 쓰게 된 이유 jpa의 id 생성 전략을 다양하게 활용해보고자 이 글을 쓰게되었다. 1. GenerationType GenerationType이란 기본 키 생성 전략을 정의하는 역할을 하는 enum이다. 사용법은 다음과 같다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; GenerationType에 어떤 전략이 살펴보자. 2. GenerationType.IDENTITY IDENTITY은 기본키 생성을 데이터베이스의 열의 식별 속성으로 위임한다. 즉, 데이터베이스 자체에서 기본키 생성을 관리한다. 대표적으로 MySql의 auto increment, PostgreSQL의 serial을 활용한다. 2.1 장점 .. 2023. 7. 7.
[JPA] 영속성 전이와 고아 객체 0. 이 글을 쓰게 된 이유 프로젝트에 앞서 JPA 복습을 하면서 영속성 전이와 고아 객체 부분이 명확하지 않다는 느낌이 들어 정리를 하게 되었다. 1. 영속성 전이(CASCADE) 다음과 같은 엔티티 연관 관계가 있다고 가정하자 @Entity @Getter @Setter public class Parent { @Id private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } ======================================================== @Entity @Getter @Setter public class Child { @Id private Long id; @Man.. 2023. 6. 29.
[JPA] N + 1 문제 2 (fetch join 최적화) Intro 앞선 게시물에서 N+1문제가 무엇인지 알아보고 기본적으로 지연 로딩으로 설정하는 이유에 대해서 알아봤다. SQL을 조금 알고 있는 사람이라면 앞 게시물에 나오는 쿼리를 보고 join을 사용해서 단 한번의 쿼리로 다 가져올 수 있지 않을까 생각이 들것이다. 오늘은 JPQL에서 join을 최적화해서 할 수 있는 fetch join에 대해서 알아보자. 연관관계는 저번이랑 동일하게 위와 같다고 가정한다. fetch join 문제 발생 저번이랑 동일하게 Member를 가져올 때 Team도 함께 가져오는 상황이라고 가정하자. 이를 JPQL로 표현하면 다음과 같다. select m from Member m; 지연 로딩을 사용하면 이렇게 가져온 데이터에서 .getTeam 같은 메소드를 이용해 team의 데이.. 2022. 9. 28.
[JPA] N + 1 문제 1 이 글을 쓰게된 이유 JPA를 사용하다보면 예상보다 DB 쿼리가 더 많이 나가서 성능에 문제가 생기는 경우가 있다. 이 경우 대부분 개발자도 모르게 N+1문제가 기본적으로 깔려있는 경우가 많다. 그렇다면 왜 이러한 문제가 발생하고 어떻게하면 해결할 수 있는 지 자세하게 알아보자. N+1문제란? @Entity public Class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FechType.EAGER) private List orders = new ArrayList(); } @Entity @Table(name = "ORDERS") public Class Order { @Id @GeneratedVa.. 2022. 9. 28.