Posts [Spring] 스프링부트3버전에서 존재하지 않는 리소스 요청시 예외가 발생하는 문제 해결기
Post
Cancel

[Spring] 스프링부트3버전에서 존재하지 않는 리소스 요청시 예외가 발생하는 문제 해결기

spring boot3 버전 마이그레이션후로 ‘/favicon.ico/’ 요청에 대해 500 status 응답이 떨어지는 현상이 발생하였다. api 서버이기에 favicon을 별도 관리하지 않아 고객에게 이어지는 치명적인 상황은 아니었지만 제품운영 관점에서 에러로그가 너무 과도하게 찍히고있어, 실제 고객의 제품 사용 도중 발생한 오류들을 시스템적으로 더 잘 캐치해내기 어려워지다보니 해당 이슈를 해결하게 되었다.(Datadog을 모니터링툴로 사용하고 있다보니 로그 비용 문제도 있다)

원인 분석 도중 spring boot 깃허브 레포지토리의 올라온 이슈를 통해 spring 6.1(boot 3.2.0)부터 존재하지 않는 리소스 요청시 404 status 응답이 바로 반환되는게 아닌 적절한 핸들러가 없을 경우 NoResourceFoundException 예외가 던져지고, ExceptionHandler로 적절한 예외 핸들 로직이 없으면 500 status로 이어지게 된다는 내용을 찾을 수 있었다.

Starting with Spring Framework 6.1 (which Boot 3.2.0 uses), NoResourceFoundException is thrown if there’s no handler. This exception is handled by your infoshare.springboot404.handler.GlobalExceptionHandler#globalExceptionHandler and translated to a HTTP 500. See here for more details: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#web-applications or this issue spring-projects/spring-framework#29491.

image

실제 스프링부트 버전 마이그레이션 이전(boot2, spring 5.3)과 이후(boot3, spring 6.1)의 로직을 살펴보니 위 이미지와 같이 로직이 변경된 부분을 확인할 수 있었다. (404 status 바로 응답 -> NoResourceFoundException 던짐)

해결 방안은 ExceptionHandler에서 해당 예외에 대한 핸들링 로직을 추가하였고, 운영 환경에서 과도하게 출력되는 에러 로그들을 제거할 수 있었다.

더 나아가 왜 api 서버로 /favicon.ico 리소스 요청이 발생했을까를 고민해보면 인증서버에서 로그인 성공 후의 redirect 처리로 인해 api 서버의 callback 컨트롤러로 요청이 들어오게 되면서 발생하게된게 아닐까 싶다.(실제 local 환경에서 재현시 동일하게 /favicon.ico 경로로 요청이 발생하는것을 확인할 수 있었다)

브라우저의 기본동작으로 웹 페이지 로드시, 탭에 표시될 아이콘(파비콘)을 자동으로 요청하는데 명시적으로 설정된 파비콘이 없을 경우 기본적으로 /favicon.ico 경로로 요청을 보내기때문이다.

This post is licensed under CC BY 4.0 by the author.