-
Spring Boot LazyInitializationException취준/Project 2024. 5. 29. 09:30
LazyInitializationException이란?
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Resume> resumeList = new ArrayList<>();
FetchType.LAZY의 동작
fetch = FetchType.LAZY로 설정하면 Spring은 해당 연관관계를 프락시 형태의 가짜 객체로 채워 넣고 추후에 실제로 연관관계가 매핑되는 시점에 프락시 형태를 제거하고 진짜 객체와 연관관계를 맺어준다.
위와 같은 동작을 통해 무분별한 연관관계 매핑을 사전에 제거함으로써 성능향상을 위해 작성하는 것을 권장하고 있다.
하지만 위와 같은 동작 방식때문에 LazyInitializationException이 발생한다. 앞서 설명했듯이 연관관계 매핑이 되기 전에는 프락시 형태의 객체이기 때문에 프락시 형태의 객체를 조회하려 하면 예외가 발생하게 된다.
해결 방법
@Table // @Data 제거해야함 @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Entity @Builder public class User implements UserDetail
인터넷에는 Dto로 분리한다, Lazy전략을 Eager로 바꿔준다 등등의 방법이 있지만 만약 데이터 조회를 하지도 않았는데 이와 같은 예외가 터진다면 @Data annotation이 선언되어 있는지 확인해 볼 필요가 있다.
@Data안에는 Getter, Setter 뿐만 아니라 @ToString 메서드도 정의되어 있어 ToString을 오버라이딩 할때 FetchType.LAZY로 선언되어 있는 객체들을 조회하면서 프록시 객체를 조회하기 때문에 예외가 발생한다.
'취준 > Project' 카테고리의 다른 글
Naver MAP API를 이용해 지도 구현 (1) 2024.06.16 EC2에 Redis 설치후 연동하기 (0) 2024.06.08 Spring Boot, Redis를 이용하여 RefreshToken 발급하기 (0) 2024.05.31 Spring Boot 개발 환경 분리하기(properties File) (1) 2024.05.23 Reason: Failed to determine a suitable driver class (2) 2024.05.01