🍏 개발일기

스프링에서의 정적 리소스(static resources) 핸들러

보배 진 2026. 2. 10. 09:40

 

 

기본 개념

스프링 MVC에서는 CSS, JS, 이미지, 폰트 같은

정적 리소스를 제공하지 위해 정적 리소스 핸들러를 사용합니다

 

ex)

URL 요청 실제 파일 위치
/css/style.css src/main/resources/static/css/style.css
/images/logo.png src/main/resources/static/images/logo.png

 

 

 

 

 

 

스프링 기본 경로

스프링 부트 기준, 특별한 설정 없이도 다음 디렉토리에서 정적 리소스를 자동으로 찾습니다

src/main/resources/static/
src/main/resources/public/
src/main/resources/resources/
src/main/resources/META-INF/resources/

예를 들어, src/main/resources/static/js/app.js 파일이 있으면

http://localhost:8080/js/app.js로 접근이 가능해진다

📛 스프링 부트는 자동 설정이 되어 있어서 대부분의 경우 추가 설정이 필요 없습니다

 

 

 

왜 static 폴더는 자동으로 되는지

Spring Boot가 시작할 때 static 폴더는 정적파일 폴더다 라고 미리 등록을 해두기 때문에

우리가 설정을 안해도 자동으로 동작한다

자동이 깨지는 경우가 @EnableWebMvc 사용할 때이다

 

 

 

 

 

직접 정적 리소스 경로 매핑하기

Spring MVC에서는 WebMvcConfigurer를 구현하여 정적 리소스 경로를 커스터마이징 할 수 있습니다

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
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) {
        // /resources/** 요청을 resources 폴더와 매핑
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/my-resources/");

        // 외부 폴더도 가능
        registry.addResourceHandler("/files/**")
                .addResourceLocations("file:/Users/yoojin/files/");
    }
}

이 코드를 보면

addResourceHandler ➡ URL 패턴 (클라이언트가 요청하는 경로)

addResourceLocations ➡ 실제 파일 위치 (classpath: = resources 폴더, file: = 외부 경로)

예를 들어, 위 설정에서 /resources/logo.png 요청 ➡ src/main/resources/my-resources/logo.png 반환

 

 

 

 

캐시 설정

정적 리소스는 캐시가 중요한 경우가 많다

Spring에서는 setCachePeriod 또는 ResourceChain로 캐시 설정 가능하다

registry.addResourceHandler("/resources/**")
	.addResourceLocations("classpath:/my-resources/")
        .setCachePeriod(3600); // 초 단위, 1시간 캐시

 

 

 

 

 

 

 

흔히 하는 실수

1. URL과 실게 경로 혼동

URL /css/style.css ➡ 실제 위치

src/main/resources/static/css/style.css

/static/css/style.css로 요청하면 404 나올 수 있음

 

2. WebMvcConfigurer 사용 시 @EnableWebMvc 주의

@EnableWebMvc 붙이면 스프링 부트 자동 설정이 무시되므로 정적 리소스 핸들러도 직접 다 설정해야 함

 

3. 외부 파일 접근

file:/경로/ 형태로 지정 가능

file:///c:/... 처럼 슬래시 형태 주의

 

 


 

 

내가 이해한 걸 바탕을 쉽게 정리해보면

정적 리소스 핸들러는 URL이 오면 어느 폴더에서 파일 꺼낼지 알려주는 안내원

 

예를 들어

URL이 /image/** 이고

실제로는 resources/myimage/에 있다면

@Configuration
public class WebConfig implements WebMvcConfigurer {

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

이렇게 작성할 수 있다

 

resources
 └ myimage
    └ cat.png

실제 폴더가 이런식으로 있고

 

 

접속은 http://localhost:8080/image/cat.png 이렇게 하면

cat.png를 보여준다