
JPA를 사용하다 보면 특정 엔티티를 조회할 때 findById와 getReferenceById 두 가지 메서드를 사용할 수 있습니다. 처음 보면 비슷해 보이지만, 동작 방식에서 큰 차이를 보이므로 이를 명확히 이해하고 적절한 상황에서 사용하는 것이 중요합니다.
findById(Long id)findById는 해당 ID에 해당하는 엔티티를 데이터베이스에서 즉시 조회하여 반환하는 메서드이다.
Optional로 감싸서 반환하므로, 존재 여부를 쉽게 확인 가능Optional<User> user = userRepository.findById(1L);
if (user.isPresent()) {
System.out.println(user.get().getName());
} else {
System.out.println("User not found");
}
getReferenceById(Long id)getReferenceById는 프록시 객체를 반환하는 메서드로, 실제 데이터베이스 조회는 필요할 때 수행됩니다. 즉, Lazy Loading(지연 로딩)을 사용합니다.
User user = userRepository.getReferenceById(1L);
System.out.println(user.getName()); // 이 시점에서 실제 조회 발생
findById vs getReferenceById 비교| 구분 | findById | getReferenceById |
|---|---|---|
| 데이터베이스 조회 시점 | 즉시 조회 | 사용 시점에서 조회 (Lazy) |
| 반환 타입 | Optional<T> | 실제 엔티티(프록시 객체) |
| 데이터가 없을 경우 | Optional.empty() 반환 | EntityNotFoundException 발생 |
| 주요 사용 목적 | 데이터가 즉시 필요할 때 | 참조만 필요하고 나중에 조회할 때 |
findById를 사용해야 할 때Optional을 활용하고 싶을 때getReferenceById를 사용해야 할 때findById는 즉시 조회하는 방식으로, 실제 데이터를 Optional<T>로 감싸서 반환한다getReferenceById는 프록시 객체를 반환하며, 실제 데이터가 필요할 때 조회가 발생한다.getReferenceById를 활용하면 성능을 최적화가 가능하다.