Spring🌱/트러블슈팅

[spring boot] 이미지 파일 업로드 서버 재시작 해야 보이는 오류 해결-프로젝트 외부 경로 파일 가져오기

전감자(◔◡◔) 2024. 10. 18. 17:54

최근 프로젝트 진행 중 파일 업로드를 구현해야 하는 작업이 있었다.

그러나 파일이 /static 폴더 아래에 저장이 되긴 하는데

html 파일에서 이미지를 불러오기 위해서는 서버를 재시작 해야한다는 엄청난 문제에 직면하고 말았음

 

로컬에서 하는 거라면 상관 없겠지만 배포하고 난 후에 서버를 계속 재시작 한다는 건 말이 안되는 상황

따라서 이를 해결할 방법을 찾아야 했다.

원인

이미지는 static폴더안에 넣게 되는데 static이 말그대로 정적파일들을 넣는곳으로 인식이돼서

서버를 껐다가 켜야지 static 폴더안에 사진의 주소가 제대로 반영이 돼서 사진들이 보인다.

짧게 말하면 사진을 올리고 서버를 꼭 껐다가 켜야만 사진이 보임!

= devtools 망치 누르고 나서 사진이 보임

이미지 폴더가 프로젝트 폴더 안에 있을 때

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry .addResourceHandler("/img/**") .addResourceLocations("file:/C:/Users/YB/Desktop/onkyeong(1)/onkyeong/src/main/resources/static/img/"); } }

이렇게 WebMvcConfigurer 를 implementes 한 WebConfig 클래스를 만들어주고

ResourceHander 를 등록해주면 된다!

이 때 addResourceLocations 에는 file:/ + 절대 경로가 와야함

서버 배포 후 /home/ubuntu/image 아래에 있는 이미지를 불러와야 할 때

@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry .addResourceHandler("/image/**") .addResourceLocations("file:///home/ubuntu/image/");

배포 할 땐 이런식으로 해주면된다.

주의 할 점은

1.반드시 맨 뒤에 /를 붙여야 한다는 점

2.static 폴더에 이미지가 저장되는 폴더 이름과 ubuntu 폴더 아래에 이미지 폴더 이름을 같은 이름으로 설정하지 말 것

<img class="rectangle-8" th:src="@{/image/{photo}(photo=${warehouse.photo.originalName})}">

th:src 굳이 안하고 (thymeleaf) 그냥 src 써도 상관없다 ex) src="/image/example.png"

처음에 static 폴더 아래 이미지가 저장되는 폴더랑 서버에 있는 이미지가 저장되는 폴더이름을 똑같이 설정해줬더니

정적 폴더로 인식해서 이미지 못가져옴

아무튼 이렇게 하면 이미지 불러오는게 가능해진다

아래는 내가 참고한 블로그들인데 더욱 자세하게 설명되어 있다.

https://herongmirong.tistory.com/135

 

spring project 안에 저장한 사진 바로 로딩 안될때 해결 (feat. ResourceHandlerRegistry)

이미지 폴더가 프로젝트 폴더 밖에 있을 때 플젝 폴더 밖에 있을 때는 사실 크게 문제 될 건 없다. 꼭 이렇게 안 해도 된다. 그냥 자바 코드에서 주소를 바로 넣어도 됐었다. 그리고 보통 사진이

herongmirong.tistory.com