Spring Data JPA를 보면 QuestionRepository에는 findBySubject() 메서드를 직접 구현하지 않았는데도 정상적으로 동작한다.
public interface QuestionRepository extends JpaRepository<Question, Integer> {
Question findBySubject(String subject);
}
메서드를 선언만 했는데 어떻게 SQL이 실행되는 걸까?
구현하지 않아도 동작하는 이유
비밀은 Spring Data JPA의 Query Method 기능에 있다.
Spring Data JPA는 Repository 인터페이스의 메서드 이름을 분석하여 그에 맞는 SQL을 자동으로 생성한다.
Question findBySubject(String subject);
라는 메서드를 선언하면 내부적으로는 다음과 같은 SQL이 실행된다.
SELECT *
FROM question
WHERE subject = ?;
즉, 개발자가 SQL을 직접 작성하지 않아도 메서드 이름만으로 조회 쿼리가 자동 생성된다.
메서드 이름 규칙
기본 형태는 다음과 같다.
findBy + 엔티티의 필드명
예를 들어 Question 엔티티에 subject 필드가 있다면
Question findBySubject(String subject);
를 작성할 수 있다.
자주 사용하는 JPA 메서드 명명 규칙
| 항목 | 예제 | 설명 |
| AND | findBySubjectAndContent(String subject, String content) | 여러 컬럼을 AND 로 검색 |
| Or | findBySubjectOrContent(String subject, String content) | 여러 컬럼을 OR 로 검색 |
| Between | findByCreateDateBetween(LocalDateTime fromDate, LocalDateTime toDate) | 컬럼을 BETWEEN 으로 검색 |
| LessThan | findByIdLessThan(Integer id) | 비교해서 칼럼의 값 보다 작은 항목 검색 |
| GreaterThanEqual | findByIdGreaterThanEqual(Integer id) | 비교해서 칼럼의 값 보다 크거나 같은 항목 검색 |
| Like | findBySubjectLike(String subject) | LIKE 검색 |
| In | findBySubjectIn(String[] subjects) | 여러 값중에 하나인 항목 검색 |
| OrderBy | findBySubjectOrderByCreateDateAsc(String subject) | 검색 결과를 정렬하여 전달 |
단일 조건 조회
Question findBySubject(String subject);
SELECT * FROM question WHERE `subject` = ?
And 조건 조회
Question findBySubjectAndContent(String subject, String content);
SELECT * FROM question WHERE `subject` = ? AND content = ?
LIKE 검색
List<Question> findBySubjectLike(String subject);
SELECT *
FROM question
WHERE subject LIKE '%Spring%';
언제 사용하는 것이 좋을까?
Query Method는 간단한 조회 기능을 만들 때 매우 편리하다.
예를 들어
- 제목으로 조회
- 작성일 범위 조회
- 제목과 내용 검색
- 정렬 조회
등은 메서드 이름만으로 대부분 구현할 수 있다.
반대로 조건이 너무 많거나 복잡한 JOIN, 서브쿼리가 필요한 경우에는 @Query나 QueryDSL을 사용하는 것이 더 적합하다.
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] 왜 Exception을 던질까? (0) | 2026.08.07 |
|---|---|
| [Spring] @Transactional이 내부 호출에서 동작하지 않는 이유 (0) | 2026.08.07 |
| [Spring] Proxy란? @Transactional과 @Lazy가 동작하는 원리 (0) | 2026.08.06 |
| [Spring] Bean 심화 - @Bean, @Qualifier, @Order 정리 (0) | 2026.08.06 |
| Spring Boot에서 HTML 페이지 출력하기 (Thymeleaf 사용법) (0) | 2026.08.06 |
댓글