728x90
어제 아래 발생하고 해결한 오류에 대해 작성해보려고 합니다.
오류가 발생한 코드는
이렇게 Board의 id를 받아오는 부분에서
Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.
이라는 오류가 발생하였습니다!
오류를 해석해보니 Lazy로딩 방식으로 로드된 엔티티가 해당 세션 밖에서 접근될 때 발생하는 문제라고 합니다.
무슨 의미고 왜 발생할까요?
저희는 지금 User에서 UserBoardMatches의 리스트를 들고 오려고 하고 있습니다.
그럼 User을 한 번 확인해 보시죠
User에서 userBoardMatchesList를 보면 @OneToMany로 관계가 설정되어 있네요!
그럼 FetchType의 default값이 LAZY겠죠??
이해가 안되시는 분은
https://changbroblog.tistory.com/106
JPA에서 Lazy Loading 과 Eager Loading
오늘은 Lazy Loading과 Eager Loading에 대해서 알아보자.영어 그대로 지연 로딩과, 즉시 로딩이다.Lazy Loading(지연 로딩)은 참조 객체들의 데이터들은 무시하고 해당 엔티티의 데이터만 가져오는 방식.
changbroblog.tistory.com
이 글 한 번 읽고 오시면 이해가 되실 것 같아요!
결론은
이 코드에서 오류가 났던 이유는 User에서 UserBoardMatches 필드는 LAZY 타입으로 정의되어 있는데
boardIds에서 UserBoardMatches 필드를 사용하고 있기 때문입니다!
더 자세하게 설명드리면 getUserBoardMatchesList()를 사용하여
먼저 UserBoardMatches 엔티티의 리스트를 가져옵니다.
하지만 아까 User 엔티티 안에서 보신 userBoardMatchesList 필드는 LAZY 타입으로 설정이 되어있고
현재 트랜잭션 안에서 UserBoardMatches 엔티티에 접근한 적이 없어 닫혀있기 때문에
LazyInitializationException
이라는 기분나쁜 오류가 발생합니다!
그래서 저는 user에서 UserBoardMatches의 리스트를 들고오기 보다 직접 들고와서
보드 아이디들을 받아오도록 수행했습니다!
User안의 UserBoardMatches 리스트 필드의 타입을 EAGER로 변경해주는 방법도
해결방법 중 하나이긴 합니다!
이렇게 수정한 코드를 통해 사용자가 초대받은 boardId들을 구하는 함수를 만들 수 있었고
이로 인해 Board에 초대받은 유저들을 구분하는 로직을 짤 수 있게 되었습니다!
'Trouble Shooting' 카테고리의 다른 글
MySQL DataBase 저장 오류 -> 해결 (0) | 2024.07.14 |
---|