getById()와 findById()는 주로 데이터베이스와 상호작용하는 객체(예: 리포지토리, DAO)에서 사용되는 메서드들이다. 이 두 메서드는 유사한 역할을 하지만 약간의 차이점이 있다.
// getById() 예제 (Spring Data JPA)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.getById(id);
}
}
// findById() 예제 (Spring Data JPA)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Optional<User> findUserById(Long id) {
return userRepository.findById(id);
}
}
get은 "받다, 얻다"라는 의미로, 객체를 무조건 반환해야 한다는 가정을 가진다.
find는 "찾다"라는 의미로, 객체를 찾을 수도 있고 없을 수도 있다는 가정을 가진다.
get과 find 단어의 의미를 먼저 보면 get은 무언가를 "얻다"이고 find는 "찾다"라는 의미이다. 비슷해 보이지만 두 단어의 의미는 확연하게 다르다.
find는 찾으려는 객체가 있을 수도 있고 없을 수 있지만 get은 항상 무언가를 반환해야 한다. 그렇기에 get은 데이터가 존재하지 않을 때 EntityNotFoundException를 던지는 것이다.
게시판에서 특정 ID의 게시글을 조회한다고 생각해보자. 그러나 유저는 게시물을 작성했을 수도 있고, 안 했을 수도 있다. 이 경우 getById()를 사용하면 해당 ID의 게시글이 없을 때 예외를 던져 사용자가 잘못된 ID를 입력했다고 알릴 것이다.
그러나 해당 유저는 게시물을 작성하지 않았을 뿐 실제 존재하는 유저이다. 이처럼 해당 게시글이 존재하지 않을 가능성을 고려해야 할 경우엔 findById()를 사용한다.
전자 상거래 시스템에서 관리자가 고객의 주문 상세 정보를 조회할 때, 해당 주문이 반드시 존재해야 한다. 만약 주문이 존재하지 않는다면 잘못된 주문 번호가 입력된 것이므로 예외를 던져야 한다.
이렇게 정상적인 상황이라면 무조건 값이 반환되야 할 경우에는 getById()를 사용하면 바로 예외를 던져주기 때문에 findById()에 비해 훨씬 효율적이다.
결론적으로 반드시 값이 존재하는 경우에는 getById()를, 있을 수도 있고 없을 수도 있는 상황에서는 findById()를 사용해야 한다.