[Spring] jar 파일로 배포 시 이미지 경로 못 찾는 오류
나는 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("파일명");
나는 한 번에 경로를 잡아줄 수 있는 방법은 없을까 고민하게 되었고, 방법을 찾아냈다 !
애플리케이션 외부의 별도의 공간으로 설정해야 한다는 것이었다.
나는 WebMvcConfigurer의 addResourceHandlers() 메서드를 이용하여 경로를 잡아주었다.
@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 두 상황 모두 잘 돌아간다.
그리고 이미지 파일을 가져올 때마다 하나하나 파일 경로 잡아줄 필요 없이 한 번에 경로 설정을 해서 간편하게 사용할 수 있다!