[Spring JPA ] - insert, 무한참조방지 - 댓글 목록 뿌리기 - 21

JEONG SUJIN·2022년 11월 27일
0

스프링부트 JPA

목록 보기
22/24

일단 더미데이터로 댓글을 생성해주자..!!

사용자 id 값이 '1번'이 게시글 '2'번에 댓글 구현

insert into reply(content, board_id, user_id, create_date)
values("첫번째 댓글", 2,1, now());

총 댓글 3개를 만들어준다.
그리고 commit을 해준다.

BoardController.java

//상세보기 
	@GetMapping("/board/{id}")
	public String findById(@PathVariable int id, Model model ) {
		model.addAttribute("board", boardService.boardView(id));
		return "board/detail";
	}

Repository에 ReplyRepository 인터페이스를 만들어준다

ReplyRepository.java

//타입은 Reply이고, Reply의 id는 
public interface ReplyRepository extends JpaRepository<Reply,Integer> {
}

board가 reply를 들고 있으니까

Board.java

@OneToMany(mappedBy="board", fetch=FetchType.EAGER) //mappedBy연관관계의 주인이 아니다(FK키가아니에요). 
	
	private List<Reply> reply; 

BoardController.java

Board오브젝트는 Reply를 들고있다.

//상세보기 
	@GetMapping("/board/{id}")
	public String findById(@PathVariable int id, Model model ) {
		model.addAttribute("board", boardService.boardView(id));
		return "board/detail";
	}

detail.jsp

댓글 뿌려주기

<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>	

이렇게 하면 작성자가 잘 나오지만

작성자 ${reply.user.username}
부분이 무한참조되는 문제가 있다.

테스트를 해보면

@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.java

Board테이블에 reply를 위에 @JsonIgnoreProperties({"board"}) 넣어준다

@OneToMany(mappedBy="board", fetch=FetchType.EAGER) 
	@JsonIgnoreProperties({"board"})
    @OrderBy("id desc")
	private List<Reply> reply; 

Reply.java에서 호출할 때 Board는 호출하지 않게 된다.

이젠 무한참조로 안보인다 !!

profile
기록하기

0개의 댓글