스프링부트 서버에 알 수 없는 요청을 보내거나 서버에서 에러가 발생하면
기본 설정인 BasicErrorController.class에 의해 에러 페이지 또는 에러 메시지를 응답한다.
💡 Controller 계층에서 발생하는 특정 예외를 처리해야 하는 경우
ExceptionHandler 또는 ControllerAdvice를 활용합니다.


Error 응답 동작 원리
컨트롤러 계층에서 처리할 수 없는 예외가 던져지면 콜스택을 따라 컨트롤러를 호출한 서블릿으로 전파된다.
서블릿 컨테이너(톰캣)는 전파된 예외를 받으면 에러를 응답하게되고
이후 스프링부트는 다시 서블릿으로 부터 에러를 받으면 /error로 전달한다.
/error라는 경로는 ErrorProperties 기본값으로 정의되어 있다.

디버깅을 해봤는데 톰캣 에러를/error로 전달하는 과정은 찾지 못했다...
누군가 알게되면 댓글로 남겨주세요..
BasicErrorController
그러면 /error 전달받은 요청은 누가 어떻게 처리할까?
그 /error를 받는 컨트롤러가 바로 BasicErrorController이다.


해당 클래스를 살펴보면 MIME 타입에 따라 응답을 다르게 하는 것을 확인할 수 있다.
- text/html
- view 반환
- 나머지
- ResponseEntity를 반환하면서 json 응답
이런 이유로 브라우저라면 WhiteLabel view가 응답되고 그게 아니라면 JSON 응답을 받게된다.

white-labe view 또한 이미 정의되어 있다.
BasicErrorController 자동 생성은 어떻게?

스프링부트 AutoConfiguration에 의해 ErrorController 타입의 빈(Bean)이 생성되지 않은 경우
BasicErrorController가 빈으로 등록된다.
@ConditionalOnMissingBean 어노테이션을 런타임에 읽어 해당 타입의 빈이 없다면 빈으로 생성시켜 준다.
따라서 ErrorController 타입의 Bean을 직접 등록하지 않으면 미리 정의된 BasicErrorController가 동작하는 것이다.