
[Spring Data JPA] EntityGraph 사용해서 쿼리 조회 최적화
2022. 9. 26. 21:15
스프링/JPA
EntityGraph 지연로딩 간단 개념 엔티티를 설계할 때 연관관계 매핑에서 FetchType을 보통 LAZY로 설정해주는 게 일반적이다. 지연로딩이라고 흔히 부르는 이 설정은 다양한 연관관계로 매핑되어 있는 엔티티를 호출할 때 셀렉트 쿼리의 최적화를 위해 다른 엔티티를 프록시 객체로 생성하는 것을 말한다. ex) Member와 Team이 N:1(다대일) 관계일 때 Member 엔티티를 호출하면 Team 엔티티는 프록시 객체로 생성되고 Member에만 select 쿼리를 날린다. 쿼리 최적화를 위해 지연로딩 설정을 해주지만 오히려 이런 설정이 최적화에 불리할 때가 있다. Member(N) : Team(1) 엔티티 관계를 예로 들겠다. Member를 생성하면 Team은 프록시 객체다. 그렇기에 Team ..

[Spring Data JPA] 사용자 정의 레파지토리 생성
2022. 9. 26. 20:40
스프링/JPA
레파지토리에 구현한 메서드만으로 해결이 어려운 복잡한 쿼리, 동적 쿼리 등은 보통 사용자 정의 레파지토리를 만들어서 해결한다. 그리고 핵심 비즈니스 로직이 담긴 쿼리와 그 외 특정 용도로 만든 쿼리를 분리해주는게 베스트 인 것도 이유가 된다. 바로 알아보겠다. 사용자 정의 레파지토리 생성 public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 레파지토리를 생성한다. 일반적인 인터페이스로 생성하면 되며, 별도의 어노테이션은 기본적으로 없어도 된다. 임의의 클래스 만들어서 사용자 정의 레파지토리 상속받기 @RequiredArgsConstructor public class MemberRepositoryImpl implements ..

[Spring Data JPA] Update 쿼리 사용해서 Bulk로 수정하기.
2022. 9. 21. 17:48
스프링/JPA
변경감지 vs Bulk업데이트 JPA에는 변경감지 기능이 있다. 영속성 컨텍스트에서 불러온 엔티티의 값을 Setter 등의 메서드로 수정해주면 그 값이 영속성 컨텍스트에 반영되는 것을 말한다. 그런데 만약 엔티티들에 일괄적으로 동일한 값을 추가하거나 삭제하는 등의 수정이 필요할 때, 변경감지로 인한 값 수정은 최선이 아닐 수 있다. 해당 엔티티들을 개별적으로 전부 영속성 컨텍스트에서 꺼내와서 하나씩 변경된 값을 반영해야 하기 때문이다. 그렇기에 우리는 직접 쿼리를 작성해서 한번에 값을 수정해볼 것이다. public interface MemberRepository extends JpaRepository { @Modifying(clearAutomatically = true) @Query("update Mem..

[Spring Data JPA] 페이징 메서드 구현 - Page 타입
2022. 9. 20. 21:07
스프링/JPA
public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age " + "order by m.userName desc", Member.class) .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } 순수 JPA로 페이징을 한다면 위와 같이 메서드를 만들고 JPQL을 작성해야 했다. Spring Data JPA는 이 과정을 훨씬 쉽게 구현할 수 있게 해줄 뿐 아니라, 여러 가지 기능도 갖고 있어 코드 작성을 수월하게 도와준다. 페이징을 위해서는..

[Spring Data JPA] @NamedQuery 없이 레파지토리에 직접 쿼리 작성하기
2022. 9. 19. 22:30
스프링/JPA
지난번 엔티티에 @NamedQuery를 이용해 JPQL을 작성 후 값을 조회하는 방법을 알아보았다. https://imcoding.tistory.com/60 [Spring Data JPA] NamedQuery 사용하기 NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 imcoding.tistory.com 하지만 실제로 위 방법은 실무에서 많이 쓰이지 않는다. 엔티티에 쿼리문을 작성하는 방식 자체가 속성값만을 유일하게 갖는 게 베스트인 엔티티 취지에 맞지 않기 때문이다. 오히려 쿼리문은 레파지토리에 직접 작성하는 게 더 어..

[Spring Data JPA] NamedQuery 사용하기
2022. 9. 19. 20:47
스프링/JPA
NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 외에 특성 조건에 따른 값을 조회하고자 한다면 어떻게 해야할까? 물론 엔티티 매니저가 제공하는 createQuery 메서드를 사용해 JPQL문으로 DB에서 값을 조회할 수 있다. 하지만 만약 JPQL문의 컬럼명이 잘못 되었어도 해당 메서드를 호출하기 전에는 에러가 발생하지 않아 알아차리기 힘들다. 메서드 이름으로 쿼리를 생성해주기도 하지만, 조건이 많아질수록 메서드 이름이 길어진다는 단점이 있다. (findByAgeLessThan, findByUserNameAndAgeGr..