pring Boot 애플리케이션에서 API 전용으로 설정했음에도 불구하고, /favicon.ico 요청으로 인해 Circular view path [favicon] 오류가 발생하는 경우가 있습니다. 이 오류는 Spring Boot가 favicon.ico 요청을 처리하려고 시도할 때 적절한 핸들러를 찾지 못해 발생합니다.

이 포스팅에서는 이 문제를 해결하기 위해 사용한 두 가지 접근 방법에 대해 설명하겠습니다.

문제 설명

Spring Boot 애플리케이션에서 /favicon.ico에 대한 GET 요청이 들어오면, 이를 처리할 핸들러가 없을 때 Circular view path 오류가 발생할 수 있습니다. 이 오류는 기본적으로 뷰 리졸버가 요청을 처리하려고 시도하지만, 이를 반복해서 호출하게 되어 발생합니다.

jakarta.servlet.ServletException: Circular view path [favicon]: would dispatch back to the current handler URL [/favicon] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
 

이 문제를 해결하기 위해서는 favicon.ico 요청을 적절히 처리하거나 무시하도록 설정해야 합니다.

해결 방법

문제를 해결하기 위해 다음 두 가지 방법을 사용했습니다:

  1. 정적 리소스 핸들러 설정
  2. /favicon.ico 요청을 처리하는 Controller 추가

1. 정적 리소스 핸들러 설정

Spring Boot에서는 WebMvcConfigurer를 사용하여 정적 리소스를 제공할 수 있는 경로를 설정할 수 있습니다. 정적 리소스 핸들러를 설정함으로써, /static/** 경로의 리소스 요청이 classpath:/static/ 디렉토리에서 제공되도록 할 수 있습니다.

아래는 정적 리소스 핸들러를 설정한 코드입니다:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}
 
 

이 설정을 통해 애플리케이션은 /static/ 경로의 정적 리소스를 classpath:/static/에서 제공하게 됩니다. 그러나 /favicon.ico 요청은 여전히 처리되지 않기 때문에, 다음 단계에서 이를 처리하는 Controller를 추가해야 합니다.

2. /favicon.ico 요청을 처리하는 Controller 추가

/favicon.ico 요청에 대해 204 No Content 응답을 반환하도록 설정하여, Spring Boot가 이 요청을 적절히 처리하도록 할 수 있습니다. 이를 위해 간단한 Controller를 추가합니다:

 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

 

이 Controller는 /favicon.ico 요청이 들어올 때 빈 응답을 반환하며, HTTP 상태 코드 204 (No Content)를 설정합니다. 이를 통해 순환 참조 오류 없이 안전하게 요청을 무시할 수 있습니다.

최종 결과

위의 두 가지 설정을 적용한 후, /favicon.ico 요청으로 인해 발생하던 Circular view path 오류는 더 이상 발생하지 않게 되었습니다. 이 과정에서 우리는 /favicon.ico 요청을 무시하거나 적절히 처리하는 방법을 배웠으며, Spring Boot 애플리케이션에서 API와 정적 리소스 경로를 명확히 구분할 수 있게 되었습니다.

요약

Spring Boot에서 /favicon.ico 요청으로 인해 발생하는 오류를 해결하기 위해 다음 두 가지 방법을 적용했습니다:

  1. 정적 리소스 핸들러 설정: WebMvcConfigurer를 사용하여 정적 리소스를 특정 경로에서 제공하도록 설정했습니다.
  2. /favicon.ico 요청을 처리하는 Controller 추가: /favicon.ico 요청이 들어왔을 때 204 No Content 응답을 반환하는 Controller를 추가했습니다.

이 해결 방법은 Spring Boot 애플리케이션에서 API 전용 설정을 유지하면서 불필요한 오류를 방지하는 데 매우 유용합니다. 앞으로 비슷한 문제가 발생할 때 이와 같은 방법을 적용해 보세요.

+ Recent posts