본문 바로가기
Spring

[스프링 부트] 정적자원 디렉토리 등록하기 (WebMvcConfigurer)

by moca7 2024. 11. 5.

 

 

 

- 기본적으로 Spring Boot는 src/main/resources/static 디렉토리를 정적 자원의 기본 위치로 사용하지만, 다른 위치에 있는 정적 자원을 등록할 수 있다.

- WebMvcConfigurer를 구현하여 WebMvcConfigurer의 addResourceHandlers 메서드를 오버라이드하여 정적 자원의 경로를 추가할 수 있다.

 

 

 

 

 

ㅁ 기존 spring legacy project에서 views와 resources 가져오기

 

 

(1) spring legacy project에서 src/main/webapp/WEB-INF/views 폴더 안의 폴더들과 main.jsp를 복사한다.

 

 

 

- 저 7개의 파일을 STS4 패키지 익스플로러의 src/main/webapp/WEB-INF/views에 붙여넣기 한다.

(WEB-INF 폴더와 view 폴더는 따로 만들었었다.)

 

 

 

 

 

(2)  spring legacy project에서 src/main/webapp/resources 폴더 안의 images와 js 폴더를 복사한다.

 

 

- 저 2개의 폴더를 STS4 패키지 익스플로러의 src/main/resources/static에 붙여넣기 한다.

 

 

 

 

 

 

 

 

 

 

ㅁ 서버 start하고 메인 페이지(localhost:8888)를 가본다.

 

 

 

 

- 근데 왼쪽 상단에 로고 이미지가 깨져 있다.

개발자도구(f12) console에도 404가 떠있다. 저 이미지 파일을 못 찾고 있다. 

 

- 정적 자원들을 src/main/resources/static 폴더에 가져다 놨는데도 못찾고 있다.

 

 

 

 

 

 

 

- static 폴더에 가져다 놨는데도 이미지를 못 찾고 있는 이유는 스프링에서 가져온 header.jsp는 이미지 경로를 resources라는 경로로부터 찾고 있다.

- spring legacy project할 때는 src/main/webapp 폴더 안에 resources 폴더가 있었다. (resources 안에 images 폴더)

스프링 부트 프로젝트는 소스폴더인 src/main/resources안에 static 폴더가 있다. (static 안에 image 폴더)

- migration을 할 때 정적자원 경로를 재설정 해야 한다. (정적 자원 디렉토리 등록)

근데 일일이 찾아가서 바꾸기 번거로우니 한번에 어떤 요청이 왔을때 어떠한 곳으로 보내게 한다.

 

 

※ 만약 일일이 정적자원의 경로를 바꾼다면

- <a href="${contextPath == '' ? '/' : contextPath}"><img src="${contextPath}/images/goodee_logo.png" width="100px"> </a>

이렇게 contextPath를 수정하면 스프링에서의 정적자원 디렉토리 경로 재설정 없이 

스프링 부트 프로젝트의 src/main/resources/static/images 폴더 안의 goodee_logo.png 이미지가 보여진다.

 

 

 

 

 

- spring legacy project에서 정적자원 디렉토리 관련해서 servlet-context.xml에 등록했었다. 

거기서 resources 태그가 정적자원 디렉토리를 지정하는 태그였다.

 

- 스프링이었다면 servlet-context.xml에

<resources mapping="/resources/**" location="/classpath:static/" />를 등록하면 된다.

- 문제는 부트 프로젝트에서는 이런 xml파일이 없다. 

application.properties 파일이 아닌 별도의 환경설정 관련한 클래스를 만들어서 지정해줘야 한다.

 

 

 

 

 

 

 

ㅁ com.br.boot.config 패키지 생성

- 설정에 필요한 클래스가 있을 수 있다. 그걸 config 패키지에 둘 예정이다.

 

 

 

ㅁ WebMvcConfig 일반 클래스 생성

 

 
package com.br.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

 
  // 리소스 핸들링 등록을 할 수 있는 메소드 (servlet-context.xml의 <resources> 태그 설정 대신)
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
   
    // <resources mapping="/resources/**" location="classpath:/static/" />
    registry.addResourceHandler("/resources/**")
        .addResourceLocations("classpath:/static/");
   
  }
 
}

 

 

- 클래스명은 마음대로 해도 된다.

- WebMvcConfigurer를 implements 해야 한다.

 

- 타고 들어가서 addResourceHandlers 메소드를 복사해 온다.

접근제한자를 default에서 public으로 바꾼다.

- @Configuration 어노테이션을 붙인다.

 

 

 

 

※ WebMvcConfigurer

- 인터셉터 등록

- 리소스 핸들링(정적자원 경로)

- 뷰리졸버 세팅

- 메세지 변환 

등등의 구문을 작성할 수 있다.

대신 얘가 @Configuration 어노테이션이 붙은 클래스여야 한다.

 

 

 

 

 

 

ㅁ 서버 start

 

 

 

 

- 이러면 일일이 경로를 수정할 필요 없이 로고 이미지가 잘 보인다.

- 참고로 지금 다른 nav 바의 메뉴들을 눌러도 이동되지 않는다.

- db연동도 안되어있어서 로그인도 안된다.

 

 

 

 

====================================================================================

 

 

 

ㅁ WebMvcConfig

 

 

 

 
package com.br.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

 
  // 리소스 핸들링 등록을 할 수 있는 메소드 (servlet-context.xml의 <resources> 태그 설정 대신)
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
   
    // <resources mapping="/resources/**" location="classpath:/static/" />
    registry.addResourceHandler("/resources/**")
        .addResourceLocations("classpath:/static/");
   
 
    // <resources mapping="/upload/**" location="file:///upload/" />    
    registry.addResourceHandler("/upload/**")
        .addResourceLocations("file:///upload/");
  }
 
}
 

 

- upload 요청이 들어오면 외부 경로인 c드라이브 안에 있는 upload라는 폴더의 파일을 ~한다고 한 적이 있다.

- 여러개의 리소스 핸들링을 등록하고 싶으면 여기에 또 적으면 된다.

- 이것도 해준다.

 

- /로 시작하면 절대경로다. /는 URL에서 루트 경로를 의미한다.

애플리케이션의 루트 경로는 context path를 의미한다.

- context path를 통해 webapp 폴더 내의 파일을 접근할 수 있다.

(Spring Legacy Project나 일반적인 웹 프로젝트에서는 src/main/webapp이 애플리케이션 루트 디렉토리 역할을 하므로, 결과적으로 context path를 통해 webapp 폴더 내의 파일을 접근할 수 있다)

 

- 그런데 webapp에는 upload 폴더가 없다.

파일 업로드는 /upload/yyyyMMdd 경로에 해서 최종 저장은 C:\upload\yyyyMMdd에 된다.

- /upload/yyyyMMdd처럼 /로 시작하는 경로는 절대 경로다. 

Windows에서 이는 시스템의 루트 디렉터리, 즉 C 드라이브의 루트로 간주된다. 이 경로는 C:\upload\yyyyMMdd이다.

 

- /upload/** 요청이 들어오면 c드라이브에 있는 upload 폴더 안의 파일에 접근하게 한다.

 

'Spring' 카테고리의 다른 글

[스프링부트] 4.마이바티스 라이브러리 추가(연동)  (0) 2024.11.06
[스프링부트] 3. 패키지 안 클래스들 migration  (0) 2024.11.06
[스프링 부트] migration  (2) 2024.11.05
[스케줄러]  (2) 2024.11.05
[인터셉터]  (0) 2024.11.05