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가 메서드 이름을 파싱해서 쿼리를 만들어줍니다:
// author가 정확히 일치
List<Post> findByAuthor(String author);
// → WHERE author = ?
// title이 정확히 일치
List<Post> findByTitle(String title);
// → WHERE title = ?
findBy 뒤에 Entity의 필드명을 그대로 씁니다. 필드명의 첫 글자는 대문자로 씁니다. author → findByAuthor.
// 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 '%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이 가장 자주 쓰입니다. 제목이나 내용에 특정 키워드가 포함된 결과를 찾을 때 사용합니다.
List<Post> findByContentIsNull();
// → WHERE content IS NULL
List<Post> findByContentIsNotNull();
// → WHERE content IS NOT NULL
// 생성일 내림차순
List<Post> findByAuthorOrderByCreatedAtDesc(String author);
// → WHERE author = ? ORDER BY created_at DESC
// 생성일 오름차순
List<Post> findByAuthorOrderByCreatedAtAsc(String author);
// → WHERE author = ? ORDER BY created_at ASC