조회로 받아오는 객체의 필드에 양방향 연관관계가 있는 필드가 있지 않은 지 확인해봅시다.
예를 들어
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
//@ToString(of = {"id","username"})
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private String userId;
private String userPassword;
@Enumerated(value = EnumType.STRING)
private Grade grade;
@OneToMany(mappedBy = "member")
private List<Post> postList = new ArrayList<>();
@OneToMany(mappedBy = "member")
private List<Comment> commentList = new ArrayList<>();
private Member(String username, String userId, String userPassword, Grade grade) {
this.username = username;
this.userId = userId;
this.userPassword = userPassword;
this.grade = grade;
}
public static Member createMember(String username, String userId, String userPassword, Grade grade) {
return new Member(username, userId, userPassword, grade);
}
}
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
//@ToString(of = {"id","username"})
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private String userId;
private String userPassword;
@Enumerated(value = EnumType.STRING)
private Grade grade;
@OneToMany(mappedBy = "member")
private List<Post> postList = new ArrayList<>();
@OneToMany(mappedBy = "member")
private List<Comment> commentList = new ArrayList<>();
private Member(String username, String userId, String userPassword, Grade grade) {
this.username = username;
this.userId = userId;
this.userPassword = userPassword;
this.grade = grade;
}
public static Member createMember(String username, String userId, String userPassword, Grade grade) {
return new Member(username, userId, userPassword, grade);
}
}
'postList에 있는 post와 commentList에 있는 comment'에도 member 필드가 있다고 가정해봅시다.
그럼 Member객체도 post와 comment를 참조하고, Post와 Comment에서도 각각 member를 참조하니,
이를 양항향 연관관계라고 합니다.
그럼 이게 왜 문제가 되는가?
- member를 조회한다.
- 당연히 member의 필드에 있는 postList를 호출한다.
- postList에는 post객체가 들어있으니 Post를 호출한다.
- Post에는 Member 필드가 있으니 호출된 Post는 또 다시 Member를 호출한다.
- 호출된 Member는 또 다시 Post를 호출한다...
그렇다면 이는 어떻게 해결하는가?
- 양방향 연관관계 필드에 @JsonIgnore 을 걸어 해당 필드를 제외하고 Json으로 반환한다.
- Hibernate5Module 모듈 등록
등과 같은 방법이 있다.
그치만 이러한 방법을 사용하는 것보다 더 좋은 방법은 바로 DTO를 사용하는 것이므로 자세히 다루지는 않겠다.
'Error' 카테고리의 다른 글
List의 NULL을 방지하려고 초기화해줬는데 왜 NPE가? (0) | 2024.01.15 |
---|---|
application.yaml 설정- org.hibernate.sql 작동 안함 (0) | 2024.01.09 |
Git "There is no tracking information for the current branch. Please specify which branch you want to merge with. "오류 (0) | 2024.01.09 |
git push author 변경 (0) | 2023.09.04 |
400 에러 - 필드가 하나인 DTO의 기본 생성자 부재... (0) | 2023.08.22 |