오봉이와 함께하는 개발 블로그
스프링 MVC 2 - 서블릿 예외 처리 시작 본문
서블릿 예외 처리 - 시작
스프링이 아닌 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자.
- 서블릿이 예외 처리 하는 방법
- Exception(예외)
- response.sendError(HTTP 상태 코드, 오류 메시지)
Exception(예외)
자바 직접 실행
자바의 메인 메소드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행된다.
예외가 발생하면 처음 발생한 메소드로부터 상위 메소드로 계속 올라가는데, 실행 도중에 예외를 잡지 못 하고 처음 실행한 main() 메소드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다.
웹 어플리케이션
웹 어플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다.
어플리케이션에서 예외가 발생했는데, 어디선가 try-catch로 예외를 잡아서 처리하면 아무런 문제가 없다.
하지만, 어플리케이션에서 예외를 잡지 못하고 서블릿 밖으로 예외가 전달되면 어떻게 동작할까
WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
결국 톰캣 같은 WAS 까지 예외가 전달된다.
WAS는 예외가 올라오면 어떻게 처리해야 할까?
테스트
application.properties
server.error.whitelabel.enabled=false
ServletExController - 서블릿 예외 컨트롤러
@Slf4j
@Controller
public class ServletExController {
@GetMapping("/error-ex")
public void errorEx() {
throw new RuntimeException("예외 발생!");
}
}
실행해보면 다음처럼 tomcat이 기본으로 제공하는 오류 화면을 볼 수 있다.HTTP Status 500 – Internal Server Error
웹 브라우저에서 개발자 모드로 확인해보면 HTTP 상태 코드가 500으로 보인다.Exception
의 경우 서버 내부에서 처리할 수 없는 오류가 발생한 것으로 생각해서 HTTP 상태 코드 500을 반환한다.
아무 사이트나 호출하면 404 오류 화면을 볼 수 있다.HTTP Status 404 – Not Found
response.sendError(HTTP 상태 코드, 오류 메시지)
오류가 발생했을 때 HttpServletResponse
가 제공하는 sendError
라는 메소드를 사용해도 된다.
이것을 호출한다고 당장 예외가 발생하는 것은 아니지만, 서블릿 컨테이너에 오류가 발생했다는 점을 전달할 수 있다.
이 메소드를 사용하면 HTTP 상태 코드와 오류 메시지도 추가할 수 있다.
- response.sendError(HTTP 상태 코드)
- response.sendError(HTTP 상태 코드, 오류 메시지)
ServletExController - 추가
@GetMapping("/error-404")
public void error404(HttpServletResponse response) throws IOException {
response.sendError(404, "404 오류!");
}
@GetMapping("/error-500")
public void error500(HttpServletResponse response) throws IOException {
response.sendError(500);
}
sendError 흐름
WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(response.sendError())
response.sendError()
를 호출하면 response
내부에는 오류가 발생했다는 상태를 저장해둔다.
그리고 서블릿 컨테이너는 고객에게 응답 전에 response
에 sendError()
가 호출되었는지 확인한다.
그리고 호출되었다면 설정한 오류 코드에 맞추어 기본 오류 페이지를 보여준다.
에러 화면
HTTP Status 404 – Bad Request
HTTP Status 500 – Internal Server Error
정리
서블릿 컨테이너가 제공하는 기본 예외 처리 화면은 사용자가 보기에 불편하다. 의미 있는 오류 화면을 제공해보자.
출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
'BE > Spring' 카테고리의 다른 글
스프링 MVC 2 - 서블릿 예외 처리 오류 페이지 작동 원리 (0) | 2022.08.30 |
---|---|
스프링 MVC 2 - 서블릿 예외 처리 오류 화면 제공 (0) | 2022.08.30 |
스프링 MVC 2 - ArgumentResolver 활용 (0) | 2022.08.30 |
스프링 MVC 2 - 스프링 인터셉터 인증 체크 (0) | 2022.08.30 |
스프링 MVC 2 - 스프링 인터셉터 소개 (0) | 2022.08.29 |