https://sundaland.tistory.com/407
[ ▶ Reserved Method Names ]
Reserved Method Names는 Spring Data JPA에서 특정 메서드 이름이 미리 정의된 규칙에 따라 작동한다는 것을 의미한다. 이 경우, 리포지토리 메서드는 일반적으로 엔티티의 속성과 이름을 기반으로 결합되지만, 일부 특별한 메서드는 그렇지 않다. 특히, CrudRepository와 같은 기본 리포지토리에서 상속받은 메서드는 identifier property (프라이머리 키)에 대해 특정 동작을 수행한다. 이러한 메서드는 reserved methods라고 불리며, 기본적으로 identifier property에 맞춰 동작한다.
[ ▷ 예시 도메인 클래스 ]
class User {
@Id Long pk; // (1) identifier 속성 (프라이머리 키)
Long id; // (2) id라는 이름의 속성이지만 identifier가 아님
// ...
}
- (1) pk: 이 속성은 @Id 어노테이션으로 마크되어 있으며, 이 클래스의 프라이머리 키로 설정된다.
- (2) id: 이 속성은 이름이 id이지만, identifier로 설정되지 않은 속성이다.
[ ▷ 예시 리포지토리 인터페이스 ]
interface UserRepository extends Repository<User, Long> {
Optional<User> findById(Long id); // (3)
Optional<User> findByPk(Long pk); // (4)
Optional<User> findUserById(Long id); // (5)
}
- (3) findById(Long id): 이 메서드는 Optional<User>를 반환하며, pk 속성을 대상으로 합니다. 이 메서드는 CrudRepository의 기본 메서드 중 하나인 findById에 의해 정의된 것입니다. 따라서 메서드 이름에 id가 포함되어 있다고 하더라도, 실제로는 identifier 속성을 대상으로 하며, 이는 reserved method로 간주됩니다.
- (4) findByPk(Long pk): 이 메서드는 pk 속성을 직접적으로 참조하는 derived query입니다. 여기서는 pk라는 이름을 사용하여 identifier 속성을 명확하게 지정하고 있습니다.
- (5) findUserById(Long id): 이 메서드는 id라는 이름을 가진 속성을 대상으로 하며, 주제와 술어를 명확히 구분합니다. 즉, find와 by 사이의 설명적 토큰을 사용함으로써 reserved method와의 충돌을 피하고 있습니다. 이 메서드는 id라는 속성에 대해 별도의 쿼리를 생성합니다.
[ ▷ 메서드 이름의 특별한 동작 ]
이러한 특별한 동작은 조회 메서드뿐만 아니라, exists나 delete 메서드와 같은 다른 메서드에도 적용된다. 이러한 메서드들은 다음과 같은 점을 주의해야 한다.
- Reserved Methods: findById, existsById, deleteById와 같은 메서드는 예약된 메서드이기 때문에, 이들 메서드는 identifier 속성과 결합하여 동작한다. 즉, 메서드 이름에서의 속성 참조가 실제 속성과 일치하지 않더라도 예약된 메서드가 우선시된다.
- 충돌 회피: findUserById와 같이 설명적인 메서드 이름을 사용하는 것은 reserved method와의 충돌을 피하는 한 가지 방법이다. 이런 식으로 메서드 이름을 구성하면, 리포지토리 인터페이스 내에서 혼동을 줄일 수 있다.
Spring Data JPA에서의 Reserved Method Names 개념은 메서드 이름에 따라 쿼리가 어떻게 생성되는지를 이해하는 데 매우 중요하다. 특히, identifier 속성에 대한 예약된 메서드는 일반적인 derived query와 다르게 작동하므로, 리포지토리 메서드를 정의할 때 이 점을 반드시 고려해야 한다. 이를 통해 코드의 명확성과 예측 가능성을 높일 수 있다.
'Spring Boot > Spring Data JPA' 카테고리의 다른 글
Repository Methods Returning Collections or Iterables (0) | 2024.10.24 |
---|---|
Property Expressions (0) | 2024.10.24 |
Query Creation (0) | 2024.10.22 |
Query Lookup Strategies (0) | 2024.10.22 |
Defining Query Methods (0) | 2024.10.22 |