본문 바로가기
개발

JPA 조회 메서드 비교와 활용 가이드

by 닉네임 입니다 2024. 11. 12.
728x90
반응형

JPA 조회 메서드 비교: findById(), getOne(), getReferenceById()

안녕하세요, 개발자 여러분! 오늘은 JPA에서 제공하는 중요한 조회 메서드인 findById(), getOne(), **getReferenceById()**에 대해 비교해 보겠습니다. 이 세 가지 메서드는 모두 데이터를 조회하기 위한 목적으로 사용되지만, 그 동작 방식에는 큰 차이가 있답니다. 이해를 돕기 위해 간단한 예제와 함께 설명하겠습니다.

JPA 주요 조회 메서드

JPA에서는 다음과 같은 주요 조회 메서드를 제공합니다:

  1. findById()
  2. getReferenceById()
  3. getOne() (현재 deprecated됨)

이들 중 일부 메서드를 사용해 본 사용자라면, 어딘가에서 성능이나 결과의 차이를 느끼셨을지도 모릅니다.

findById()

findById()는 Optional를 반환하며, 해당 ID로 엔티티를 조회합니다. 데이터가 없다면 Optional.empty()를 반환하므로, NoSuchElementException이 발생하지 않습니다. 호출 시점에 바로 데이터베이스에서 조회 쿼리가 실행이 됩니다.

@Test
void testFindById() {
    log.info("=== book.findById() start ===");
    Optional<Book> optionalBook = bookRepository.findById(1L);
    log.info("=== book.findById() end ===");
    Book book = optionalBook.orElseThrow();
    log.info("book 데이터: {}", book);
}

장점:

  • 존재하지 않는 데이터에 대한 처리가 용이합니다.
  • 즉시 데이터베이스 쿼리를 수행하여 결과를 반환합니다.

getReferenceById()

getReferenceById()는 해당 엔티티의 ID를 매개변수로 받아 프록시 객체를 반환합니다. 실제 데이터에 접근할 때 데이터베이스에 조회 쿼리가 실행되며, 만약 ID에 해당하는 데이터가 없으면 EntityNotFoundException을 발생시킵니다.

@Test
void testGetReferenceById() {
    log.info("=== book.getReferenceById() start ===");
    Book book = bookRepository.getReferenceById(1L);
    log.info("=== book.getReferenceById() end ===");
    log.info("book 데이터: {}", book);
}

장점:

  • Lazy Loading이 가능하여 데이터 접근 시점을 지연시킬 수 있습니다.
  • 성능이 중요할 때 유용할 수 있습니다.

getOne()

getOne() 메서드는 getReferenceById()와 비슷한 방식으로 동작하지만, 현재는 deprecated된 상태입니다. 기존의 getOne()과 같은 방식으로 사용할 수 있지만, getReferenceById()를 사용하는 것이 추천됩니다.

@Test
void testGetOne() {
    log.info("=== book.getOne() start ===");
    Book book = bookRepository.getOne(1L);
    log.info("=== book.getOne() end ===");
    log.info("book 데이터: {}", book);
}

장점:

  • 사용법이 간단하다.
  • Lazy Loading을 제공하지만, 현재 deprecated되어 사용을 피해야 합니다.

요약 및 비교

메서드 반환 타입 데이터 존재 유무 처리 쿼리 실행 시점
findById() Optional Optional로 처리, NoSuchElementException 없음 호출 시 즉시 실행
getReferenceById() T (프록시 객체) EntityNotFoundException 발생 접근 시 실행
getOne() T (프록시 객체) EntityNotFoundException 발생 접근 시 실행

마무리

이번 포스트에서는 JPA의 주요 조회 메서드인 findById(), getReferenceById(), **getOne()**에 대해 알아보았습니다. 각 메서드의 특징과 사용 용도를 잘 이해하신다면, 여러분의 데이터베이스 조회 작업이 훨씬 더 유용하고 효율적일 것입니다. 프로그래밍은 법칙과 원리를 이해하고, 이를 잘 활용하는 것이 중요합니다. 추가적인 질문이나 도움이 필요하시면 댓글로 남겨주세요! 다음 포스트에서 만나요!

728x90
반응형