본문 바로가기
개발 이야기/Springboot

Springboot에서 ResourceTransformer 적용하여 뷰 페이지 렌더링

by 농개 2024. 1. 7.
반응형
Springboot로 모놀리틱한 서비스(프론트+백엔드)를 구성하려고 할때
아래와 같은 코드는 정석적인 방법은 아닐 것 입니다.
아마도 보통은 Thymeleaf와 같은 뷰 템플릿 엔진 기술을 사용할 것입니다.

다음에 소개할 내용은 JSP나 Thymeleaf 사용 없이
순수 html,js,css 등을 렌더링 할 때 직면하는 문제 중 하나를 다룹니다.

 

Springboot로 정적 리소스를 렌더링 할 때

아래와 같이 WebMvc 관련 설정을 해주면 됩니다.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/views/**")
            .addResourceLocations("classpath:/views/")
            .setCachePeriod(0)
            .resourceChain(true)
            .addResolver(new PathResourceResolver())
        ;
    }
}

 

 

 

만약 root 페이지를 특정 정적 리소스를 표시하고 싶다면

아래와 같이 리다이렉트 해줍니다.

@Controller
public class ViewController {

    @GetMapping("/")
    public String redirect() {
        return "redirect:/views/main/index.html";
    }
}

 

그러면 간단한 프론트 페이지를 렌더링 할 수 있습니다.

 

여기서 특정 값이나 서버측 내용을

마치 템플릿 엔진을 사용하는 것처럼 프론트 페이지에 전달하고 싶을 수 있습니다.

 

가령 아래와 같은 페이지에서 ##CURRENT_ENV## 부분에 서버의 설정값을 표시하려고 합니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Hello World</title>
</head>
<body>
    <div>
        Hello World.
    </div>
    <script>
    var uri = '##CURRENT_ENV##'
    </script>
</body>
</html>

 

여기서 ResourceTransformer를 사용을 고려해볼 수 있습니다.

@Component
public class CustomResourceTransform implements ResourceTransformer {

    @Override
    public Resource transform(HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain) throws IOException {
        String resourceStr = IOUtils.toString(resource.getInputStream(), UTF_8);
        resourceStr = resourceStr.replace("##CURRENT_ENV##", "develop");

        return new TransformedResource(resource, resourceStr.getBytes());
    }
}

 

위와 같이 컴포넌트를 생성하고

원하는 서버측 값을 replace해주는 코드를 작성합니다.

 

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final CustomResourceTransform customResourceTransform;

    public WebMvcConfig(CustomResourceTransform customResourceTransform) {
        this.customResourceTransform = customResourceTransform;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/views/**")
            .addResourceLocations("classpath:/views/")
            .setCachePeriod(0)
            .resourceChain(true)
            .addResolver(new PathResourceResolver())
            .addTransformer(customResourceTransform) // 추가
        ;
    }
}

 

그리고 앞서 설정한 WebMvcConfig에 의존성 주입 및 registry에 추가해줍니다.

 

자, 이제 웹 브라우저를 통해 http://localhost:8080/views/main/index.html 로 접근하면

아래와 같은 결과를 확인 할 수 있습니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Hello World</title>
</head>
<body>
    <div>
        Hello World.
    </div>
    <script>
    var uri = 'develop'
    </script>
</body>
</html>

 

반응형