본문 바로가기
허브 살리기 프로젝트

로컬에서만 Spring Boot에서 HTML Resource 파일이 제공 가능 했던 이유

by jay-choe 2024. 5. 2.

Restdocs 설정을 하고 생성 된 HTML이 src/main/resources/static 경로에 존재하면 해당 파일명으로 GET 요청을 날렸을 때

정적 파일이 서빙 되는 줄 알았다.

 

물론 로컬에서는 해당 경로에 존재하면 정상적으로 정적 파일이 제공이 되는데 빌드 된 파일로 서버에 띄우게 되면 리소스를 찾지 못하는 문제가 있었다.

 

먼저 리소스 관련 HTTP 요청 처리 과정을 보면

 

HTTP 요청을 할 때 해당 요청 경로를 담당하는 컨트롤러가 없으면

ResourceHttpRequestHandler 의 handleRequest를 타고 가는데 여기서 getResource 함수에서 리소스를 가져오게 된다.

 

 

파싱하는 코드들을 지나서 리소스를 가져오는 부분은 해당 부분이다.

resolverChain.resolveResource(request,path, getLocations());

 

인자로 넘기는 getLocations에서는 디버깅에서 확인해보면

 

다음 5개의 리소스 경로를 제공하는데, 이 경로 안에 있는 리소스 파일이 아니면 찾지 못하게 된다.

 

 

 

결론을 내리면 빌드 된 파일은 해당 경로에 정적 파일이 존재하지 않아서 제공할 수 없는 것이다.

 

그러면 왜 로컬에서 빌드 된 결과물은 정적 파일이 제공이 되는 것일까?

 

먼저 로컬에서 서버를 띄우고 클래스 패스를 체크했다.

 

클래스 패스로 잡히는 부분은 IDE가 자동으로 설정해주는 것 같다.

 

RootProject/build/resources/main 경로로 잡히는 것을 확인할 수 있었으며

해당 경로에는 resource 라는 폴더가 없고 바로 static 폴더가 있고 그 안에 리소스 파일들이 있었다.

 

결론적으로는 IDE에서 자동적으로 잡아준 클래스 패스 덕분에 리소스를 제공할 수 있었던 것이다.

 

그렇기 때문에 서버에서 파일을 제공하기 위해서는 사용 할 정적 파일을

getLocations 함수에서 포함하고 있는 경로로 필요한 정적 파일들을 넣어주면 된다.

 

이는 사용하는 빌드 도구를 통해서 Copy 하는 등의 방법으로 해결할 수 있을 것이다.

 

나는 copy를 사용해서 해결했다.!