일단 더미데이터로 댓글을 생성해주자..!!
사용자 id 값이 '1번'이 게시글 '2'번에 댓글 구현
insert into reply(content, board_id, user_id, create_date)
values("첫번째 댓글", 2,1, now());
총 댓글 3개를 만들어준다.
그리고 commit을 해준다.
//상세보기
@GetMapping("/board/{id}")
public String findById(@PathVariable int id, Model model ) {
model.addAttribute("board", boardService.boardView(id));
return "board/detail";
}
Repository에 ReplyRepository 인터페이스를 만들어준다
//타입은 Reply이고, Reply의 id는
public interface ReplyRepository extends JpaRepository<Reply,Integer> {
}
board가 reply를 들고 있으니까
@OneToMany(mappedBy="board", fetch=FetchType.EAGER) //mappedBy연관관계의 주인이 아니다(FK키가아니에요).
private List<Reply> reply;
Board오브젝트는 Reply를 들고있다.
//상세보기
@GetMapping("/board/{id}")
public String findById(@PathVariable int id, Model model ) {
model.addAttribute("board", boardService.boardView(id));
return "board/detail";
}
댓글 뿌려주기
<c:forEach var="reply" items="${board.reply}">
<li id="comment--1" class="list-group-item d-flex justify-content-between">
<div>${reply.content }</div>
<div class="d-flex">
<div class="">작성자 ${reply.user.username}</div>
<button class="badge">삭제</button>
</div>
</li>
</c:forEach>
이렇게 하면 작성자가 잘 나오지만
테스트를 해보면
@RestController
public class ReplyController {
@Autowired
private BoardRepository boardRepository;
@GetMapping("/test/board/{id}")
public Board getBoard(@PathVariable int id) {
return boardRepository.findById(id).get();
}
}
무한참조로 보이는걸 볼 수있다.
📍JPA를 사용할 때 발생할 수 있는 무한참조를 알아보는 참조링크
참고링크
Board정보만 가져오는데 Board정보가 연관된걸 다 들고오기 때문에, user는 유저만 들고오는데 user테이블안에 reply를 들고오고 reply안에 또 board와 user를 들고오기때문에 무한참조
무한참조 방지 @JsonIgnoreProperties({"board"})
Board테이블에 reply를 위에 @JsonIgnoreProperties({"board"})
넣어준다
@OneToMany(mappedBy="board", fetch=FetchType.EAGER)
@JsonIgnoreProperties({"board"})
@OrderBy("id desc")
private List<Reply> reply;
Reply.java에서 호출할 때 Board는 호출하지 않게 된다.
이젠 무한참조로 안보인다 !!