[JPA] Spring Data JPA에서 findById와 getReferenceById의 차이점
Updated:
👩🏻💻 entity를 검색할 때 쓰이는 findById와 getReferenceById의 차이점을 알아봅니다.
개요
Spring Data는 findById 및 getReferenceById를 포함하여 데이터 저장소에서 entity를 검색하기 위한 편리한 메서드를 제공합니다. 언뜻 보기에는 비슷해 보일 수 있지만 코드의 기능에 영향을 줄 수 있는 미묘한 차이가 있습니다.
findById 이해하기
findById 메소드는 CrudRepository 인터페이스에 정의되어 있습니다.
Optional<T> findById(ID id);
동작 및 반환 유형
findById 메소드는 고유 식별자(id)로 entity를 검색합니다. 엔터티가 데이터 저장소에 존재할 수도 있고 존재하지 않을 수도 있음을 나타내는 Optional wrapper를 반환합니다 . entity가 발견되면 Optional 안에 wrapping됩니다. 그렇지 않으면 Optional은 비어 있게 됩니다.
사용 사례
findById가 더 나은 선택인 사례는 다음과 같습니다.
첫 번째, entity가 데이터 저장소에 잠재적으로 없을 것으로 예상하고 두 시나리오(found or not found)를 정상적으로 처리하려는 경우입니다.
또한 Java8의 Optional API 와 함께 사용하여 조건부 작업을 수행하거나 entity를 찾을 수 없을 때 폴백을 실행하려는 경우 편리합니다.
getReferenceById 이해하기
JpaRepository 인터페이스는 getReferenceById의 메소드를 정의합니다.
T getReferenceById의(ID id);
동작 및 반환 유형
findById와 달리 getReferenceById 메소드는 entity를 Optional로 wrapping하는 대신 entity를 직접 리턴합니다. 엔터티가 데이터 저장소에 없으면 EntityNotFoundException이 발생합니다.
사용 사례
주어진 ID를 가진 엔티티가 데이터 저장소에 존재한다고 확신할 때 getReferenceById를 사용할 수 있습니다. 이 방법은 또한 보다 간결한 구문을 제공하며 추가적인 선택적 처리가 필요하지 않습니다.
결론
findById는 옵션을 반환하고 entity의 부재를 정상적으로 처리하지만 getReferenceById는 entity를 직접 반환하고 존재하지 않는 경우 예외를 발생시킵니다.
두 가지 방법 중 선택은 1)entity의 존재가 보장되는지 불확실한지 여부와 2)예외 처리 또는 조건부 연산이 필요한지 여부에 따라 다릅니다.
따라서 애플리케이션의 논리 및 요구 사항에 가장 잘 맞는 것을 선택해야합니다.
Reference
https://www.baeldung.com/spring-data-findbyid-vs-getbyid
https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#getReferenceById(ID)