Spring Data JPA는
👉 findByDepartmentAndSalaryGreaterThan
이 메서드 이름을 분석해서,
👉 Employee 엔티티 클래스의 필드 이름과 자동 매핑합니다.
즉,
- department → Employee 엔티티 안의 department 필드
- salary → Employee 엔티티 안의 salary 필드
를 리플렉션(reflection) 으로 찾아냅니다.
🧩 작동 원리
JpaRepository<Employee, Long>
➡️ 여기서 Employee는 JPA가 관리하는 엔티티 클래스입니다.
예를 들어 아래와 같은 엔티티가 있다고 합시다 👇
Spring Data JPA는 Employee 엔티티를 보고
클래스 내 필드 이름(department, salary)을 인식합니다.
그리고 리포지토리의 메서드 이름을 파싱합니다:
👉 JPA는 내부적으로 이렇게 해석합니다:
🧠 메서드 이름 파싱 규칙
Spring Data JPA는 메서드 이름을 분석해서 SQL 조건으로 자동 변환합니다.
예를 들어 다음과 같은 규칙이 있습니다 👇
| findByName | WHERE name = ? | findByName(String name) |
| findByAgeGreaterThan | WHERE age > ? | findByAgeGreaterThan(int age) |
| findByEmailLike | WHERE email LIKE ? | findByEmailLike(String email) |
| findByNameAndAge | WHERE name = ? AND age = ? | findByNameAndAge(String n, int a) |
| findByDepartmentOrSalaryLessThan | WHERE department = ? OR salary < ? | findByDepartmentOrSalaryLessThan(String dept, int s) |
📌 즉,
- And, Or → 조건 연결
- GreaterThan, LessThan, Between, Like, In, IsNull 등 → 비교 연산자
- IgnoreCase, OrderBy 등도 가능
🧩 내부 동작 (리플렉션 기반)
Spring Data JPA는 런타임에 다음 순서로 동작합니다:
- EmployeeRepository 인터페이스를 스캔
- 메서드 이름 분석 (findByDepartmentAndSalaryGreaterThan)
- Employee 클래스의 필드 목록을 리플렉션으로 확인
- department, salary 필드를 찾음
- JPQL 생성:
-
SELECT e FROM Employee e WHERE e.department = ?1 AND e.salary > ?2
- Hibernate가 실제 SQL로 변환 후 DB에 전달
🧩 주의할 점
- 필드 이름과 메서드 이름은 정확히 일치해야 합니다.
findByDept라고 쓰면, Employee 클래스에 dept 필드가 없으면 오류 납니다. - 대소문자는 무시되지만 CamelCase는 구분됩니다.
findByDepartmentAndSalaryGreaterThan → OK
findBydepartmentAndSalarygreaterthan → 작동은 되지만 가독성 나쁨 - 필드가 다른 엔티티에 매핑된 경우 (예: @ManyToOne)
이런 식으로 “하위 필드 접근”도 가능합니다 👇→ 내부적으로 JOIN 수행 (e.department.name = ?) -
List<Employee> findByDepartment_Name(String deptName);
🧩 요약
| EmployeeRepository extends JpaRepository<Employee, Long> | Employee 엔티티를 대상으로 CRUD 제공 |
| findByDepartmentAndSalaryGreaterThan | 메서드 이름으로 조건 정의 |
| department, salary | Employee 엔티티의 필드명 기준 |
| 변환 SQL | SELECT * FROM employee WHERE department = ? AND salary > ? |
| 내부 동작 | 리플렉션 + 메서드명 파싱 + JPQL 생성 |
엔터티 예시
Employee 엔티티에서 두 개의 숫자(int 타입) 필드를 기준으로,
두 필드 모두 크거나 같은(≥) 조건을 걸어주는 Spring Data JPA 메서드 쿼리 이름 예시를 만들어드릴게요.
🧩 예시 엔티티
먼저 이런 엔티티가 있다고 가정합시다 👇
🧩 요구사항
age ≥ X AND salary ≥ Y 조건으로 데이터를 조회하고 싶다.
✅ 방법 1: 메서드 이름 쿼리로 직접 작성
Spring Data JPA의 메서드 네이밍 규칙을 이용하면 이렇게 작성할 수 있습니다 👇
👉 내부적으로 이런 JPQL이 자동 생성됩니다:
✅ 방법 2: @Query를 이용해 JPQL 명시적으로 작성
가독성을 더 높이고 싶다면 이렇게 명시적으로 작성할 수도 있습니다 👇
➡️ 결과는 동일합니다.
다만 이 방식은 복잡한 조인이나 계산식이 필요한 경우 유리합니다.
✅ 호출 예시
➡️ 내부적으로 실행되는 SQL:
🧩 확장 예시: 정렬이나 페이징까지 추가하려면
페이징이나 정렬이 필요한 경우, 다음과 같이 매개변수에 Pageable을 추가할 수 있습니다 👇
호출 예시:
🧠 요약
| 조건 | age >= ? AND salary >= ? |
| 메서드명 | findByAgeGreaterThanEqualAndSalaryGreaterThanEqual |
| 자동 JPQL | SELECT e FROM Employee e WHERE e.age >= :age AND e.salary >= :salary |
| 확장 기능 | 페이징(Pageable), 정렬(Sort) 가능 |
'Springboot' 카테고리의 다른 글
| Spring Data JPA의 @Query + DTO 생성자 방식 (0) | 2025.11.04 |
|---|---|
| Spring Boot 프로젝트 구조 전체(Entity + Repository + Service + Controller + REST 호출 예시) (0) | 2025.11.04 |
| JPA+ Hibernate 데이터 조회 방법 (0) | 2025.11.04 |
| EntityManager (0) | 2025.11.04 |