문자열 관련

// 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);