220905 TIL getById() vs findById()

금요일 코딩 인터뷰 시간에 받았던 질문 중 제대로 대답하지 못했던 질문인 findById와 getById의 차이점을 알아봤다.

 

getById

우선 getById()는 Spring Data JPA 2.7.2부터 Deprecated 되고 getReferenceById()로 변경이 되었다. 

  -  getById() 이전에 getOne()이었다는 사실이..

 

intelliJ에서도 getById을 사용하려고 하면 getReferenceById를 사용하라고 하는 걸 볼 수 있다.

 

getReferenceById에 대한 설명을 살펴보자

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#getById-ID-

 

뭐 영어로 샬라샬라 하는데 부족한 영어실력으로 핵심만 간단하게 해석해보자면 

"매개변수로 전달된 ID에 해당하는 entity를 리턴하고 없을 경우 예외를 발생시킨다."

id가 null일 수는 없으며 entity가 없을 경우 EntityNotFoundException예외를 던진다.

주어진 id를 가진 entity를 참조한 값을 반환하는 것 같다.

 

이 정도로 이해하면 될 것 같다.

 

트레이너님이 말씀하신 네이밍이 더 적절하게 getById에서 getReferenceById로 바뀐 이유가 참조한 값을 반환한다는 의미 때문인것같다.

 

findById

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html?is-external=true#findById-ID-

 

finById도 id는 null이면 안된다.


주어진 id로 entity를 리턴하는데 getReferenceById와 다르게 못 찾았을때 예외를 발생시키지 않는다.

findById는 못 찾았을 때(null)를 대비해서 Optional <T>를 이용해서 못 찾았을 때 리턴할 값을 설정해 줄 수 있다.

getReferenceById와 다르게 못 찾았다고 해서 예외를 발생시키지 않는다.

 

getById() vs findById()

이번에는 getById와 findById의 차이를 알아보자

 

그전에 get과 find 단어의 의미를 먼저 보면 get은 무언가를 "얻다"이고 find는 "찾다"라는 의미이다.

말장난 같지만 "얻다""찾다"에서 단어 의미의 차이가 있기 때문에  getById와 findById의 차이가 존재한다고 생각한다.

 

find는 찾으려는 객체가 있을 수도 있고 없을 수 있지만 get은 "얻다"라는 의미이기 때문에 항상 무언가를 반환해야 한다.

get으로 반환해야 할 게 없을 때 예외(EntityNotFoundException)가 발생한다. (null을 return 할 수 없다.)

find는 아무것도 못 찾았을 때를 예상해서 Optional로 return 값을 선택하게 할 수 있다. 

 

 

반드시 있어야 하는 데이터를 찾아야 할 때는 getreferenceById()를 사용하고, 있을 수도 있고 없을 수도 있는 데이터를 찾으려고 할 때는 findById()를 사용하는 것 같다.