티스토리 뷰

반응형

캡스톤 프로젝트 도중

lazy 지연 로딩에 대해 학습하다

다음과 같은 에러를 발견했다.

 

어떤 에러였으며 어떻게 해결했는지 같이 확인해보자.

 


 

data에 연관관계 설정 시

기존에는 다음과 같이 즉시로딩(Eager loading)으로

연관관계를 지정했다.

 

 

기존 연관관계 설정

 

우선 즉시로딩의 장단점은

장점 : 한 번에 연관관계가 있는 모든 엔티티를 가져온다.

단점 : 여러 연관관계를 맺고 있거나 연관관계가 복잡할수록 조인으로 인한 성능 저하를 피할 수 없다.

 

JPA에서 연관관계의 데이터를 어떻게 가져올 것인가

fetch(패치)라고 하는데

연관관계의 어노테이션의 속성으로 'fetch'모드를 정할 수 있다.

 

지연로딩 설정은 다음과 같이 할 수 있다.

lazy loading 설정

 

결국 lazy loading 설정을 마치고

findById를 통해 read 기능을 수행하는 test case를 작성하고

실행시켰는데 다음과 같은 에러가 발생했다.

 

lazy loading 설정 후 발생한 에러

 

어떻게 해결할까? 🤔

 

이 메세지는 데이터베이스와 추가적인 연결이 필요하다는 의미이다.

우선 필자사 실행한 test case의 메서드를 한 번 보자.

 

실행한 test case 메서드

 

지연 로딩 방식으로 로딩하기 때문에 Consulting 테이블만을 가져와서

System.out.println으로 조회하는 것은 문제되지 않는다.

 

문제는 consulting.getWriter()에서 발생한다.

코드를 보면 알겠지만 consulting 테이블에서

Member 테이블과 다대일 연관관계를 맺는다.

 

board.getWriter()는 member 테이블을 로딩해야 하는데

이미 데이터베이스와의 연결은 끝난 상태이기 때문에 에러가 발생한다.

 


 

'no Session' 메세지 발생 이유 🤔

이 문제를 해결하기 위해서는 다시 한번 데이터베이스와 연결이 필요한데

@Transactional이 바로 이러한 처리에 도움을 준다!

 

따라서 메서드 선언부에 @Transactional을 추가한다.

 

@Transactional해당 메서드를 하나의 '트랜잭션'으로 처리하라는 의미이다.

트랜잭션으로 처리하면 속성에 따라 다르게 동작하지만,

기본적으로는 필요할 때 다시 데이터베이스와 연결이 생성된다.

 

에러가 발생했던 test case 또한

다시 실행하면 문제 없이 실행되는 것을 확인할 수 있다.

 

제대로 동작하는 test case

 


오늘도 하나의 에러를 해결하며

많은 것을 배웠다.

그럼 오늘도 열심히 공부하자. 🔥

반응형