Spring Boot에서 NoHandlerFoundException 발생하지 않는 이슈

파워소동·2025년 3월 1일

📌 문제 상황

Spring Boot 프로젝트에서 존재하지 않는 API 요청 시 NoHandlerFoundException을 기대했지만, 실제로는 NoResourceFoundException이 발생하는 문제!

에러 핸들링 java 코드

	// 기본 예외 처리
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ExceptionResponse>handleException(Exception exception) {
    	// 예외 처리 로직	
    }
    
    // 존재하지 않는 api에 대한 예외 처리
	@ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<ExceptionResponse> handleNoHandlerFoundException(NoHandlerFoundException exception) {
    	// 예외 처리 로직	
    }

💡 원인

Spring Boot는 기본적으로 정적 리소스(예: /static, /public 폴더의 파일)를 자동으로 처리합니다.

예상 시나리오:

  1. 존재하지 않는 API 호출
  2. NoHandlerFoundException 발생
  3. handleNoHandlerFoundException 메서드 실행

실제 동작:

  1. 존재하지 않는 API 호출
  2. 매핑되는 API가 없으면, Spring이 정적 리소스 핸들러를 통해 해당 경로의 정적 파일을 찾으려고 시도
  3. 정적 리소스에서도 해당 파일을 찾지 못하면 NoResourceFoundException가 발생
  4. 따라서 기본 예외 처리 로직으로 이동
  5. 최종적으로 handleException 메서드가 호출됨

🚀 해결

Spring이 정적 리소스를 처리하지 않도록 설정을 변경합니다

spring:
  web:
    resources:
      add-mappings: false
  • add-mappings: false 설정 시, Spring은 정적 리소스를 자동으로 처리하지 않게합니다.
  • 결과적으로 존재하지 않는 API 호출 시 정적 리소스를 처리하는 과정이 생략되고, 바로 NoHandlerFoundException이 throw 됩니다~

✅ 결론

  • 정적 리소스 처리 설정을 비활성화하여 NoHandlerFoundException을 기대한 대로 처리할 수 있습니다.
  • add-mappings: false 설정은 특히 REST API 서버처럼 정적 리소스가 필요 없는 경우에 적합할 것 같습니다.
  • 스프링부트 3 이상부터는 throw-exception-if-no-handler-found가 deprecated가 되어서 yaml에 작성하지 않아도 된다고 합니다.
profile
이것저것 모음집

0개의 댓글