문자열 관련
// LIKE '%keyword%'
Page<Post> findByTitleContaining(String keyword, Pageable pageable);
// LIKE 'keyword%'
List<Post> findByTitleStartingWith(String prefix);
// LIKE '%keyword'
List<Post> findByTitleEndingWith(String suffix);
// LIKE (대소문자 무시)
List<Post> findByTitleContainingIgnoreCase(String keyword);
비교 연산
// =
List<Post> findByViews(Integer views);
List<Post> findByViewsEquals(Integer views); // 위와 동일
// !=
List<Post> findByViewsNot(Integer views);
// >
List<Post> findByViewsGreaterThan(Integer views);
// >=
List<Post> findByViewsGreaterThanEqual(Integer views);
//
List<Post> findByViewsLessThan(Integer views);
// <=
List<Post> findByViewsLessThanEqual(Integer views);
// BETWEEN
List<Post> findByViewsBetween(Integer start, Integer end);
컬렉션/null 관련
// IN
List<Post> findByStatusIn(List<PostStatus> statuses);
// NOT IN
List<Post> findByStatusNotIn(List<PostStatus> statuses);
// IS NULL
List<Post> findByDeletedAtIsNull();
// IS NOT NULL
List<Post> findByDeletedAtIsNotNull();
// 빈 컬렉션 체크
List<Post> findByCommentsIsEmpty();
List<Post> findByCommentsIsNotEmpty();
논리 연산
// AND
List<Post> findByTitleContainingAndViewsGreaterThan(String title, Integer views);
// OR
List<Post> findByTitleContainingOrContentContaining(String title, String content);
// NOT
List<Post> findByPublishedTrue();
List<Post> findByPublishedFalse();
정렬 관련
// ORDER BY
List<Post> findByAuthorOrderByCreatedAtDesc(String author);
List<Post> findAllByOrderByViewsDescCreatedAtAsc();
// Top/First (LIMIT)
List<Post> findTop10ByOrderByViewsDesc();
List<Post> findFirst5ByAuthorOrderByCreatedAtDesc(String author);