-
10/30 TIL | getReferenceById & findById 정리.📝 기록/매일의 기록 2022. 10. 30. 18:47
우선 getReferenceById에 대해서 말하려면, getOne과 getById도 등장해야 한다. 이 셋은 같은 메서드인데, getOne이 스프링 2.5 버전에 deprecated되면서 getById라는 메서드로 바뀌었고, 스프링 2.7 버전에 다시 deprecated되고 getReferenceById라고 이름이 바뀌었다. 공식 문서에서 똑같은 기능을 기술하고 있기 때문에 더 나은 네이밍을 위해 기능은 같으나 이름이 변경된 케이스라고 생각하면 된다.
그렇다면 어떤 경우에 getReferenceById를 사용하고, 어떤 경우에 findById를 사용해야 할까? 우선 getReferenceById는 찾으려는 대상이 없는 경우 내부에서 예외를 발생시킨다. 반면, findById는 찾으려는 대상이 없는 경우 예외가 따로 발생하거나 하지는 않는다. 그렇기 때문에 조회하고자 할 때 반드시 결과를 돌려받아야 하는 경우에는 getReferenceById를 사용하는 것이 적당하고, 그렇지 않아도 되는 경우에는 findById를 사용하는 것이 적당하겠다.
의미론적으로 생각해보면 비교적 명쾌해지는데 get은 "가지다"라는 의미를 뜻하고, find는 "찾다"라는 의미를 뜻한다. 하여 find를 하게 되면 저장소는 무언가를 "찾는" 반면, get을 하게 되면 저장소는 무언가를 "가져온다". 그렇기 때문에 "찾기"를 통해 결과를 찾지 못할 수도 있지만 "가져오기"는 항상 무언가를 반환해야 한다. 그렇기 때문에 getReferenceById는 예외가 발생하고, findById는 예외가 발생하지 않는다라고 맥락적으로 이해할 수 있다.
또한 findById는 요청하는 순간 쿼리가 처리되는 반면, getReferenceById는 EntityManager의 getReference 메서드를 호출하여 참조 값만 가져온 후, 조회된 entity를 사용하는 순간에 쿼리가 처리되는 lazy loading으로 DB를 조회해 값을 가져온다. 요청하는 시점에 DB를 조회하는 getReferenceById는 내부 값을 필요로 하지 않고, 다른 객체에 할당할 때 사용하면 좋다.
참고
JpaRepository.getOne/getById method name should indicate that it returns a reference · Issue #2232 · spring-projects/spring-da
JpaRepository methods getOne/getById methods are often used by accident by inexperienced developers instead of findById. These methods call EntityManager::getReference and return a reference. The m...
github.com
find vs. get – Thomas Uhrig
Three years ago I wrote a blog post with the provoking title “Don’t use Optionals for data repositories“. The post received a couple of critical comments and I had the feeling that I didn’t made my point clear. This week I stumbled over the same to
tuhrig.de
'📝 기록 > 매일의 기록' 카테고리의 다른 글
11/1 TIL | 대칭 키와 비대칭 키 암호화 방식 (0) 2022.11.01 10/31 TIL | HandlerInterceptor란? (0) 2022.10.31 10/29 TIL | 인증(Authentication)과 인가(Authorization) (0) 2022.10.29 10/27 TIL | 문서화는 나의 힘! Github Issue Template을 활용하여 문서 손쉽게 작성하기. (0) 2022.10.27 10/26 TIL | 컴퓨터는 잘못 없고.. 잘못은 내가! (feat. Java Bean) (0) 2022.10.26