에러의 주 내용은 다음과 같다.
jakarta.servlet.ServletException: Circular view path [board]: would dispatch back to the current handler URL [/board] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
view resolver 의 경우 CSR(서버 사이드 렌더링)에서 사용된다. 따라서 CSR(클라이언트사이드 렌더링)의 경우 view resolver가 사용되지 않는다. CSR의 경우 HTTP body에 필요한 데이터를 담아서 클라이언트에 넘겨버리기 때문이다.
그러므로 클라이언트사이드 렌더링(ex 리액트)을 사용할때 서버 측에서 @Controller를 사용하면 뷰 렌더링을 위해 사용하는 view resolver가 호출되어 에러가 발생한다. 따라서 클라이언트사이드 렌더링을 사용할 경우, 서버에서는 데이터만을 넘기기 위한 @RestController 를 사용해야한다.
수정 전
@Controller
@CrossOrigin("http://localhost:3000")
public class BoardController {
private final BoardRepo boardRepo;
public BoardController(BoardRepo boardRepo) {
this.boardRepo = boardRepo;
}
...
@GetMapping("/board")
List<Board> getAllBoards(){
System.out.println("/board getMapping");
return boardRepo.findAll();
}
}
수정 후
@RestController
@CrossOrigin("http://localhost:3000")
public class BoardController {
private final BoardRepo boardRepo;
public BoardController(BoardRepo boardRepo) {
this.boardRepo = boardRepo;
}
...
@GetMapping("/board")
List<Board> getAllBoards(){
System.out.println("/board getMapping");
return boardRepo.findAll();
}
}