Springboot

JPA 메소드명 맵핑 방식

devfinger 2025. 11. 4. 13:37

Spring Data JPA는
👉 findByDepartmentAndSalaryGreaterThan
이 메서드 이름을 분석해서,
👉 Employee 엔티티 클래스의 필드 이름과 자동 매핑합니다.

즉,

  • department → Employee 엔티티 안의 department 필드
  • salary → Employee 엔티티 안의 salary 필드

리플렉션(reflection) 으로 찾아냅니다.


🧩 작동 원리

JpaRepository<Employee, Long>
➡️ 여기서 Employee는 JPA가 관리하는 엔티티 클래스입니다.

예를 들어 아래와 같은 엔티티가 있다고 합시다 👇

 
@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String department; private int salary; private String name; // getter/setter ... }

Spring Data JPA는 Employee 엔티티를 보고
클래스 내 필드 이름(department, salary)을 인식합니다.

그리고 리포지토리의 메서드 이름을 파싱합니다:

 
findByDepartmentAndSalaryGreaterThan

👉 JPA는 내부적으로 이렇게 해석합니다:

 
SELECT * FROM employee WHERE department = ? AND salary > ?

🧠 메서드 이름 파싱 규칙

Spring Data JPA는 메서드 이름을 분석해서 SQL 조건으로 자동 변환합니다.

예를 들어 다음과 같은 규칙이 있습니다 👇

메서드 이름 패턴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는 런타임에 다음 순서로 동작합니다:

  1. EmployeeRepository 인터페이스를 스캔
  2. 메서드 이름 분석 (findByDepartmentAndSalaryGreaterThan)
  3. Employee 클래스의 필드 목록을 리플렉션으로 확인
  4. department, salary 필드를 찾음
  5. JPQL 생성:
  6.  
    SELECT e FROM Employee e WHERE e.department = ?1 AND e.salary > ?2
  7. Hibernate가 실제 SQL로 변환 후 DB에 전달

🧩 주의할 점

  1. 필드 이름과 메서드 이름은 정확히 일치해야 합니다.
    findByDept라고 쓰면, Employee 클래스에 dept 필드가 없으면 오류 납니다.
  2. 대소문자는 무시되지만 CamelCase는 구분됩니다.
    findByDepartmentAndSalaryGreaterThan → OK
    findBydepartmentAndSalarygreaterthan → 작동은 되지만 가독성 나쁨
  3. 필드가 다른 엔티티에 매핑된 경우 (예: @ManyToOne)
    이런 식으로 “하위 필드 접근”도 가능합니다 👇→ 내부적으로 JOIN 수행 (e.department.name = ?)
  4.  
    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 메서드 쿼리 이름 예시를 만들어드릴게요.


🧩 예시 엔티티

먼저 이런 엔티티가 있다고 가정합시다 👇

 
@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private int age; private int salary; // getters/setters ... }

🧩 요구사항

age ≥ X AND salary ≥ Y 조건으로 데이터를 조회하고 싶다.


✅ 방법 1: 메서드 이름 쿼리로 직접 작성

Spring Data JPA의 메서드 네이밍 규칙을 이용하면 이렇게 작성할 수 있습니다 👇

 
public interface EmployeeRepository extends JpaRepository<Employee, Long> { List<Employee> findByAgeGreaterThanEqualAndSalaryGreaterThanEqual(int age, int salary); }

👉 내부적으로 이런 JPQL이 자동 생성됩니다:

 
SELECT e FROM Employee e WHERE e.age >= :age AND e.salary >= :salary

✅ 방법 2: @Query를 이용해 JPQL 명시적으로 작성

가독성을 더 높이고 싶다면 이렇게 명시적으로 작성할 수도 있습니다 👇

 
public interface EmployeeRepository extends JpaRepository<Employee, Long> { @Query("SELECT e FROM Employee e WHERE e.age >= :age AND e.salary >= :salary") List<Employee> findEmployeesByAgeAndSalary(@Param("age") int age, @Param("salary") int salary); }

➡️ 결과는 동일합니다.
다만 이 방식은 복잡한 조인이나 계산식이 필요한 경우 유리합니다.


✅ 호출 예시

 
List<Employee> result = employeeRepository.findByAgeGreaterThanEqualAndSalaryGreaterThanEqual(30, 5000);

➡️ 내부적으로 실행되는 SQL:

 
SELECT * FROM employee WHERE age >= 30 AND salary >= 5000;

🧩 확장 예시: 정렬이나 페이징까지 추가하려면

페이징이나 정렬이 필요한 경우, 다음과 같이 매개변수에 Pageable을 추가할 수 있습니다 👇

 
Page<Employee> findByAgeGreaterThanEqualAndSalaryGreaterThanEqual( int age, int salary, Pageable pageable);

호출 예시:

 
Page<Employee> page = employeeRepository .findByAgeGreaterThanEqualAndSalaryGreaterThanEqual(30, 5000, PageRequest.of(0, 10, Sort.by("salary").descending()));

🧠 요약

항목설명
조건 age >= ? AND salary >= ?
메서드명 findByAgeGreaterThanEqualAndSalaryGreaterThanEqual
자동 JPQL SELECT e FROM Employee e WHERE e.age >= :age AND e.salary >= :salary
확장 기능 페이징(Pageable), 정렬(Sort) 가능