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;
'Spring Boot' 카테고리의 다른 글
| 예외 처리 : 예외 처리의 필요성 (1) | 2025.08.12 |
|---|---|
| Spring 안정성 높이기 : 애플리케이션 안정성 (3) | 2025.08.11 |
| 즉시 로딩(EAGER), 지연 로딩(LAZY) (3) | 2025.07.26 |
| Spring Data JPA : 영속성 전이(Cascade) (0) | 2025.07.25 |
| Spring Data JPA : Repository 작성 (0) | 2025.07.25 |