1. 쿼리 메서드란

Spring Data JPA는 메서드 이름만으로 SQL을 자동 생성합니다. Repository 인터페이스에 메서드 이름을 규칙에 맞게 선언하면, 구현 없이 바로 동작합니다.

public interface PostRepository extends JpaRepository<Post, Long> {

    // 메서드 이름 → SQL 자동 생성
    List<Post> findByAuthor(String author);
    // → SELECT * FROM post WHERE author = ?
}

구현 코드가 없는데 어떻게 동작할까?→ Spring Data JPA가 메서드 이름을 파싱해서 쿼리를 만들어줍니다:


2. 쿼리 메서드 기본 문법

기본 조회 (find...By)

// author가 정확히 일치
List<Post> findByAuthor(String author);
// → WHERE author = ?

// title이 정확히 일치
List<Post> findByTitle(String title);
// → WHERE title = ?

findBy 뒤에 Entity의 필드명을 그대로 씁니다. 필드명의 첫 글자는 대문자로 씁니다. authorfindByAuthor.

여러 조건 조합 (And, Or)

// author AND title
List<Post> findByAuthorAndTitle(String author, String title);
// → WHERE author = ? AND title = ?

// author OR title
List<Post> findByAuthorOrTitle(String author, String title);
// → WHERE author = ? OR title = ?

비교 연산

// 날짜 이후
List<Post> findByCreatedAtAfter(LocalDateTime date);
// → WHERE created_at > ?

// 날짜 이전
List<Post> findByCreatedAtBefore(LocalDateTime date);
// → WHERE created_at < ?

// 날짜 범위
List<Post> findByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
// → WHERE created_at BETWEEN ? AND ?

문자열 검색 (Like, Containing)

// LIKE '%keyword%' (가장 많이 사용)
List<Post> findByTitleContaining(String keyword);
// → WHERE title LIKE '%keyword%'

// LIKE 'keyword%' (시작)
List<Post> findByTitleStartingWith(String prefix);
// → WHERE title LIKE 'keyword%'

// LIKE '%keyword' (끝)
List<Post> findByTitleEndingWith(String suffix);
// → WHERE title LIKE '%keyword'

Containing이 가장 자주 쓰입니다. 제목이나 내용에 특정 키워드가 포함된 결과를 찾을 때 사용합니다.

Null 체크

List<Post> findByContentIsNull();
// → WHERE content IS NULL

List<Post> findByContentIsNotNull();
// → WHERE content IS NOT NULL

정렬 (OrderBy)

// 생성일 내림차순
List<Post> findByAuthorOrderByCreatedAtDesc(String author);
// → WHERE author = ? ORDER BY created_at DESC

// 생성일 오름차순
List<Post> findByAuthorOrderByCreatedAtAsc(String author);
// → WHERE author = ? ORDER BY created_at ASC