Akashic Records

Spring Data JPA @Query 어노테이션 본문

Spring.io

Spring Data JPA @Query 어노테이션

Andrew's Akashic Records 2023. 4. 10. 23:42
728x90

@Query 어노테이션은 Spring Data JPA에서 사용자 정의 쿼리를 작성하는데 사용됩니다. @Query 어노테이션을 사용하면 레포지토리 메서드에 JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리를 지정하여 복잡한 조회 쿼리를 작성할 수 있습니다. 이렇게 하면 기본 제공되는 메서드 이름 기반의 쿼리를 사용할 수 없는 경우에도 데이터를 조회할 수 있습니다.

예제를 통해 자세히 살펴보겠습니다.

엔티티 클래스:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
    // 생략: 생성자, getter, setter
}

 

레포지토리 인터페이스:

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.email = ?1")
    User findByEmail(String email);

    @Query(value = "SELECT * FROM users u WHERE u.last_name = :lastName", nativeQuery = true)
    List<User> findByLastNameWithNativeQuery(@Param("lastName") String lastName);
}

위의 UserRepository 인터페이스에서 findByEmail 메서드는 JPQL 쿼리를 사용하며, 이메일을 기준으로 사용자를 조회합니다. ?1은 첫 번째 매개변수인 email을 나타냅니다.

findByLastNameWithNativeQuery 메서드는 네이티브 SQL 쿼리를 사용합니다. 이 경우, nativeQuery = true 속성을 추가하여 네이티브 쿼리임을 명시해야 합니다. :lastName은 @Param 어노테이션을 사용하여 메서드 매개변수와 연결됩니다.

이렇게 @Query 어노테이션을 사용하여 사용자 정의 쿼리를 작성할 수 있으며, JPQL 또는 네이티브 SQL 쿼리를 이용하여 복잡한 데이터 조회 작업을 수행할 수 있습니다.

 

@Query 어노테이션을 사용하여 수정 작업(INSERT, UPDATE, DELETE)을 수행하는 메서드를 작성할 수도 있습니다. 이 경우, @Modifying 어노테이션을 추가하여 해당 메서드가 수정 작업을 수행함을 명시해야 합니다.

예제를 통해 설명하겠습니다.

엔티티 클래스는 이전 예제와 동일하게 User 클래스를 사용합니다.

레포지토리 인터페이스:

public interface UserRepository extends JpaRepository<User, Long> {

    @Modifying
    @Query("UPDATE User u SET u.email = :newEmail WHERE u.id = :id")
    int updateUserEmail(@Param("id") Long id, @Param("newEmail") String newEmail);

    @Modifying
    @Query(value = "DELETE FROM users WHERE email = :email", nativeQuery = true)
    int deleteUserByEmailWithNativeQuery(@Param("email") String email);
}

 

updateUserEmail 메서드는 JPQL 쿼리를 사용하여 사용자 이메일을 업데이트합니다. @Modifying 어노테이션을 추가하여 해당 메서드가 수정 작업을 수행함을 명시합니다. :id와 :newEmail은 각각 @Param 어노테이션을 사용하여 메서드 매개변수와 연결됩니다.

deleteUserByEmailWithNativeQuery 메서드는 네이티브 SQL 쿼리를 사용하여 이메일을 기준으로 사용자를 삭제합니다. nativeQuery = true 속성과 함께 @Modifying 어노테이션을 추가하여 해당 메서드가 수정 작업을 수행함을 명시합니다. :email은 @Param 어노테이션을 사용하여 메서드 매개변수와 연결됩니다.

@Query와 @Modifying 어노테이션을 사용하여 사용자 정의 쿼리를 작성하고, 조회, 수정 작업을 수행할 수 있습니다. 이를 통해 Spring Data JPA를 사용하여 복잡한 데이터 처리 작업을 손쉽게 구현할 수 있습니다.

728x90
Comments