Reserved Method Names

2024. 10. 19. 20:02Spring Boot/Spring Data JPA

Reserved Method Names는 Spring Data JPA에서 특정 메서드 이름이 미리 정의된 규칙에 따라 작동한다는 것을 의미합니다. 이 경우, 리포지토리 메서드는 일반적으로 엔티티의 속성과 이름을 기반으로 결합되지만, 일부 특별한 메서드는 그렇지 않습니다. 특히, CrudRepository와 같은 기본 리포지토리에서 상속받은 메서드는 identifier property (예: 프라이머리 키)에 대해 특정 동작을 수행합니다. 이러한 메서드는 reserved methods라고 불리며, 기본적으로 identifier property에 맞춰 동작합니다.

아래 예를 통해 이 개념을 자세히 설명하겠습니다.

예시 도메인 클래스

다음은 User라는 도메인 클래스입니다:

class User {
  @Id Long pk; // (1) identifier 속성 (프라이머리 키)

  Long id;     // (2) id라는 이름의 속성이지만 identifier가 아님

  // ...
}

속성 설명

  1. pk: 이 속성은 @Id 어노테이션으로 마크되어 있으며, 이 클래스의 프라이머리 키로 설정됩니다.
  2. id: 이 속성은 이름이 id이지만, identifier로 설정되지 않은 속성입니다.

예시 리포지토리 인터페이스

다음은 UserRepository라는 리포지토리 인터페이스입니다:

interface UserRepository extends Repository<User, Long> {

  Optional<User> findById(Long id);  // (3)

  Optional<User> findByPk(Long pk);   // (4)

  Optional<User> findUserById(Long id); // (5)
}

메서드 설명

  1. findById(Long id):
    • 이 메서드는 Optional<User>를 반환하며, pk 속성을 대상으로 합니다. 이 메서드는 CrudRepository의 기본 메서드 중 하나인 findById에 의해 정의된 것입니다. 따라서 메서드 이름에 id가 포함되어 있다고 하더라도, 실제로는 identifier 속성을 대상으로 하며, 이는 reserved method로 간주됩니다.
  2. findByPk(Long pk):
    • 이 메서드는 pk 속성을 직접적으로 참조하는 derived query입니다. 여기서는 pk라는 이름을 사용하여 identifier 속성을 명확하게 지정하고 있습니다.
  3. findUserById(Long id):
    • 이 메서드는 id라는 이름을 가진 속성을 대상으로 하며, 주제와 술어를 명확히 구분합니다. 즉, findby 사이의 설명적 토큰을 사용함으로써 reserved method와의 충돌을 피하고 있습니다. 이 메서드는 id라는 속성에 대해 별도의 쿼리를 생성합니다.

메서드 이름의 특별한 동작

이러한 특별한 동작은 조회 메서드뿐만 아니라, existsdelete 메서드와 같은 다른 메서드에도 적용됩니다. 이러한 메서드들은 다음과 같은 점을 주의해야 합니다:

  • 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.19
Property Expressions  (0) 2024.10.19
Query Creation  (0) 2024.10.19
Query Lookup Strategies  (0) 2024.10.19
Defining Query Methods  (0) 2024.10.19