Spring

[Spring] jar 파일로 배포 시 이미지 경로 못 찾는 오류

호강하는 지해 2024. 11. 12. 11:18
728x90

나는 jar 파일로 배포를 했기에 내장톰캣으로 서버를 실행시켰다.

내장톰캣을 사용한 덕분에 복잡한 톰캣 설정할 필요 없이 main() 메서드를 실행시켜 아주 간단하게 톰캣을 실행시킬 수 있었다. (톰캣도 따로 설치하지 않아도 됨)

 

 

문제

나는 이미지 파일을 src/main/resources/static 경로에 저장을 해두었고, js에서 이미지 파일의 경로를

src="/image/loading-bar.gif"

이렇게 잡아두었었다.

그러나 분명 로컬에서는 잘 받아오던 이미지 파일 경로를 배포를 하면 못 잡는 것이었다.

 

404 Not Found 오류를 만났었다. 정적 파일 요청이다보니 요청 URL이 localhost:8081/image/loading-bar.gif 이런식으로 들어가고 있었다.

 

 

 

 

해결 방법

주변에 자문을 구해 파일을 읽고 스트림으로 파일 내용을 가져오는 방법을 추천 받았지만, 파일 가져올 때마다 이 코드를 쓰자니 너무 번거롭다는 생각이 들었다. (바로 밑 예제 코드)

InputStream in = getClass().getClassLoader().getResourceAsStream("파일명");

 

 

 

나는 한 번에 경로를 잡아줄 수 있는 방법은 없을까 고민하게 되었고, 방법을 찾아냈다 !

애플리케이션 외부의 별도의 공간으로 설정해야 한다는 것이었다.

 

 

나는 WebMvcConfigureraddResourceHandlers() 메서드를 이용하여 경로를 잡아주었다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/image/**")
                .addResourceLocations("classpath:/static/image/");
    }
}

1️⃣ addResourceHandlers()
Resource를 요청하기 위한 기본 URL-Pattern을 입력한다. /아래로 모든 Resource 요청을 받는다.


localhost:8081/image/loading-bar.gif 이런식으로 요청이 들어왔었으니 /image로 들어오는 모든 요청에 경로를 잡아주기 위해서 /image/**
를 써주었다.

 

 

2️⃣ addResourceLocations()

: 실제 리소스가 존재하는 외부 경로 지정

구글링을 했을 때 나처럼 classpath: 대신 file:을 쓰는 분도 계셨는데, 나는 classpath:를 써야만 파일 경로가 잡혔다.

프로젝트 내부의 정적 리소스를 제공하려면 classpath:를, 서버 외부의 특정 경로에 있는 파일을 제공하려면 file:을 사용한다고 한다.

 

 

 

 

 

이렇게 해주면 localhost8081:/image/testImage.jpg와 같은 요청이 들어왔을 때 static/image/testImage.jpg 경로에 있던 이미지 파일을 잘 찾아준다. 결국 Local과 jar 두 상황 모두 잘 돌아간다.

그리고 이미지 파일을 가져올 때마다 하나하나 파일 경로 잡아줄 필요 없이 한 번에 경로 설정을 해서 간편하게 사용할 수 있다!

 

 

 

 

 

 

728x90