[Spring Boot] 이미지 파일 경로 외부에 설정하기 with yml

2019. 7. 31. 18:47Spring/Basic

300x250
반응형

실서버에서 배포하여 실행중인 웹 애플리케이션 상에서, 웹 사이트에 접속하여 파일 및 이미지 업로드를 실시할때, 이미지 업로드 경로를 웹 애플리케이션 내부로 설정할 경우
(예를 들면 웹애플리케이션 정적 파일 저장 위치(css, js, img 폴더가 위치하는 곳) 내부)

새로 웹 애플리케이션을 배포할시, 실행중에 추가했던 이미지 파일들이 없어지는 현상이 발생합니다.

웹 애플리케이션 상에서 별도로 추가하는 이미지 파일은 웹 애플리케이션 내부에 위치한 정적폴더 위치가 아닌, 별도의 공간에 저장되도록 설정해야 합니다.

이번 포스팅에서는 spring boot 기반의 웹 애플리케이션 서버 실행 중 저장되는 이미지 파일을 특정 폴더 경로에 저장되도록 설정하는 방법을 알아봅니다.

그러기 위해서 필요한 것은?

  1. profile별(local, staging, prod 등...) 이미지 파일 저장 위치를 property파일에 설정하기
  2. 이미지 파일 저장시, property에 설정한 path를 불러들여서 해당위치에 저장하기
  3. 저장한 이미지 파일을 url을 통해 열어볼 수 있도록 하기 위해, url pattern 과 리소스 위치를 연결하기

1. 경로 설정 (yaml)

yml또는 properties 파일에 이미지파일을 저장할 폴더 경로를 설정합니다.
각 환경별로 이미지 업로드 경로가 다를 수 있기 때문에, class 파일에 직접 작성하는 것 보다, 프로퍼티에 작성 한후, 주입받는 방식으로 하는 것이 좋습니다.

custom:
  path:
    upload-images: '/var/lib/jenkins/area_deploy/jiniworld/upload-images/'

2. Url과 Resource 연결하기

WebMvcConfigurerAdapter 를 상속받은 Config 파일에 url과 리소스 연결한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

  private final String uploadImagesPath;

  public WebConfig(@Value("${custom.path.upload-images}") String uploadImagesPath) {
    this.uploadImagesPath = uploadImagesPath;
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
      .addResourceLocations("classpath:/META-INF/resources/");

    List<String> imageFolders = Arrays.asList("email", "etc");
    for(String imageFolder : imageFolders) {
      registry.addResourceHandler("/static/img/" +imageFolder +"/**")
        .addResourceLocations("file:///" + uploadImagesPath + imageFolder +"/")
        .setCachePeriod(3600)
        .resourceChain(true)
        .addResolver(new PathResourceResolver());
    }
  }
}

ln 1 : @Configuration 애너테이션을 붙여 이 class 파일이 구성 파일임을 선언합니다.
ln 6 : @Value 를 통해 application.yml 에 설정한 이미지업로드 경로에 관한 프로퍼티 값을 가져옵니다.
ln 17-18 : addResourceLocations에 url 경로를 설정하고, addResourceLocations에 매핑될 리소스 위치를 설정합니다. (경로 앞에 file:/// 을 반드시 붙여줘야 합니다.)

http://호스트주소:포트/static/img/email/title.pngfile:////var/lib/jenkins/area_deploy/jiniworld/upload-images/email/title.png

즉, /static/img/email/ 나, /static/img/etc/ 로 시작되는 url pattern 은 일반적인 정적파일 경로가 아닌 우리가 별도로 설정한 파일 업로드 경로인 /var/lib/jenkins/area_deploy/jiniworld/upload-images/ 폴더 내에 있는 리소스를 가리키도록 하는 것입니다.


제 프로젝트의 정적 파일 위치는 아래와 같습니다.

20

기본 이미지 정적 파일의 저장 경로는 classpath:/static/img 이며,
http://api.jiniworld.me/static/img/like.png 와 같은 형태로 접근할 수 있습니다.


21

직접 설정한 이미지 파일 업로드 경로/email 에 저장한 title.png 파일도 같은 url 패턴으로 접근할 수 있습니다.
http://api.jiniworld.me/static/img/email/title.png


만일, /static/img/email, /static/img/etc 외에 다른 폴더도 정의하고 싶다면 ln 15에 더 추가하면 됩니다.

경로를 계속해서 추가하고 싶지 않다면 /static/img/res/를 추가하고, email이나 etc와 같은 폴더를 res 하위에 위치시켜도됩니다.


++ 키워드

  • spring boot에서 이미지파일 경로 외부에 설정하기
  • 이미지파일 경로 웹 애플리케이션 외부에 설정하기
  • 리소스 경로 yml 에 정의하기
  • property에 파일업로드 경로 설정
  • addResourceLocations
300x250
반응형
  • 프로필사진
    부트넘모어려웡2020.09.18 17:13

    webconfig에 설정을 저런식으로 하고 다른 자바 파일에서 업로드 할 때 저 경로(uploadimagespath)는 어떻게 가져와야 하나요 ㅠㅠ

    • 프로필사진
      Favicon of https://blog.jiniworld.me BlogIcon jiniya222020.09.21 02:03 신고

      @Value 애너테이션을 이용하면 프로퍼티(application.yml)에 설정한 값을 쉽게 읽어들일 수 있습니다.

      단, 주의할 사항은 자바파일이 @Bean 객체로 등록되어있어야 한다는 점입니다.

      @Bean 객체의 예로는 @Controller, @Service, @Component, @Configuration 애너테이션을 설정한 클래스 객체가 있습니다.

      프로퍼티에 설정한 값을 다른 클래스(자바파일)에서 읽어들이는 자세한 사항은 `https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config` 문서를 참고해주세요.