대빵's Blog

SpringBoot 3.3.2 에서 정적컨텐츠 활성화 하기 본문

개발관련

SpringBoot 3.3.2 에서 정적컨텐츠 활성화 하기

bigzero 2024. 8. 28. 10:26

개발환경

  • Java : JDK17
  • SpringBoot : 3.3.2
  • IDE : Intellij

문제상황

  • resources/static 경로에 있는 css, image 파일들이 thymeleaf 에서 적용되지 않음
  • css 소스파일 경로 : resources/static/css/xxx.css
  • image 소스파일 경로 : resources/static/images/xxx.jpg
  • 크롬에서 404 발생하고 ERR_ABORT 로 에러로그가 보여짐(Not-Found 가 아님)

원인분석

  • org.springframework.boot.autoconfigure.web.WebProperties 가 해당기능에 관여하는 소스코드임을 확인
  • Code
    @ConfigurationProperties("spring.web") 
    public class WebProperties { 
      private Locale locale; 
      private LocaleResolver localeResolver;
      private final Resources resources;     
      .. 중략    
      public static class Resources { 
      private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};     
      ... 중략    
      } 
      ...중략
    }    

문제해결

  • ConfiguraitonProperties 가 spring.web 으로 시작하는 것을 확인
  • 인터넷 상에서는 spring.mvc.static-path-pattern 에 classpath:/static/ 을 넣으라 되어 있지만 내 경우는 넣어도 작동되지 않았음
  • 아래처럼 변경하여 적용함 -> 정상작동 확인
  • web: resources: static-locations: classpath:/static/

추가확인

  • 위의 WebProperties 코드에 보면 "classpath:/static/" 이 default 로 들어 있기 때문에 어디선가 자동으로 적용하는 방법이 있을 것으로 생각함
  • @AutoConfiguration 을 활성화 하면 application.yml 에 별도로 static 경로를 지정하지 않아도 default static 경로가 적용되는 것을 확인함

결론

  • @AutoConfiguration 을 적용하거나, application.yml 에 별도로 spring.web.resources.static-locations 를 지정해야 정적컨텐츠에 접근이 가능했음.

추가

  • Annotation 이나 appcliation.yml 에 메타정보 인식 방식으로 하지 않고 아래처럼 JavaConfig 로 구현해도 됨
  • Code
    package com.demo.uam.common.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    
    @Configuration
    public class WebConfig extends WebMvcConfigurationSupport {
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
          registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
          super.addResourceHandlers(registry);
      }
    }