Spring Data JPA를 사용하여 객체의 @Id로 조회할 때 두 메서드 모두 사용 가능하다. 그 차이점은 무엇일까?
/**
* Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is
* implemented this is very likely to always return an instance and throw an
* {@link javax.persistence.EntityNotFoundException} on first access. Some of them will reject invalid identifiers
* immediately.
*
* @param id must not be {@literal null}.
* @return a reference to the entity with the given identifier.
* @see EntityManager#getReference(Class, Object) for details on when an exception is thrown.
*/
T getOne(ID id);
지연(Lazy)로딩으로 작동, 주어진 식별자를 가진 엔티티에 대한 참조를 반환하며 내부적으로 EntityManager.getReference() 메서드를 호출해 프록시 객체 반환
null체크는 의미 없으며 DB에 존재하지 않을 경우 EntityNotFoundException 을 발생
/**
* Retrieves an entity by its id.
*
* @param id must not be {@literal null}.
* @return the entity with the given id or {@literal Optional#empty()} if none found.
* @throws IllegalArgumentException if {@literal id} is {@literal null}.
*/
Optional<T> findById(ID id);
즉시(Eager)로딩으로 작동하여 호출 시 DB를 조회하고 실제 엔티티를 반환
메서드의 반환값이 Optional로 내부에 객체가 있는지 확인 후 get()을 이용해 반환된 객체를 꺼내 쓸 수 있음
사용예시)
@Transactional(readOnly = true)
public Board findBoardByNo(Long boardNo) {
return boardRepository.findById(boardNo).orElseThrow(() -> new NoSuchElementException());
}
[참고] 2021.03.11 - [java/jpa] - [JPA 기초] 프록시와 지연로딩
getOne | findById |
Id(필수값)로 객체 조회 | |
지연로딩 | 즉시로딩 |
프록시 객체 반환 | 데이터베이스 조회 후 객체 반환 |
EntityNotFoundException 예외 발생 | Optional로 Null 체크 가능 |
[SPRING SECURITY] 커스텀 클래스와 로그인 (0) | 2021.04.16 |
---|---|
[ERROR] JPAQueryFactory 의존성 문제 (0) | 2021.04.15 |
[ERROR] 순환참조 문제 (0) | 2021.04.14 |
[WEB] RESTful API 만들기 (0) | 2021.03.22 |
[JPA] 게시판 CRUD (0) | 2021.03.21 |
댓글 영역