ResourceHttpRequestHandler는 Spring Framework에서 제공하는 클래스 중 하나로, 정적 리소스 요청을 처리하는 데 사
용됩니다.
이 클래스는 주로 정적 파일(HTML, CSS, JavaScript, 이미지 등)을 제공하기 위한 컨텍스트에서 사용됩니다.
아래는 ResourceHttpRequestHandler를 사용하는 예제입니다
예제: 정적 리소스 제공
1. 기본 설정
Spring에서 정적 리소스를 제공하려면 기본적으로 ResourceHttpRequestHandler가 이미 사용되고 있습니다.
(맨 아래 부분에서 이에 대한 설명이 있음)
보통 application.properties나 Java Config로 정적 리소스를 설정합니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// ResourceHandlerRegistry는 ResourceHttpHandler를 이미 사용하고 있다.
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCachePeriod(3600); // 캐시 시간 (초 단위)
}
}
위 설정을 통해 /static/** 경로로 요청되는 정적 리소스가 classpath:/static/ 디렉터리에서 제공됩니다.
이 코드에서 ResourceHttpRequestHandler의 역할
- 핸들러 등록
addResourceHandlers 메서드 내부에서 registry.addResourceHandler를 호출하면, Spring MVC는 해당 경로 패턴(/static/**)을 처리할 핸들러로 ResourceHttpRequestHandler를 자동으로 등록합니다.- 이 핸들러는 /static/** 경로의 요청을 처리하며, 리소스를 응답으로 반환합니다.
- 리소스의 실제 위치는 addResourceLocations("classpath:/static/")로 지정된 곳에서 찾습니다.
- 리소스 읽기
ResourceHttpRequestHandler는 요청된 URL 경로를 분석하여 지정된 리소스 위치(classpath:/static/)에서 해당 리소스를 찾습니다.- 예: 요청 URL이 /static/images/logo.png라면, ResourceHttpRequestHandler는 classpath:/static/images/logo.png를 찾아 클라이언트로 반환합니다.
- 캐시 설정 처리
.setCachePeriod(3600)은 클라이언트가 리소스를 캐시할 수 있는 시간을 초 단위로 설정합니다.- ResourceHttpRequestHandler는 이 설정에 따라 HTTP 응답 헤더에 Cache-Control과 같은 캐시 제어 헤더를 추가합니다.
- 응답 처리
핸들러는 요청된 리소스를 찾아 HTTP 응답으로 반환하며, 파일이 없으면 404 에러를 반환합니다.
ResourceHttpRequestHandler의 동작 흐름
- 경로 매핑
요청 URL이 /static/**에 매핑되면 ResourceHttpRequestHandler가 호출됩니다. - 리소스 로드
핸들러는 ResourceHttpRequestHandler가 제공하는 setLocations에서 정의된 위치(classpath:/static/)를 기준으로 리소스를 찾습니다. - 캐시 처리 및 응답
요청된 리소스가 존재하면, 핸들러는 설정된 캐시 정책(setCachePeriod)에 따라 응답 헤더를 추가하고 리소스를 반환합니다.
요약
ResourceHttpRequestHandler는 정적 리소스를 처리하기 위해 Spring MVC가 제공하는 기본 핸들러로,
- 정적 파일을 요청 경로에 따라 매핑된 위치에서 찾고,
- 클라이언트로 반환하며,
- 캐시 관련 설정도 관리하는 역할을 합니다.
위 코드에서 addResourceHandlers는 이 핸들러의 동작을 간접적으로 설정하는 역할을 합니다.
2. 커스텀 ResourceHttpRequestHandler 사용
특정 요구 사항에 따라 직접 ResourceHttpRequestHandler를 Bean으로 등록하거나 커스터마이징할 수도 있습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import java.util.Collections;
@Configuration
public class CustomResourceConfig {
@Bean
public ResourceHttpRequestHandler customResourceHttpRequestHandler() {
ResourceHttpRequestHandler handler = new ResourceHttpRequestHandler();
handler.setLocations(Collections.singletonList(new org.springframework.core.io.ClassPathResource("custom-resources/")));
handler.setCacheSeconds(3600); // 캐시 설정
return handler;
}
}
3. 컨트롤러에서 직접 사용
ResourceHttpRequestHandler를 Spring MVC 컨트롤러에서 직접 호출하여 리소스를 반환할 수도 있습니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import javax.servlet.http.HttpServletRequest;
@Controller
public class CustomResourceController {
@Autowired
private ResourceHttpRequestHandler customResourceHttpRequestHandler;
@GetMapping("/custom-resource/**")
public ResponseEntity<Resource> handleCustomResource(HttpServletRequest request) throws Exception {
// 요청된 경로에서 파일을 로드
customResourceHttpRequestHandler.handleRequest(request, null);
return ResponseEntity.ok().build();
}
}
정리
- 기본적으로 Spring Boot와 Spring MVC에서는 정적 리소스 제공을 자동으로 설정합니다.
- 추가적인 커스터마이징이 필요한 경우 ResourceHttpRequestHandler를 명시적으로 구성하거나 직접 컨트롤러에서 사용할 수 있습니다.
- 설정 파일 위치(classpath:/static/, classpath:/public/ 등)를 정확히 지정해야 올바르게 동작합니다.
추가 지식
ResourceHttpRequestHandler
정적 리소스를 처리하는 작업을 담당한다.
유연한 캐시설정을 허용해서 브라우저 성증에 최적화된 정적 리소스를 제공한다.
요청에 대한 리소스가 있는지 확인한 후 처음으로 요청된 리소스인 경우 Expires와 헤더와 함께 리턴한다.
Cache-Controll, Last-Modified를 적절하게 평가해서 이미 캐시한 리소스에 대해 불필요한 오버헤드를 방지한다.
/static, /public, /resources, /META-INF/resources
디렉터리에 있는 정적컨텐츠를 사용한다.
출처: https://tweety1121.tistory.com/entry/Spring-ResourceHttpRequestHandler [Pli's 개발일기:티스토리]
'Springあるある' 카테고리의 다른 글
원하는 기능을 Annotation을 만들어서 활용하기(Feat. ArgumentResolver,Login, @Login) (0) | 2025.01.17 |
---|---|
HandlerMethod 인터페이스(Feat. @RequestMapping,ResourceHttpHandler,preHandle()) (0) | 2025.01.17 |
스프링 인터셉터(FEAT. Spring Interceptor) (0) | 2025.01.17 |
Logback MDC(Feat. LogFilter,Filter) (0) | 2025.01.16 |
서블릿 필터의 사용 예시(Feat. Filter) (0) | 2025.01.16 |