학습 출처
https://www.baeldung.com/spring-mvc-static-resources
스프링부트에서 정적 리소스(static resource)를 어떻게 제공하는지를 간단하게 알아보는 포스팅이다.
정적 리소스에 대한 스프링부트의 기본 설정 경로
Servlet Context 또는 classpath 하위의
/static
/public
/resources
/META-INF/resources
경로에 있는 정적 리소스는 자동으로 반환을 하도록 설정되어 있다.
다시 말해 아래와 같은 폴더 구조에서,
static 폴더 안에 있는 test.txt 파일은 별도의 설정 없이도 http://localhost:8080/test.txt 로 접근 가능하다는 의미이다.
txt 파일 뿐만 아니라 pdf, png 등도 가능하다.
정적 리소스 경로 커스터마이징
application.yml 설정에 아래와 같이 정적 리소스에 대한 경로를 설정할 수 있다.
, 를 사용하여 여러 경로를 설정할 수 있다.
이렇게 설정하고 나면 http://localhost:8080/testStatic.txt 에 접근 가능하고,
http://localhost:8080/test.txt 는 404 에러가 응답될 것이다. 기본 경로인 static 경로를 설정에서 제외했기 때문이다.
spring:
web:
resources:
static-locations: classpath:/richStatic, classpath:/testStatic
파일 시스템에 있는 정적 리소스 반환 설정
It uses the ResourceHttpRequestHandler from Spring MVC
so that you can modify that behavior by adding your own WebMvcConfigurer
and overriding the addResourceHandlers method.
WebMvcConfigurer를 상속받은 클래스에 Configuration, EnableWebMvc 애너테이션을 추가한 뒤,
addResourceHandlers 메소드를 오버라이드함으로써 설정한다.
운영 배포 시점에 내장되어있는 파일만 사용한다면 이야기가 다를 수 있지만,
특정 경로에 정적 자원을 저장해두고, 그 경로에서 응답을 해주는 경우가 더 많을 것으로 생각된다.
그 경우에는 아래쪽 오버라이드를 사용하면 될 것이다.
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
// 개발 시점에 사용 가능한 코드.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
// 배포 시점에 사용 가능한 코드.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/files/**")
.addResourceLocations("file:/opt/files/");
// 윈도우라면
.addResourceLocations(“file:///C:/opt/files/“);
}
}
작동 원리
요청이 오면 컨트롤러 매핑이 있는지 확인하고, 없으면 ResourceHttpRequestHandler클래스의
handleRequest 메소드에서 같은 클래스의 getResource 메소드를 호출한 뒤 응답하는 방식이다.
'Java & Spring' 카테고리의 다른 글
모의면접 복기 (2) - 가비지 컬렉션 Garbage Collection (0) | 2021.09.27 |
---|---|
문자열 유효성 검증 유틸 메소드 StringUtils.hasText(String) (2) | 2021.09.04 |
SpringBoot 로그 레벨 동적으로 변경하기 (runtime logging level change) (0) | 2021.06.12 |
SpringBoot에서 오라클 클라우드 Autonomous Databases 접속하기 (10) | 2021.05.19 |
Google OTP 인증 Java로 구현하기 (2) | 2021.01.24 |