Search

무한참조

무한정으로 참조되어 반환되는 엔티티
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하지 않음으로써 정해진 변수의 참조를 막아준다.