본문 바로가기

공부141

[스프링 데이터 JPA] 사용자 정의 레포지토리를 추가로 구현하는 방법을 알아보자 스프링 데이터 JPA 레포지토리는… 스프링 데이터 JPA 레포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성한다. 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다! 그렇다면, 다양한 이유로 인터페이스의 메소드를 직접 구현하고 싶다면 어떻게 해야 할까? 다음과 같은 방법들이 있다. JPA 직접 사용 EntityManager 스프링 JDBC Template MyBatis 사용 데이터베이스 커넥션 직접 사용 Querydsl 사용 직접 해결해보자 1. 사용자 정의 인터페이스 2. 사용자 정의 인터페이스 구현 클래스 규칙: 상속받을 MemberRepository의 네이밍에 Impl을 붙여서 구현한다. (레포지토리 인터페이스 이름 + Impl) 스프링 데이터.. 2022. 8. 25.
JPA Hint를 통해 성능최적화를 할까? JPA Hint이 뭘까? JPA 쿼리 힌트이다. SQL 힌트가 아닌 JPA 구현체에게 제공되는 힌트이다. 기능은? readOnly를 적용하여 성능 최적화를 할 수 있다. 하지만, 진짜 진짜 중요한 트래픽이 많은 곳에서만 사용하자. 성능테스트를 해보고 중요할 때에만 사용하자! 다음과 같은 예시에서, member를 찾은 이후 update를 하더라도 쿼리가 실행되지 않는다. 또한, 변경감지가 발생하지 않는다(readOnly) 예상하지 못한 버그가 발생할 수 있다. @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value ="true")) Member findReadOnlyByUsername(String username); 쿼리 힌트를 Page.. 2022. 8. 25.
@EntityGraph을 통해 간편히 페치조인을 적용해보자 @EntityGraph가 무엇일까? @EntityGraph는 연관된 엔티티들을 SQL 한번에 조회하는 방법이다. 페치조인이 무엇일까? member의 team은 지연로딩 관계라 가정해보자. 다음과 같이 team의 데이터를 조회할 때 마다 쿼리가 실행된다(N+1 문제) 연관된 엔티티를 한번에 조회하려면 다음과 같이 페치 조인이 필요하다 @EntityGraph 사용해보자 페치 조인(FETCH JOIN)의 간편 버전이다 LEFT OUTER JOIN 사용한다 public interface MemberRepository extends JpaRepository { @Override @EntityGraph(attributePaths = {"team"}) List findAll(); @EntityGraph(attribu.. 2022. 8. 25.
[스프링 데이터 JPA] 벌크성 수정 쿼리에 대해 알아보자 벌크성 수정 쿼리는 언제사용될까? 벌크성 수정 쿼리는 한 번에 모든 내용을 변경해야 할 때 사용한다! JPA를 사용한 벌크 수정 쿼리 스프링 데이터 JPA를 사용한 벌크 수정 쿼리 @Modifying(clearAutomatically = true) @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); 주의사항 @Modifying 어노테이션을 넣어줘야 한다! 사용하지 않으면 예외가 발생한다. 벌크성 쿼리를 실행 후 영속성 컨텍스트를 초기화 해주어야 한다. @Modifying(clearAutomatically = true) 기본값은 false이다. 이 옵션이 없다면 영속.. 2022. 8. 25.
스프링 데이터 JPA에서 페이징과 정렬을 해보자 먼저, 순수 JPA에서의 페이징은 어떻게 할까? 예제로 알아보자. 검색조건은 다음과 같다 검색조건: 나이가 10살 정렬조건: 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지당 데이터는 3건 스프링 데이터 JPA의 페이징과 정렬은 어떻게 할까? 1. 페이징과 정렬 파라미터 org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 2. 특별한 반환 타입 org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징 org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능(.. 2022. 8. 25.
스프링 데이터 JPA의 반환타입을 알아보자 스프링 데이터 JPA는 유연한 반환 타입을 지원한다! 같은 네이밍인 findByUsername 를 통해 Member를 찾아보자 조회 결과가 많거나 없으면 어떻게 될까? 컬렉션 결과없음: 빈 컬렉션 반환 단건 조회 결과없음: null → Optional로 받자 결과 2건 이상: 예외발생 프로젝트에서 Optional를 사용했었는데 다른 경우도 있다는 것을 알게되었다! 2022. 8. 25.