
안녕하세요. 오늘은
스프링 부트의 필터링 & 검색기능의 종류에 알아볼게요.
1. 쿼리 메서드(Query Method)
Spring Data JPA가 메서드명을 파싱 하여 JPQL을 자동생성하는데
즉 메서드 이름만으로 자동으로 쿼리 생성으로
가장 간단하고 직관적인 방식이에요.
대신 복잡한 조건에는 권장하지 않아요.
List<User> findByUsername(String username);
List<User> findByAgeGreaterThan(int age);
List<User> findByUsernameContaining(String keyword);
List<User> findByUsernameAndStatus(String username, String status);
2. JPQL(Java Persistence Query Language)
그룹핑/집계/조인/서브쿼리 등 쿼리 메서드로 표현이 어려운 경우 명시적으로 JPQL을 사용으로
SQL과 유사하지만 엔티티 기준으로 작성을 해서 DB에 독립적인 친구예요.
@Query("SELECT u FROM User u WHERE u.age > :age AND u.status = :status")
List<User> findActiveUsers(@Param("age") int age, @Param("status") String status);
@Query 어노테이션을 사용하고,
JPQL은 SQL만큼 유연하지 않고, 복잡한 동적 쿼리는 어려운 단점이 존재해요.
3. Native SQL
DB 벤더 특화 기능으로 극한 성능이 필요한 경우에 사용해요.
복잡한 통계/랭킹/리포트네 SQL 가독성이 JPQL보다 뛰어난 특징을 가지고,
진짜 SQL을 그대로 사용하는 방식이기 때문에 DB를 기준으로 작성해요.
@Query(value = "SELECT * FROM users WHERE username LIKE %:keyword%", nativeQuery = true)
List<User> searchByUsernameNative(@Param("keyword") String keyword);
@Query(nativeQuery = true)로 작성
엔티티, 맵핑 등 JPA의 이점을 일부 포기해야 하고,
유지보수성이 어려워질 수 있다는 단점이 있어요.
제가 배운 건 여기까지지만
추가적인 기능이 있을까 하고 찾아보니
더 많았어요!
그래서 현재 내용들과 추가적인 내용들은 간단하게 표로 정리했어요.
| 단순 필터링 | Query Method |
| 복잡한 정적 쿼리 | @Query |
| 동적 조건 검색 | Querydsl, Specification |
| 타입 안전한 복잡한 쿼리 | Querydsl |
| 표준 API 활용 | Criteria API |
| REST API 기반 자동 검색 | Spring Data REST |
| 고성능 텍스트 검색 | Elasticsearch |

여기까지 스프링부터의 필터링 & 검색기능에 알아봤는데요.
스프링부트를 알아가면 갈수록 힘들고 어렵지만
내 것으로 만들고 코드를 만져볼 때 흥미롭고 즐거웠답니다.
여러분들은 어떤가요?
'Backend > Java' 카테고리의 다른 글
| Spring Security (2) | 2025.08.29 |
|---|---|
| Java - List vs Set (0) | 2025.08.25 |
| Spring Boot - Validation (0) | 2025.08.20 |
| Spring Boot (1) | 2025.08.17 |
| Java - JDBC (3) | 2025.08.13 |