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