본문 바로가기
Back/Spring Boot

[SpringBoot] 정적 리소스(Static Resources, img, js, css 파일 등)에 대한 접근 설정

by 은z 2021. 11. 29.

상황

이 포스팅은 Spring 에서 정적 자원들은 어떻게 접근할 수 있을까? 라는 궁금증에서 시작되었다.

 


실행환경 및 버전

  • JDK : open JDK 11
  • Spring Boot : 2.7.9

 

✔️기본 정적 리소스 위치

 

📌 Spring Boot는 별다른 설정 없이도 root를 기준으로 아래의 경로에서 정적 콘텐츠를 제공한다.

classpath:/static
classpath:/public
classpath:/resources/
classpath:/META-INF/resources

ex) “/hello.html”로 요청하면 /static/hello.html 리소스를 반환한다.

 

✔️새로운 정적 리소스 위치 추가하는 방법

 

기본 등록되어 있는 리소스는 유지한채 새롭게 리소스를 추가하려면 어떻게 해야할까?

 

📌WebMvcConfigurer를 구현하는 클래스에서 addResourceHandlers를 override하여 정적 리소스 핸들러를 커스터마이징할 수 있다.

이 방법을 사용하면 스프링 부트가 제공하는 정적 리소스 핸들러는 그대로 사용하면서 커스텀 핸들러가 추가된다.

 

@Configuration // 이 클래스는 Spring의 설정 클래스로 사용 
public class WebConfig implements WebMvcConfigurer {

    // properties 설정 파일에서 읽어온 업로드 위치를 저장할 변수 
    @Value("${upload.path}")
    private String uploadPath; // ex. C://usr/Application/example

    // 정적 리소스 핸들러를 추가하는 메서드 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
        String filePrefix = OSValidator.isWindows() ? "file:///" : "file:";
        
        registry.addResourceHandler("/attach/**") // "/attach/**" 경로로 들어오는 모든 요청을 처리하기 위한 리소스 핸들러 등록 
                .addResourceLocations(filePrefix + uploadPath + "/"); // 파일 시스템에서 실제 이미지 리소스를 찾을 경로 설정 
    }
}

 

 

👉"/attach/" 경로로 요청이 들어오면 서버의 파일 시스템에서 uploadPath 변수에 지정된 디렉토리에서 정적리소스(파일)을 찾아서 반환하도록 설정하는 코드이다.

  1. registry.addResourceHandler("/attach/**")
    1. "/attach/"로 시작하는 모든 요청에 대해 이 핸들러가 작동하도록 설정
    2. 클라이언트가 "/attach/파일명"과 같은 URL로 이미지를 요청하면 이 핸들러가 그 요청 처리
  2. addResourceLocations(filePrefix + uploadPath + "/")
    1. 실제 파일 시스템에서 해당 정적 리소스를 찾을 경로를 설정하는 부분
    2. 여기서 uploadPath는 @Value("${upload.path}")로 주입받은 업로드 위치를 나타내는 변수 (예시. C://usr/Application/example)
    3. uploadPath 하위에 실제 디렉토리 경로로 연결하여 해당 디렉토리에서 리소스를 찾을 수 있도록 설정

 

 

 

view단

아래 사용 예시는 /attach/ 으로 호출하는 자원을 찾는다.

따라서 C://usr/Application/example/popup/이미지이름.jpg 으로 찾아서 view에 뿌려준다.

<img src="/attach/popup/이미지이름.jpg" />

 

댓글