문제발생

야심차게 셀레니움으로 크롤링 기능을 만들고 HTML, JS 로 페이지도 만들고 CORS 문제도 해결했다.

테스트로 크롤링이 잘 되는지도 확인했고, 이미지도 잘 저장했고 응답값도 확인했으니 이제 렌더링만 하면 될 줄 알았다.

하지만 어떤 이미지는 보이고, 어떤 이미지는 불러오지 못하는 현상이 발생했다.

 

문제해결

문제 원인을 찾기 위한 여러가지 시도 끝에 안보이던 이미지는 서버 내렸다 다시 올리면 뜨는걸 보았다.

그래서 빌드 이전에 저장된 이미지는 잘 보이는데 빌드 이후 저장한 이미지는 불러오지 못하는거란 생각이 들었다.

이를 통해 스프링 동작 원리를 간단히 찾아보았다.

  • 스프링에서 정적 리소스는 빌드 타임에 결정된다.
  • 이미지 파일은 기본적으로 resource/static 을 root 로 인식하고 불러온다.
  • static 폴더에 빌드 이후 런타임에 동적으로 추가된 리소스는 기본적으로 인식하지 않는다.

 

따라서 리소스 핸들러를 적용하여 static 폴더 외부에서 이미지를 불러오도록 설정해줘야한다.

아래처럼 WebMvcConfigurer 에 리소스 핸들러를 추가해주면 된다.

WebConfig

경로 변수들을 yml 로 따로 빼서 환경변수 설정을 하여 사용하면 더 좋다.

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final static String ABS = "\\C:\\Users\\midcon\\Desktop\\my-molu-be\\download\\";

    private final CrawlingService crawlingService;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        Path imageAbsolutePath = Paths.get(crawlingService.DOWNLOAD_DIRECTORY).toAbsolutePath();
        // localhost:8080/images/image.jpg
        registry.addResourceHandler("/download/**")
            .addResourceLocations("file://" + ABS);
    }
}

 

 

+ Recent posts