T_era
Spring Data JPA 인터페이스 메서드 자동 실행 원리 본문
jpa를 연습해보기 위해 사용하다 왜 상속받은 인터페이스에서 새로운 메서드를 정의만하고 구현을 하지 않았는데 작동하는지 의문이 들어 찾아보았다.
public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByUserName(String userName);
}
위의 코드인데 나는 구현을 한적이 없다
Optional<Member> byUserName = memberRepository.findByUserName(userName);
하지만 이 코드를 실행하면 재대로 반영이 된다 이유가 뭘까?
JpaRepository 상속 인터페이스의 메서드 정의만으로 구현 없이 작동하는 이유는 Spring Data JPA의 Query Methods 기능에 기인한다. Spring Data JPA는 특정 명명 규칙을 준수하는 인터페이스 메서드 이름을 분석하여, 해당 기능을 수행하는 데이터베이스 쿼리를 자동 생성 및 실행한다.
작동 원리:
- 메서드 이름 분석: Spring Data JPA는 메서드 이름에서 find...By... 패턴을 식별한다.
- find: 데이터 조회 메서드임을 지시한다.
- ByUserName: 조회 조건으로 사용할 Entity 필드 이름(userName)을 명시한다. By 뒤에는 조회 조건 필드명이 위치하며, 첫 글자는 대문자로 시작해야 한다.
- (String userName): 메서드 매개변수는 쿼리 파라미터 바인딩 값을 전달한다. 매개변수 이름은 쿼리 생성에 직접적인 영향이 없으나, 타입(String)은 비교 값의 타입을 나타낸다.
- 쿼리 자동 생성: Spring Data JPA는 분석된 메서드 이름 정보를 기반으로 JPQL 쿼리를 자동 생성한다.여기서 :userName은 메서드 매개변수로 전달된 userName 값 바인딩을 위한 플레이스홀더이다.
SELECT m FROM Member m WHERE m.userName = :userName - DB 바인딩 및 실행: 애플리케이션에서 memberRepository.findByUserName("특정사용자이름")과 같이 메서드 호출 시, Spring Data JPA는 자동 생성된 쿼리에 실제 값("특정사용자이름")을 바인딩하여 데이터베이스에 실행한다.
- 결과 매핑: 데이터베이스 조회 결과는 Member Entity 객체로 매핑되어 Optional<Member> 형태로 반환된다. 조회 결과가 없을 경우 빈 Optional이 반환된다.
핵심:
- Entity 필드 매칭: 메서드 이름의 By 뒤 부분(UserName)은 조회 대상 Member Entity의 필드 이름(userName)과 정확히 일치해야 한다. 메서드 이름을 find로만 하거나, 실제 필드명과 상이한 이름(예: findByAge인데 Member Entity에 age 필드가 없는 경우)으로 지정 시 Spring Data JPA는 해당 메서드를 해석하여 쿼리 생성이 불가하다.
- 명명 규칙: Spring Data JPA는 findBy, getBy, countBy, existsBy, deleteBy 등의 다양한 접두사와 And, Or, Between, LessThan, GreaterThan, Like 등의 조건을 조합하여 복잡한 쿼리 자동 생성을 지원하는 강력한 명명 규칙을 제공한다. 개발자는 해당 규칙 숙지를 통해 데이터 접근 계층 개발 생산성을 향상시킬 수 있다.
'Programing > Spring' 카테고리의 다른 글
| 매번 인증 코드를 넣어야하는데 이를 하나로 해결해주는 ArgumentResolver를 사용해보자 (0) | 2025.05.22 |
|---|---|
| @Entity 엔티티에서 사용하는 어노테이션과 이유 (0) | 2025.05.20 |
| Spring Data JPA Query Methods 및 JPA Auditing 정리 (0) | 2025.05.16 |
| JPA vs Spring Data JPA (0) | 2025.05.16 |
| 연관관계 매핑 (0) | 2025.05.16 |