JPA를 사용중
//...
@Entity(name = "user")
public class User{
//columns
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Course> courses;
}
@Entity(name = "course")
public class Course {
//columns...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
User user;
}
와 같은 양방향 관계가 있을때,
select course 쿼리로 course객체를 받아올때, LAZY fetch로 user는 안가져오는게 당연하지만,
course객체를 controller를 통해서 응답할때, Jackson에서 json으로 변환시 연관된 객체를 받아오는 쿼리를 날린다.
그래서 의도와는 다르게 fetch를 해서, infinite recursion 현상이 벌어진다.
해결 :
1. 주종관계에서, 주인 객체 컬럼에 @JsonBackReference (보통 foreign key를 지닌 테이블)
중속 객체 컬럼에 @JsonManagedReference 를 붙여주면 해결이된다.
https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion
2. 양방향 관계를 제거한다. (필요성을 다시한번 생각해봄)
3. 참조컬럼을 지닌 객체를 사용하는대신 DTO를 생성해서 사용한다.
'Spring' 카테고리의 다른 글
[Java] Optional 사용법 (0) | 2022.02.07 |
---|---|
[spring JPA] Page, PageRequest 메서드 정리 (0) | 2022.02.07 |
[Pageable, PageRequest] Request Param 따로 받아 Pageable 생성해서 주입하기 (0) | 2022.02.04 |
[spring] @RequetParam, @ModelAttribute (0) | 2022.02.02 |
[Query Dsl] exists 쿼리 결과 존재여부 확인 (0) | 2021.09.08 |