SpringBoot/데이터베이스 연동

쿼리 메서드 & JPQL

DEVLIB 2025. 4. 14. 10:55
728x90

쿼리 메서드(Query Method)

정의

메서드 이름만으로 쿼리를 생성하는 방식
스프링 데이터 JPA가 메서드 명을 분석하여 SQL을 자동 생성합니다.

사용 예시

public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByName(String name);

    Member findByEmailAndAge(String email, int age);

    boolean existsByEmail(String email);

    long countByAgeGreaterThan(int age);

    void deleteByName(String name);
}
메서드 이름 동작 설명
findByName name으로 조회
findByEmailAndAge email과 age로 조회
existsByEmail 해당 이메일 존재 여부 확인
countByAgeGreaterThan 특정 나이 이상인 사람 수 카운트
deleteByName 이름 기준으로 삭제

 "By" 뒤에 오는 속성명은 Entity 필드 이름 기준입니다.


키워드 조합 예시

키워드 설명
And, Or 조건 연결
Between 범위 조건
LessThan, GreaterThan 비교
Like, Containing, StartsWith 문자열 검색
In, NotIn 컬렉션 포함 조건
IsNull, IsNotNull Null 검사
OrderBy 정렬
List<Member> findByAgeBetween(int start, int end);
List<Member> findByNameContaining(String keyword);
List<Member> findByAgeGreaterThanOrderByNameDesc(int age);

JPQL (Java Persistence Query Language)

정의

엔티티 객체 기반의 쿼리 언어. SQL과 유사하지만 테이블이 아닌 객체(Entity)를 대상으로 동작합니다.

기본 형태

@Query("SELECT m FROM Member m WHERE m.name = :name")
List<Member> findByNameUsingJPQL(@Param("name") String name);

Member는 엔티티 클래스 이름, m.name은 해당 필드
실제 테이블이 아닌 자바 클래스 명 기준


다양한 JPQL 예시

@Query("SELECT m FROM Member m WHERE m.age >= :age ORDER BY m.name DESC")
List<Member> findOlderThan(@Param("age") int age);

@Query("SELECT COUNT(m) FROM Member m")
long countAllMembers();

@Query("SELECT m FROM Member m WHERE m.email LIKE %:keyword%")
List<Member> searchByEmailKeyword(@Param("keyword") String keyword);

네이티브 SQL

복잡한 쿼리는 JPQL로 해결하기 어려울 수 있습니다. 이럴 땐 네이티브 SQL을 사용합니다.

@Query(value = "SELECT * FROM member WHERE name = :name", nativeQuery = true)
List<Member> nativeFindByName(@Param("name") String name);
 

nativeQuery = true로 명시해야 SQL 원문을 사용할 수 있어요.


언제 어떤 방식 써야 할까?

상황 추천 방식
간단한 조건 검색 쿼리 메서드
복합 조건 + 정렬 쿼리 메서드 or JPQL
조건이 동적이거나 복잡 JPQL or QueryDSL
DB 전용 문법 사용 필요 네이티브 SQL

정리 요약

방식 설명  장점 단점
쿼리 메서드 메서드 이름만으로 쿼리 생성 간단, 빠름 복잡한 조건 불리
JPQL 객체 기반 쿼리 작성 유연함 길어지고 복잡함
네이티브 SQL SQL 그대로 사용 강력함 DB 종속적
LIST