무한정으로 참조되어 반환되는 엔티티
testController.java
@RestController
public class ReplyControllerTest {
@Autowired
private BoardRepository boardRepository;
@GetMapping("test/board/{id}")
public Board getBoard(@PathVariable int id) {
return boardRepository.findById(id).get;
}
}
Java
복사
Board.java
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
private List<Reply> replys;
}
Java
복사
Reply.java
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne
@JoinColumn(name="boardId")
private Board board;
}
Java
복사
실행 결과
컨트롤러의 get() 메소드를 실행하게 되면 오브젝트를 json으로 변환해주는 jackson라이브러리가 모델 내 존재하는 모든 getter를 호출한다. getReply() 메소드가 호출되면 Reply 오브젝트를 반환하는데, Reply 내에 참조된 Board 오브젝트를 다시한번 가져오면서 getter를 호출하여 무한정 참조되게 된다.
이 현상을 방지하기 위해선 Reply 클래스의 재귀적 참조 변수의 getter호출을 막아야 한다.
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
@JsonIgnoreproperties({"board"})
private List<Reply> replys;
}
Java
복사
jackson에서 지원하는 어노테이션으로, JSON으로 serialize하지 않음으로써 정해진 변수의 참조를 막아준다.