Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[예외처리] Servlet 예외처리 본문

인프런/[인프런] 스프링 MVC 2

[예외처리] Servlet 예외처리

Seung__ 2021. 9. 27. 21:11

1. Servlet의 예외처리 방법


  • Exception (예외) : Exception이 WAS까지 날라감.
  • response.sendError(HTTP 상태 코드, 오류 메시지)

 

2. Exception(예외)


  • 자바 직접 실행
    • 자바의 메인 메서드를 직접 실행하는 경우 main 이라는 이름의 쓰레드가 실행됨.
    • 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를
    • 남기고 해당 쓰레드는 종료된다.
  • 웹 애플리케이션
    • 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다.
    • 애플리케이션에서 예외가 발생했는데, 
    • 어디선가 try ~ catch로 예외를 잡아서 처리하면 아무런 문제가 없다. 
    • 그런데 만약에 애플리케이션에서 예외를 잡지 못하고, 
    • 서블릿 밖으로 까지 예외가 전달되면 어떻게  동작할까?
    • WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
    • 결국 톰캣 같은 WAS 까지 예외가 전달된다. 
    • WAS는 예외가 올라오면 어떻게 처리? 한번 테스트 해보자.

2.1 Test 

  • 스프링 부트가 제공하는 기본 예외 페이지는 꺼두자
  • application.properties
    • server.error.whitelabel.enabled=false
  • ServletExceptionController
@Slf4j
@Controller
public class ServletExceptionController {

    @GetMapping("/error-ex")
    public void errorEx(){
        throw new RuntimeException("예외 터짐!");
    }
}​

톰캣이 제공하는 오류 페이지

  • 개발자 모드로 확인하면  HTTP 상태 코드가 500인 것을 확인할 수 있음.
  • Exception 의 경우 서버 내부에서 처리할 수 없는 오류가 발생한 것으로 판단하여
  • HTTP 상태 코드 500을 반환

 

  • 즉 WAS는 Exception이 발생하면 서버 내부 문제로 판단 -> 500에러
  • Resource가 없는 경우  -> 400에러

 

 

 

3. response.sendError(HTTP 상태 코드, 오류 메시지)


  • 오류가 발생했을 때 HttpServletResponse 가 제공하는 sendError 라는 메서드를 사용 가능.
  • 서블릿 컨테이너에게 오류가 발생한 것을 전달할 수 있음
  • 이 메서드를 사용하면 HTTP 상태 코드와 오류 메시지도 추가 가능.
  • response.sendError(HTTP 상태 코드)
  • response.sendError(HTTP 상태 코드, 오류 메시지)
    @GetMapping("/error-404")
    public void error404(HttpServletResponse response) throws IOException {
        response.sendError(404, "404 404 404 404");
    }

    @GetMapping("/error-500")
    public void error500(HttpServletResponse response) throws IOException {
        response.sendError(404, "500 500 500 500 500");
    }
  • sendError 흐름
    • WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(response.sendError())
    • response.sendError() 를 호출하면 response 내부에는 오류가 발생했다는 상태를 저장
    • 서블릿 컨테이너는 고객에게 응답 전에 sendError() 가 호출되었는지 확인
    • 호출되었다면 설정한 오류 코드에 맞추어 기본 오류 페이지를 보여준다.

 

4. GitHub : Exception


 

bsh6463/Exception

Contribute to bsh6463/Exception development by creating an account on GitHub.

github.com

 

Comments