에러(error)

Error Message

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

 

Thu May 09 17:43:13 PWT 2019

There was an unexpected error (type=Internal Server Error, status=500).

Circular view path [page]: would dispatch back to the current handler URL [/page] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

 

 

환경 (environment)

IDE : STS 4(Spring Tool Suite 4)

Build : Maven

View : JSP (Java Server Page)



상황 (situation)

Web Page 요청 주소 : http://localhost/page

아래 코드는 Web Page를 통해서 접근할 때, 서버의 진입 부분의 코드인 PageController.java 내용의 일부이다. 여기로 진입해서 page() 함수내의 처리를 해주어야 하는데, 위와 같은 에러가 발생하고 있는 상황이다.

@Controller
public class PageController {
 @RequestMapping(value="/page", method = {RequestMethod.POST})
 public ModelAndView page(HttpSession session) {
   ...
 }
 ...
}



원인 (cause)

1) Whitelabel Error Page

 

SpringBoot를 사용할 때, 서버에서 에러를 핸들링하고 있지 않는 상태에서 에러가 발생하면 기본적으로 "Whitelabel Error Page"로 이동한다. 예를 들어서, 서버에 @ExceptionHandler를 사용해서 에러를 핸들링 할 수도 있고, 아니면 try, catch문으로 에러를 핸들링 할 수도 있다. 다시 말해서, 이러한 방식으로 코드에서 발생한 에러를 잡지 않고 있다면 "Whitelabel Error Page"에러 페이지를 볼 수 있다는 것이다.

 

2) This application has no explicit mapping for /error, so you are seeing this as a fallback.

 

"Whitelabel Error Page"만 보고 에러를 정확히 해석하기가 힘들다. 그래서 바로 아래 출력된 에러 내용을 봐야하는데, 만약에 위와 같은 형태로 출력됬다면, 이 말의 해석은 "니가 서버에 올린 웹 애플리케이션은 /error 페이지와 매핑되는 정보가 없으니, 너는 fallback(=서버 개발자가 특별히 에러를 핸들링하지 않으면 SpringBoot가 미리 만들어놓은 default로 에러를 핸들링해서 출력한 페이지)를 봐라"라는 것이다.

 

3) There was an unexpected error (type=Internal Server Error, status=500)

 

status가 500인데, 500은 서버에서 에러가 발생했다는 의미이다. 참고로, status가 404였다면, 페이지를 찾을 수 없다는 의미이기 때문에 404일 경우는 페이지를 제대로 요청했는지 혹은 서버에서 해당 페이지에 대한 파일이 정확히 있는지를 확인하면 된다. 그런데 여기선 500이므로, 서버 내부에서 어떤 설정값에 의한 문제로 인해 발생된 에러로 추정된다는 의미이다.

 

4) Check your ViewResolver setup!

 

에러에서 문장은 SpringBoot에서 현재 발생한 에러를 해결하기 위한 힌트이다. 현재 발생한 에러는 ViewResolver와 관련된 것 같으니 ViewResolver를 확인하라는 것이다. 참고로, SpringBoot에서 ViewResolver는 Controller의 처리결과를 생성할 View를 결정하는 역할을 한다.

[ Spring에서 View Resolver 위치 ]

 

주요원인) SpringBoot에서 jsp를 사용하고 있는데, jsp에 대한 설정을 제대로 하지 않아서 발생한 것이다. 사용자가 요청한 page를 서버가 /WEB-INF/jsp/page.jsp 를  ViewResolver를 통해 뿌려주어야 하는데 어떤 위치에 있는지를 찾지 못하는 것이다. 참고로, SpringBoot는 jsp를 기본사용으로 설정되어 있지 않기 때문에 jsp를 사용할 경우 몇가지 추가 설정작업들을 해주어야 하는데 제대로 하지 않은 것이다.



해결 (solution)

SpringBoot에서 jsp를 사용할 수 있도록 설정한다. application.properties 파일에 아래 내용을 추가한다.

spring.mvc.view.prefix  = /WEB-INF/jsp/
spring.mvc.view.suffix  = .jsp