연관관계가 지연(Lazy)로 되어있을 경우에 만약 하위 엔티티에 접근할 경우 @Transcational로 묶여있지 않는 한 DB연결이 끊기며 No session 에러가 나게 될 것이다.
이런 경우 join하여 값을 가지고 올때 @EntityGraph를 사용할 수 있다.
이렇게 있을 경우에 일반적으로 상위 엔티티를 불러와 하위 엔티티에 접근할 경우 코드를 보자
PK가 2인 값을 불러와서 하위 엔티티를 접근할 경우
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:.....could not initialize proxy - no Session
이러한 에러가 나게된다. DB에 연결이 끊어진 상태에서 다시 값을 꺼내오려하니 당연히 에러가 난다. 이걸 해결하는 방법은 저 메소드를 @Transactional로 묶는 방법도 있고 여러가지가 있다. 간단히 @Transactional로 묶는 방법을 보자
@Transactional이 묶인 경우 해당 메소드 전체가 끝날때까지 DB 연결이 지속되어 다시 접근이 가능해서 에러가 나지 않는다. 그리고 연관관계상 지연(LAZY) 이므로 여기서는 쿼리가 join이 아닌 select 쿼리가 두번 일어난다.
그런데 join을 통해서 가져오고 싶을 경우는 어떻게 하는가?
@EntityGraph를 사용하면 된다.
상위엔티티(Board) Repository에 메소드를 선언한다.
@EntityGraph에는 attributePaths 속성 값을 이용하여 같이 로딩해야 하는 속성을 명시할 수 있다. 그러면 명시한 하위 엔티티 타입을 join으로 같이 불러온다.
테스트 코드
결과를 통해 일어난 쿼리를 보면
Transactional 방법과 다르게 left outer join을 통해 값을 불러오는 걸 볼 수 있다.
'Spring' 카테고리의 다른 글
Spring - 파일 올리기(이미지 저장하기 ) - RestController (1) | 2022.10.11 |
---|---|
JPA - N+1 (0) | 2022.09.19 |
JPA - Querydsl 정의(간단한 검색기능) (0) | 2022.09.03 |
JSP/Spring (Mybatis - Mariadb) Paging 구현 (2) | 2022.08.31 |
PRG(Post-Redirect-GET) 패턴 (0) | 2022.08.22 |