[Spring Boot JPA] getById() vs findById()

김찬미·2024년 6월 13일
0

Spring Boot

목록 보기
5/7
post-thumbnail

개념

getById() findById()는 주로 데이터베이스와 상호작용하는 객체(예: 리포지토리, DAO)에서 사용되는 메서드들이다. 이 두 메서드는 유사한 역할을 하지만 약간의 차이점이 있다.

getById()

  • 설명: 주어진 ID로 데이터를 조회한다.
  • 특징: 데이터를 찾을 수 없으면 EntityNotFoundException을 던진다.
  • 사용 사례: 데이터가 반드시 존재해야 하며, 존재하지 않을 경우 예외 처리를 통해 명확히 문제를 인지하고자 할 때 사용한다.

findById()

  • 설명: 주어진 ID로 데이터를 조회한다.
  • 특징: 데이터를 찾을 수 없는 경우 null을 반환하거나 Optional과 같은 컨테이너를 반환하여 데이터가 없음을 나타낸다.
  • 사용 사례: 데이터가 존재하지 않을 가능성을 고려하여, 예외를 던지지 않고 이를 호출한 측에서 처리할 수 있도록 할 때 사용한다.
  • 반환값: Java의 경우 Optional를, 다른 언어에서는 null 또는 유사한 값을 반환한다.

비교

1) 예외 처리:

  • getById(): 데이터가 없으면 예외를 던진다.
  • findById(): 데이터가 없으면 null 또는 Optional.empty()를 반환한다.

2) 사용 목적:

  • getById(): 데이터가 반드시 있어야 하며, 그렇지 않을 경우 이를 강하게 인지시키고자 할 때 사용합니다.
  • findById(): 데이터가 없을 가능성이 있고, 이를 호출한 측에서 유연하게 처리하고자 할 때 사용합니다.

3) 로딩 방식:

  • getById():
    • 즉시 로딩 방식으로 데이터를 가져온다.
    • 엔티티가 조회될 때 연관된 데이터까지 모두 한 번에 로드한다.
  • findById():
    • 지연 로딩 방식으로 데이터를 가져온다.
    • 엔티티가 조회될 때 연관된 데이터는 필요할 때 로드한다.

4) 코드 예제:

// 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은 "받다, 얻다"라는 의미로, 객체를 무조건 반환해야 한다는 가정을 가진다.

    • null을 반환할 수 없다.
  • find는 "찾다"라는 의미로, 객체를 찾을 수도 있고 없을 수도 있다는 가정을 가진다.

    • Optional로 반환하여 선택권을 제공한다.

get과 find 단어의 의미를 먼저 보면 get은 무언가를 "얻다"이고 find는 "찾다"라는 의미이다. 비슷해 보이지만 두 단어의 의미는 확연하게 다르다.

find는 찾으려는 객체가 있을 수도 있고 없을 수 있지만 get은 항상 무언가를 반환해야 한다. 그렇기에 get은 데이터가 존재하지 않을 때 EntityNotFoundException를 던지는 것이다.

반환받는 데이터가 반드시 존재하는가?

예시 1: 게시글 조회

게시판에서 특정 ID의 게시글을 조회한다고 생각해보자. 그러나 유저는 게시물을 작성했을 수도 있고, 안 했을 수도 있다. 이 경우 getById()를 사용하면 해당 ID의 게시글이 없을 때 예외를 던져 사용자가 잘못된 ID를 입력했다고 알릴 것이다.

그러나 해당 유저는 게시물을 작성하지 않았을 뿐 실제 존재하는 유저이다. 이처럼 해당 게시글이 존재하지 않을 가능성을 고려해야 할 경우엔 findById()를 사용한다.

예시 2: 주문 상세 조회

전자 상거래 시스템에서 관리자가 고객의 주문 상세 정보를 조회할 때, 해당 주문이 반드시 존재해야 한다. 만약 주문이 존재하지 않는다면 잘못된 주문 번호가 입력된 것이므로 예외를 던져야 한다.

이렇게 정상적인 상황이라면 무조건 값이 반환되야 할 경우에는 getById()를 사용하면 바로 예외를 던져주기 때문에 findById()에 비해 훨씬 효율적이다.


결론적으로 반드시 값이 존재하는 경우에는 getById()를, 있을 수도 있고 없을 수도 있는 상황에서는 findById()를 사용해야 한다.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보