JPA 조회 메서드 비교: findById(), getOne(), getReferenceById()
안녕하세요, 개발자 여러분! 오늘은 JPA에서 제공하는 중요한 조회 메서드인 findById(), getOne(), **getReferenceById()**에 대해 비교해 보겠습니다. 이 세 가지 메서드는 모두 데이터를 조회하기 위한 목적으로 사용되지만, 그 동작 방식에는 큰 차이가 있답니다. 이해를 돕기 위해 간단한 예제와 함께 설명하겠습니다.
JPA 주요 조회 메서드
JPA에서는 다음과 같은 주요 조회 메서드를 제공합니다:
- findById()
- getReferenceById()
- 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()**에 대해 알아보았습니다. 각 메서드의 특징과 사용 용도를 잘 이해하신다면, 여러분의 데이터베이스 조회 작업이 훨씬 더 유용하고 효율적일 것입니다. 프로그래밍은 법칙과 원리를 이해하고, 이를 잘 활용하는 것이 중요합니다. 추가적인 질문이나 도움이 필요하시면 댓글로 남겨주세요! 다음 포스트에서 만나요!
'개발' 카테고리의 다른 글
파이썬으로 간편한 개인 쇼핑 목록 관리 애플리케이션 만들기 (3) | 2024.11.12 |
---|---|
데이터베이스 인덱스로 성능을 극대화하는 방법 (7) | 2024.11.12 |
웹 애니메이션의 자연스러움을 높이는 이징 함수 활용하기 (2) | 2024.11.12 |
JavaScript로 외부 JS 파일을 동적으로 로딩하는 방법과 최적화 기법 안내 (1) | 2024.11.12 |
Trino로 빅데이터 분석의 미래를 열어가자 (0) | 2024.11.12 |