Programming/Spring Boot

Spring Boot 프로젝트 외부 경로 파일 접근하기 addResourceHandlers

Jan92 2021. 8. 30. 22:39
반응형

addResourceHandlers

 

Spring Boot 프로젝트 외부 경로에 있는 파일 접근하기 addResourceHandlers

 

 

실서버에서 배포하여 실행중인 웹 애플리케이션 상에서 웹 사이트에 접속하여 파일 및 이미지 업로드를 실시할 때, 이미지 업로드 경로를 웹 애플리케이션 내부로 설정할 경우 새로 웹 애플리케이션을 배포할 시 실행 중에 추가했던 이미지 파일들이 삭제되는 현상이 발생합니다.

 

 

/tmp

스프링 부트 프로젝트 실행 시 따로 서버를 설정하지 않은 경우 spring boot 내부 톰캣 서버가 작동되는데, 이 서버가 실행되면서 /tmp 폴더 아래에 해당 서버에 대한 데이터를 하나의 폴더로 저장했습니다.

그리고 새로 구동할 때마다 새로운 폴더를 만들어서 이전에 구동했던 데이터가 담긴 폴더는 무시되고 새로 생성된 폴더에서만 해당 서버의 데이터를 읽었습니다. 

 

처음에는 임시 방편으로 이전 폴더에 담긴 파일을 그대로 복사해서 붙여 넣는 방법을 사용해봤으나, 서버를 재실행하지 않더라도 일정 기간이 지나면 구동 중인 서버의 데이터를 담은 폴더가 삭제되는 것을 확인했습니다.

(정확한 원인은 모르지만 서버의 캐시가 초기화되며 데이터가 사라지지 않았을까 예측합니다.)

 

 

* 결론은 실서버 운영시 이미지등의 파일 업로드의 경로는 웹 애플리케이션 외부의 별도의 공간으로 설정해야 한다는 것입니다.

 

 


 

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private String connectPath = "/imagePath/**";
    private String resourcePath = "file:///home/uploadedImage";

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(connectPath)
                .addResourceLocations(resourcePath);
    }
}

WebConfig.class

 

 

WebMvcConfigurer interface를 상속받아 addResourceHandlers method를 오버 라이딩하고 리소스 등록 및 핸들러를 관리하는 객체인 ResourceHandlerRegistry를 통해 리소스의 위치와 리소스와 매칭 될 url을 설정합니다.

 

  • addResourceHandler : 리소스와 연결될 URL path를 지정합니다. (클라이언트가 파일에 접근하기 위해 요청하는 url)
    localhost:8080/imagePath/** 

  • addResourceLocations: 실제 리소스가 존재하는 외부 경로를 지정합니다.
    경로의 마지막은 반드시 " / "로 끝나야 하고, 로컬 디스크 경로일 경우 file:/// 접두어를 꼭 붙여야 합니다.

 

이렇게 설정하면 클라이언트로부터 http://호스트 주소:포트/imagePath/testImage.jpg 와 같은 요청이 들어 왔을 때 /home/uploadedImage/testImage.jpg 파일로 연결됩니다.

 

 

 

 

* connectPath, resourcePath

의 경우 예시를 위해 class 내부에 바로 선언했지만 실제 개발에서는 .properties 또는 .yml을 통해 개발 환경에 따른 경로를 작성하고 주입받아서 사용하는 것이 좋습니다.

 

 

 

 

addResourceHandlers

addResourceHandler("/imageUpload/**").addResourceLocations("file:///home/");

 

실제 프로젝트를 배포한 linux 서버에서 다음과 같이 설정하여 이미지를 불러오는 모습입니다.

반응형