토이 프로젝트 기록-정적 리소스 업로드

이미지 업로드

토이 프로젝트를 진행하던 중 난관에 부딪혔다. 내 기획대로라면 웹에서 사용자가 이미지 파일을 업로드하면, 메인에 업로드한 이미지 파일이 상품으로써 등록되어야 한다. 그래서 타임리프를 이용하여 메인 view에 src를 수정하여 새로 업로드된 파일의 경로를 가리키게 했는데, 계속해서 엑박만 떴다.

처음에는 src 문법 등이 잘못된줄 알았는데, 인터넷을 뒤지다 보니 정적 리소스는 서버를 재시작하지 않으면 등록되지 않는다고 한다. 생각해보면 맞는 말이다.
서버에는 빌드된 결과물이 올라가는데, 그 상태에서 프로젝트 디렉토리에 정적 리소스 파일이 추가되도 서버에서는 인식을 하지 못하는 것이다.
이에 대한 해결책을 찾던 도중 ResourceHandler를 사용하면 해결이 가능하다는 사실을 알아냈다. ResourceHandler를 사용하면 기존에 WAS의 DefaultServlet에서 처리하던 정적 리소스 요청을 그보다 상위 권한으로 받아와 처리할 수 있게 된다. 코드는 다음과 같다.

@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                        .addResourceLocations("file:src/main/resources/static/");
    }
}

WebMvcConfigurer를 상속받아 오버라이드하여 사용하는데, “/**“으로 온 모든 정적 리소스 요청을 addResourceLocations()의 경로에서 찾겠다는 뜻이다.
이렇게 하면 내가 원했던 대로 업로드한 파일의 경로를 서버에 요청하면, 해당 요청을 DefaultServlet 이전에 ResourceHandler가 높은 우선순위로 가로채서, 프로젝트의 디렉토리를 뒤져 원하는 파일을 찾아 반환해준다.

리소스 업로드

내가 업로드 한 이미지를 웹에 바로 띄워주는 것을 확인할 수 있다.(사진은 내 스파6 전적..ㅎㅎ)

다행히 해결책을 어떻게든 찾았지만 스프링과 스프링 부트는 정말 깊이있고 어려운 것을 다시 한번 느낀 것 같다. 로컬 환경에서, 서버 환경에서 작동이 다 다르고 스프링에 스프링 부트까지 배워야 하니 배울게 많은 것 같다. 그래도 지금처럼 하나씩 배워가며 문제 해결력을 높이는 것은 분명 의미가 있을 것이라 생각한다.