본문 바로가기

분류 전체보기147

QueryDSL을 적용해보자 Querydsl 이란? 쿼리를 자바코드로 작성할 수 있다. 또한, Spring Data JPA로 해결하지 못하는 복잡한 쿼리/동적 쿼리를 해결할 수 있다. Querydsl 왜 사용할까? 쿼리-를 자바 코드로 작성할 수 있다. 문법 오류를 컴파일 시점에 알 수 있다. dependency 설정방법 (gradle) 플러그인에 추가 plugins { id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } dependencies에 추가 dependencies { implementation 'com.querydsl:querydsl-jpa' } 추가 def querydslDir = "$buildDir/generated/querydsl" querydsl { library.. 2022. 8. 26.
스프링 데이터 JPA에서 Auditing을 적용해보자! Auditing은? 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용한다. 실무에서 많이 사용된다. 등록일 : 모든 테이블에 공통으로 적용 (권장) 수정일 : 모든 테이블에 공통으로 적용 (권장) 등록자, 수정자 : 테이블에 따라 정한다 (팀 컨밴션) 먼저, 순수 JPA에서 사용한다면? 우선, 등록일과 수정일만 적용해보자 public class Member extends JpaBaseEntity { } @*MappedSuperclass :* 는 테이블과는 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할이다. @PrePersist : 엔티티가 비영속 상태에서 영속 상태가 되는 시점 이전에 실행된다. @PreUpdate : 영속 상태의 엔티티를 이용하여 데이터 .. 2022. 8. 25.
[스프링 데이터 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.