1 minute read

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)