본문 바로가기

Springあるある

ResourceHttpRequestHandler(Feat. 정적 리소스, static resource)

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의 역할

  1. 핸들러 등록
    addResourceHandlers 메서드 내부에서 registry.addResourceHandler를 호출하면, Spring MVC는 해당 경로 패턴(/static/**)을 처리할 핸들러로 ResourceHttpRequestHandler를 자동으로 등록합니다.
    • 이 핸들러는 /static/** 경로의 요청을 처리하며, 리소스를 응답으로 반환합니다.
    • 리소스의 실제 위치는 addResourceLocations("classpath:/static/")로 지정된 곳에서 찾습니다.
  2. 리소스 읽기
    ResourceHttpRequestHandler는 요청된 URL 경로를 분석하여 지정된 리소스 위치(classpath:/static/)에서 해당 리소스를 찾습니다.
    • 예: 요청 URL이 /static/images/logo.png라면, ResourceHttpRequestHandler는 classpath:/static/images/logo.png를 찾아 클라이언트로 반환합니다.
  3. 캐시 설정 처리
    .setCachePeriod(3600)은 클라이언트가 리소스를 캐시할 수 있는 시간을 초 단위로 설정합니다.
    • ResourceHttpRequestHandler는 이 설정에 따라 HTTP 응답 헤더에 Cache-Control과 같은 캐시 제어 헤더를 추가합니다.
  4. 응답 처리
    핸들러는 요청된 리소스를 찾아 HTTP 응답으로 반환하며, 파일이 없으면 404 에러를 반환합니다.

ResourceHttpRequestHandler의 동작 흐름

  1. 경로 매핑
    요청 URL이 /static/**에 매핑되면 ResourceHttpRequestHandler가 호출됩니다.
  2. 리소스 로드
    핸들러는 ResourceHttpRequestHandler가 제공하는 setLocations에서 정의된 위치(classpath:/static/)를 기준으로 리소스를 찾습니다.
  3. 캐시 처리 및 응답
    요청된 리소스가 존재하면, 핸들러는 설정된 캐시 정책(setCachePeriod)에 따라 응답 헤더를 추가하고 리소스를 반환합니다.

요약

ResourceHttpRequestHandler는 정적 리소스를 처리하기 위해 Spring MVC가 제공하는 기본 핸들러로,

  1. 정적 파일을 요청 경로에 따라 매핑된 위치에서 찾고,
  2. 클라이언트로 반환하며,
  3. 캐시 관련 설정도 관리하는 역할을 합니다.

위 코드에서 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 개발일기:티스토리]