jpa json 순환 참조 이슈

2022. 8. 30. 13:35·개발/이슈
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;
	}
	
}

참조

  • URL : https://data-make.tistory.com/727
728x90

'개발 > 이슈' 카테고리의 다른 글

QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list ( DTO에 fetchJoin 사용 이슈)  (0) 2022.08.30
[Spring Data JPA] No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 에러 해결 (db 저장 시 Transactional 미입력 이슈)  (0) 2022.08.30
'개발/이슈' 카테고리의 다른 글
  • QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list ( DTO에 fetchJoin 사용 이슈)
  • [Spring Data JPA] No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 에러 해결 (db 저장 시 Transactional 미입력 이슈)
nix-be
nix-be
  • nix-be
    NiX
    nix-be
  • 전체
    오늘
    어제
    • 홈
      • 책
        • 오브젝트
      • 성장
        • jpa Querydsl 정리
        • 코딩테스트
      • 인프라
        • linux
        • vmware
        • CI&CD
        • 네트워크
        • docker
      • 개발
        • spring boot
        • JPA
        • java
        • thymeleaf
        • 이슈
        • jquery
        • javascript
        • 안드로이드
      • DB
        • postgreSql
      • 잡다한것
        • 프로그램
        • 일상 관련
      • 회사
        • 티
  • 블로그 메뉴

    • 홈
    • 개발
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
nix-be
jpa json 순환 참조 이슈
상단으로

티스토리툴바