728x90
1.이슈 상태
- 매핑된 데이터 FetchType.LAZY 사용
- 두 Entity가 1:N ,N : 1 양방향 관계
- Entity를 json으로 직렬화하여 반환할 경우 순환 참조 발생
- Entity 에 @Data , @ToString, @EqualsAndHashCode 을 사용하면서 두 객체가 서로의 필드를 계속 참조하면서 순환참조 발생
- @ResponseBody 사용 시 객체 직렬화
2. 원인
- jpa에서 양방향으로 연결된 Json을 직렬화하는 과정에서 서로 정보를 순환 참조하여 문제 발생
3. 해결 방법
3-1. Dto로 반환하여 해결 가장 추천하는 방식
3-2. @JsonManagedReference, @JsonBackReference 사용하여 순환 참조를 해결
- @JsonBackReference 연관관계의 주인 entity에 선언
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board {
@Id
@GeneratedValue
@Column(name="board_id")
private Long id;
private String title;
private String content;
@NotNull
private String writer;
private LocalDateTime modificationDate;
private LocalDateTime creationDate;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
public Board(String title,String writer,Member member) {
this.title = title;
this.writer = writer;
if(member !=null) {
changBoard(member);
}
}
public void changBoard(Member member) {
this.member = member;
member.boards.add(this);
}
}
- @JsonManagedReference 연관관계 주인이 아닌 entity에 선언
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id","member_userid"})
public class Member {
@Id
@GeneratedValue
@Column(name="member_id")
private Long id;
private String member_userid;
private String member_passwd;
@NotNull
private String member_username;
private String member_phone;
@JsonManagedReference
@OneToMany(mappedBy = "member")
List<Board> boards = new ArrayList<>();
public Member(String member_userid,String member_username,String member_passwd, String member_phone) {
this.member_userid = member_userid;
this.member_username = member_username;
this.member_passwd = member_passwd;
this.member_phone = member_phone;
}
}
참조
728x90