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를 사용해서 해결했다.!
'허브 살리기 프로젝트' 카테고리의 다른 글
TopN 구하기 (2) (1) | 2024.06.16 |
---|---|
TopN 구하기 (1) (1) | 2024.06.09 |
Spring Kafka Record 삭제하기 (1) | 2024.05.01 |
Spring Boot Warm Up (0) | 2024.04.17 |
Feign Client Connection Pool (1) | 2024.03.25 |