본문 바로가기
Project Trouble Shooting/[Dotoring] 멘토링 어플리케이션

왜? 이미지가 찾아지지 않는 걸까?? - 로컬환경에서 외부 경로를 이용

by Big Sun 2023. 8. 21.
728x90

 

도토링 프로젝트의 프로필 이미지 수정 기능을 개발하다가 아래와 같은 문제상황을 만나 의미있는 문제 상황이어서 포스팅하려 합니다.

 

문제 상황

현재 상황은 아래와 같습니다.

 

 

resources/static/files 안에 default_profile~~ 이미지가 저장되어 있습니다.

 

 

빌드후 애플리케이션을 실행한 후 해당 이미지가 저장된 경로로 조회하면, 위와 같이 이미지가 잘 조회되는 것을 확인할 수 있습니다.

 


하지만, 아래와 같이 새로운 이미지를 아까와 동일한 경로에 업로드하면 해당 이미지는 조회가 되지 않습니다.

 

 

아래와 같이 이미지는 잘 저장이 된 상태입니다.

 

 

 

그렇다면, 실행 중인 애플리케이션을 빌드 -> 실행한 후 조회를 해보면 어떨까?

 

놀랍게도 조회가 잘 되는 것을 확인할 수 있습니다.

 


문제 분석

 

눈치 채신 분들도 있겠지만, resources/static 하위에 있는 이미지들은 build된 폴더 아래에 있어야 조회가 가능합니다.

 

 


위 사진을 보면, src/main/resources 폴더 하위에 파일들이 생성된 것을 확인할 수 있습니다.

하지만, build/resources/main/static/files 폴더 아래에는 파일들이 생성되지 않은 것을 확인할 수 있습니다.

 

결론

 

빌드 결과물(JAR 또는 WAR 파일)에는 src/main/resources/static 디렉토리의 이미지 파일이 포함됩니다. 애플리케이션 실행 중에는 이 파일들만 내장 웹 서버를 통해 제공됩니다.

따라서, 런타임 중에 src/main/resources/static에 새로운 이미지 파일을 추가하거나 기존 파일을 변경해도, 이러한 변경 사항은 자동으로 빌드 폴더에 반영되지 않습니다.

 

여기서 "빌드"란, 소스 코드를 컴파일하고 필요한 라이브러리를 포함하여 실행 가능한 형태로 패키징하는 과정을 의미합니다. 이 과정에서 src/main/resources/static 디렉토리에 있는 파일들이 JAR 또는 WAR 파일에 포함됩니다. 따라서, 애플리케이션이 실행될 때는 이 빌드된 패키지 내의 파일들만 사용할 수 있습니다.

핵심은 JAR 파일로 실행되는 애플리케이션이 빌드된 패키지 내의 파일들만 조회할 수 있다는 점입니다. 런타임 중에 소스 디렉토리에 변경된 파일은 자동으로 반영되지 않기 때문에, 변경사항을 적용하려면 다시 빌드해야 합니다.

 
 

 

 

하지만, 매번 빌드를 하는 것은 말이 되지 않습니다.


해결방법 - 외부 경로 이용

해결방법은 간단합니다.

즉, src/main/resources/static 경로 내에 해당 이미지를 저장시키는 것이 아니라 src 외부 경로에 저장을 시키는 것입니다.

 


위 사진은 정적 리소스에 대한 경로를 정의하고 있습니다.

  • classpath는 빌드한 결과의 resources 디렉토리(ex. build/resources)를 의미
  • file 은 말 그대로 파일 시스템 아래에 위치한 디렉토리를 의미


기본으로 정의된 정적 리소스 경로들은 모두 build된 결과들에 접근하고 있습니다.

 

따라서, 이미지 파일의 변경사항을 조회하려면, 파일 시스템 즉 file로 된 경로를 추가해줘야합니다.



따라서, 이미지를 조회할 때 사용되는 경로를 정의하는 FileUtils라는 클래스의 fileDir을 아래와 같이 수정해줍니다.

public class FileUtils {

	private static final String fileDir = rootPath + "/src/main/resources/image/";
	...

}

 

다음으로, addResourceHandlers 메서드를 오버라이드 하여 이미지를 조회하는 URL 경로에 매핑되는 파일 시스템의 경로를 지정해줍니다.

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:src/main/resources/image/")
                ;
    }
}



이제 image/**  URL을 사용하여 특정 이미지를 조회하면, 애플리케이션 실행 도중에 이미지가 잘 조회되는 것을 확인할 수 있습니다.


 

 

 

감사합니다!

728x90