관리 메뉴

Life goes slowly...

[JPA] JPA에서 JpaRepository를 사용하여 쿼리 작성 방법 본문

프로그래밍/Java

[JPA] JPA에서 JpaRepository를 사용하여 쿼리 작성 방법

빨강소 2026. 1. 31. 09:18
728x90
반응형

Spring Data JPA에서 JpaRepository를 사용하면서 직접 쿼리를 작성하는 방법은 크게 세 가지가 있다. 단순한 이름 규칙부터 복잡한 동적 쿼리까지 상황에 맞게 선택하시면 된다.

 


1. 쿼리 메소드 (Query Methods)

가장 간단한 방법입니다. 메소드 이름을 특정 규칙에 맞춰 선언하면 JPA가 이를 해석해 SQL을 자동으로 생성한다.

단순조회나 간단한 조건의 쿼리를 사용할때 사용하는 방식이다.(And, Or정도)

  • 장점: 간단함, 별도의 쿼리 작성 불필요.
  • 단점: 조건이 많아지면 메소드 이름이 너무 길어짐.
public interface UserRepository extends JpaRepository<User, Long> {
    // SELECT * FROM user WHERE email = ?
    Optional<User> findByEmail(String email);

    // SELECT * FROM user WHERE name = ? AND age > ?
    List<User> findByNameAndAgeGreaterThan(String name, int age);
}

 

 


2. @Query 어노테이션

메소드 위에 직접 JPQL(Java Persistence Query Language)이나 Native SQL을 작성하는 방식이다. 고정된 복잡한 쿼리 나 특정 DB 전용 함수 사용시 사용하는 방식이다.

  • 장점: 복잡한 Join이나 통계 쿼리에 적합, 이름 규칙에서 자유로움.
  • JPQL: 엔티티 객체를 대상으로 쿼리 수행.
  • Native Query: 특정 DB 전용 SQL을 그대로 사용.
public interface UserRepository extends JpaRepository<User, Long> {
    
    // JPQL 사용 (엔티티와 필드 이름 기준)
    @Query("SELECT u FROM User u WHERE u.status = 'ACTIVE' ORDER BY u.id DESC")
    List<User> findAllActiveUsers();

    // 파라미터 바인딩 (@Param)
    @Query("SELECT u FROM User u WHERE u.name = :userName")
    User findUserByName(@Param("userName") String name);

    // Native Query 사용
    @Query(value = "SELECT * FROM users WHERE last_login > DATE_SUB(NOW(), INTERVAL 1 MONTH)", nativeQuery = true)
    List<User> findRecentLogins();
}

 


3. Querydsl (추천)

코드로 쿼리를 작성하는 방식입니다. 프로젝트 설정이 조금 복잡할 수 있지만, 실무에서는 거의 필수적으로 사용된다. 조건에 따라 쿼리가 변하는 동적 쿼리 그리고 복잡한 Join 사용할때 사용하는 방식이다.

  • 장점: 컴파일 시점에 문법 오류 발견 가능, 동적 쿼리 작성이 매우 쉬움, 자동 완성 지원.
  • 방식: 보통 CustomRepository를 인터페이스로 만들고 이를 구현(Impl)하여 사용합니다.
// Querydsl을 이용한 동적 쿼리 예시 (요약)
public List<User> searchUsers(String name, Integer age) {
    return queryFactory
        .selectFrom(user)
        .where(
            nameEq(name),
            ageEq(age)
        )
        .fetch();
}
728x90
반응형
Comments