Spring/Spring

Spring Data JPA: 메서드 이름 기반 쿼리와 @Query 애노테이션 기반 쿼리 비교

JoonYong 2024. 6. 6. 12:31

 

 

Spring Data JPA를 사용하면 데이터베이스와의 상호작용을 쉽게 처리할 수 있습니다. 두 가지 주요 방법으로 쿼리를 정의할 수 있습니다. 메서드 이름 기반 쿼리@Query 애노테이션 기반 쿼리 이 두 가지 방법의 차이점과 장단점을 설명하겠습니다.

 

1. 메서드 이름 기반 쿼리란?

메서드 이름 기반 쿼리는 Spring Data JPA에서 제공하는 강력한 기능으로, 메서드 이름을 분석하여 자동으로 쿼리를 생성하는 방식입니다. 메서드 이름의 접두사와 속성 이름을 사용하여 쿼리를 생성합니다.

public interface ChampionRepository extends JpaRepository<Champion, Long> {
    Champion findByName(String name);
}

이 예제에서 findByName 메서드는 Spring Data JPA가 자동으로 SELECT * FROM Champion WHERE name = ?와 같은 SQL 쿼리를 생성하도록 합니다.

 

장점
간결함: 메서드 이름만으로 쿼리를 정의할 수 있어 코드가 매우 간결합니다.
표준화: Spring Data JPA의 표준 규칙을 따르기 때문에 일관된 방법으로 쿼리를 정의할 수 있습니다.
자동 완성: IDE의 자동 완성 기능을 통해 쉽게 쿼리를 작성할 수 있습니다.

단점
제한된 유연성: 복잡한 쿼리나 조인을 표현하는 데 한계가 있습니다.
가독성 문제: 메서드 이름이 길어질 수 있어 가독성이 떨어질 수 있습니다

 

2. @Query 애노테이션 기반 쿼리란?

@Query 애노테이션 기반 쿼리는 JPQL (Java Persistence Query Language)을 사용하여 명시적으로 쿼리를 정의하는 방식입니다. 복잡한 쿼리나 조인을 사용할 때 유용합니다.

public interface ChampionRepository extends JpaRepository<Champion, Long> {
    @Query("select c from Champion c where c.name = :name")
    Champion question2(@Param("name") String name);
}

이 예제에서 question2 메서드는 JPQL을 사용하여 명시적으로 쿼리를 정의합니다.

장점
●  유연성: 메서드 이름 기반 쿼리로는 표현할 수 없는 복잡한 쿼리를 정의할 수 있습니다.
●  명시적 쿼리 정의: JPQL을 사용하여 명시적으로 쿼리를 정의하므로, 복잡한 로직을 보다 쉽게 표현할 수 있습니다.
●  커스터마이즈 가능: 필요한 모든 조건과 조인을 자유롭게 설정할 수 있습니다.

단점
●  코드 길이: 메서드 이름 기반 쿼리보다 코드가 길어질 수 있습니다.
●  오타 위험: JPQL 쿼리를 직접 작성해야 하므로 오타나 문법 오류가 발생할 수 있습니다.

 

 

3. 차이점 비교

구분 메서드 이름 기반 쿼리 @Query 애노테이션 기반 쿼리
간결함 매우 간결함 상대적으로 길어질 수 있음
유연성 단순한 쿼리에 적합 복잡한 쿼리에 적합
자동 완성 지원 지원되지 않음
오타 위험 낮음 높음 (직접 작성)
표준화 표준 규칙에 따름 자유로운 작성 가능

 

 

 

 

 

 

https://velog.io/@tkrhdrhkdduf/Spring-Data-JPA-%ED%99%9C%EC%9A%A9