스프링이 제공하는 예외 처리를 배우기전 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자
예외의 종류와 개념에 대해서 깊게 알아보고자 한다!
서블릿 크게 2가지 방식으로 예외 처리를 한다
우리가 스프링없이 자바의 main 함수를 실행하면 main이라는 이름의 스레드가 생성된다. 실행 도중에 예외를 try catch로 잡지 못하고 main함수를 넘어서 예외가 던져지면 Exception의 종류나 정보를 남기고 main 스레드는 종료가 되며 프로그램이 끝이난다.
여기까지가 우리가 흔히 하는 main함수의 예외 처리인데,,,
웹 어플리케이션은 어떨까?
웹 어플리케이션은 “사용자 요청”별로 별도의 스레드가 할당되고 서블릿 컨테이너 안에서 실행된다. 그래서 어디선가 try-catch해서 잡으면 상관없는데, 만약 예외를 잡지 못하고 서블릿 밖으로 까지 예외가 전달되면 어떻게 될까?
WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
결국 톰캣 같은 WAS까지 전파가 된다. 그럼 어떻게 되는걸까?
톰캣같은 WAS는 기본으로 제공하는 오류 페이지가 있다.
만약 아래와 같은 에러를 controller에서 던지고 아무데서도 안잡고 서블릿 밖으로 던져져서 WAS까지 전파되면 어떻게 될까? 톰캣은 이를 서버에서 해결할 수 없는 오류로 판단하고 500에러를 던진다.
@Controller
public class ServletExController {
	@GetMapping("/error-ex")
	public void errorEx() {
	
	throw new RuntimeException("예외 발생!");
	
	}
}
localhost:8080/no-page 같은 정해놓지 않은 url주소에는 서버에서 해결할 것이 아닌 클라에서 잘못 접근한 것이므로 404 에러를 던진다.