본문 바로가기

Spring Boot

Repository에서 @Query, QueryDSL 작성에 대해

Spring Data JPA

Repository

 - 메서드 이름으로 쿼리를 생성

 - @Query 애너테이션을 활용하는 데 있어 JPQL, Native Query 작성에 대한 이해

 - JPQL과 Native Query의 차이점에 대해

 

 

메서드 이름으로 쿼리를 생성하기

Spring Data JPA에서 Repository 인터페이스 메서드 이름만으로 쿼리를 자동생성 할 수 있음

원하는 Repository에 JpaRepository<Entity이름, PK이름>을 상속하여 활용한다

대부분의 CRUD 및 단순한 조회 쿼리에 매우 유용하다!

 

예시

@Repository
public interface IndexDataRepository extends JpaRepository<IndexData, Long> {
	// 데이터를 등록할 때 썼음, 존재하는지의 여부
    boolean existsByIndexInfoIdAndBaseDate(Long indexInfoId, LocalDate baseDate);
    
    // 데이터 목록을 조회할때 썼음, indexInfo가 있는 데이터를 조회할때 씀
    Page<IndexData> findByIndexInfoAndBaseDataBetween(IndexInfo indexInfo,
                                                      LocalDate startDate,
                                                      LocalDate endDate,
                                                      Pageable pageable);
    // indexInfo에 맞는 id와 localDate를 찾음
    Optional<IndexData> findByIndexInfoIdAndBaseDate(long id, LocalDate localDate);
}

 

* 메서드 이름에 대한 생성 JPQL에 대해서

findByEmailAndAge : SELECT m FROM Member AS m WHERE m.email = ?1 AND m.age = ?2

findTop3ByOrderByAgeDesc = SELECT m FROM Member AS m ORDER BY m.age DESC LIMIT 3

 

* 복잡한 조건이 많아지면 Query DSL이나 @Query의 사용을 권장한다. 근데 어렵다고 함!

 

 

@Query 애너테이션 활용 : 복잡한 쿼리를 작성할 때 SQL문을 직접 작성하는 @Query를 활용할 수 있다

SQL Injection 방지 및 타입의 안정성을 고려해서 파라미터 바인딩을 사용한다고 함

 

JPQL 예시

@Query("SELECT m FROM Member AS m WHERE m.username = :username") // @Query를 활용해서 쿼리문 작성
List<Member> findByUsername(@Param("username") String username); // @Param을 통해 칼럼을 찾음

1. @Query() 작성, entity에서 받는 구문은 :username처럼 씀

2. @Param으로 칼럼을 찾음, @Param("테이블의 칼럼명") 타입 {칼럼에 대응하는 필드명}

 

 

Native Query 예시

// @Query(value = "쿼리문", nativeQuery = true)
@Query(value = "SELECT * FROM member WHERE username = :username", nativeQuery = true)
List<Member> findByNativeUsername(@Param("username") String username)

 

* Query() 안에 value, nativeQuery가 들어간다

* 나머지는 JPQL과 동일함

 

JQPL과 Native Query의 비교

  JPQL Native Query
문법 Entity를 기준으로 함 DB 테이블을 기준으로 함
장점 이식성, 유지보수에 용이함,
Spring Data JPA와 연계가 수월하다
DB성능을 최적화시킬 수 있음
단점 복잡한 쿼리를 작성할 때 제약이 있음 DB에 종속적임, 이식성이 떨어짐

 

* 복잡하거나 성능 최적화가 필요할 때 Native Query를 사용한다, 대부분은 JPQL로 충분함

* @Query는 가독성과 유지보수를 위해 필요할 때 활용할 수 있다

 

JPQL : Select m From Member As m Where m.username = \:username;

Native Query : Select \* From member Where username = \:username;