[스프링] 스프링 Data JPA(6) @EntityGraph
·
스프링 데이터 JPA
JPA를 사용하다 보면 가장 자주 겪는 성능 문제 중 하나가 바로 N+1 문제다.회원(Member)과 팀(Team)이 지연 로딩 관계라고 할 때, 단순히 회원 목록을 조회했는데 이후 각 회원의 팀을 가져오는 순간마다 추가 쿼리가 실행된다. 회원이 100명이라면 1(회원 조회) + 100(팀 조회) = 101번의 SQL이 실행되는 꼴이다. 작은 데이터에서는 체감이 안 될 수 있지만, 실제 서비스에서는 쿼리 폭발로 이어져 치명적인 성능 문제가 된다. N+1 문제 예시@Testpublic void findMemberLazy() throws Exception { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamReposi..
[스프링] 지연 로딩과 조회 성능 최적화
·
스프링
JPA는 자바 객체만으로 DB 작업을 처리할 수 있도록 도와주는 편리한 기술이다.특히 저장(insert)이나 단순 조회(select) 정도는 별다른 쿼리 없이도 쉽게 구현된다. 하지만 JPA를 사용하는 프로젝트에서는 조회 성능 문제가 자주 언급된다.특히 연관된 엔티티를 함께 조회해야 할 때, 개발자가 의도하지 않은 수많은 쿼리가 실행되거나 응답 속도가 느려지는 문제가 생길 수 있다. 그래서 실무에서는 아래와 같은 순서로 단계적으로 성능을 개선해가는 방식이 추천된다고 한다.엔티티 직접 반환 → DTO 변환 → fetch join → DTO 직접 조회이 글에서는 각 방식의 구조와 특징, 그리고 어떤 상황에서 사용되는지를 예제와 함께 정리해본다. 예제: 주문(Order)과 회원(Member), 배송(Deliv..
[스프링] JPA에서 제공하는 쿼리 방법
·
스프링
애플리케이션에서 데이터를 다룰 때마다 SQL을 직접 작성하는 일은 생각보다 번거롭다. 쿼리가 길어질수록 가독성은 떨어지고, 테이블 구조가 바뀔 때마다 일일이 SQL을 고쳐야 한다. 여기에 객체와 테이블 사이의 변환까지 신경 써야 한다면, 코드보다 쿼리에 더 많은 시간을 쓰게 된다. JPA는 이런 상황을 줄이기 위해 등장한 기술이다. 데이터베이스와의 상호작용을 객체 중심으로 바꿔주고, 쿼리 역시 테이블이 아닌 엔티티 중심으로 작성할 수 있게 한다. JPA는 다양한 쿼리 방법을 지원하지만, 실무에서 가장 많이 사용되는 것은 JPQL이다. 그리고 성능 최적화 측면에서 자주 등장하는 Fetch Join도 함께 이해할 필요가 있다. JPA에서 제공하는 쿼리 방법JPA는 다음과 같은 방식으로 쿼리를 작성할 수 있다..