Spring๐Ÿƒ

Spring์—์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ •์  ์ž์›์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ์ตœ์ ํ™” ์ „๋žต

wannaDevelopIt 2025. 6. 13. 11:25
728x90

@ControllerAdvice ๋ฐ ResourceHandlerRegistry๋ฅผ ํ™œ์šฉํ•ด Resolver ๋ฒ„์ „์„ ์ž๋™ ๊ด€๋ฆฌ

ํ”ํžˆ ์Šคํ”„๋ง์œผ๋กœ view๊นŒ์ง€ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ(JSP, ThymeLeaf ๋“ฑ), ์ฐธ์กฐํ•˜๋Š” js๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ์กด js๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹ฑํ•ด ๋‘” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ์ผํžˆ ์บ์‹œ๋ฅผ ์ง€์›Œ์ค˜์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๋‹ค

 

์ผ๋ฐ˜์ ์ธ ๋Œ€์•ˆ์œผ๋กœ import ์†Œ์Šค ๋ช…์‹œํ•  ๋•Œ, ๋‚ ์งœ๋‚˜ ?version=123 ๋“ฑ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ œ์‹œ๋œ๋‹ค

 

๋‹ค๋งŒ, ๋‚ ์งœ์˜ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋‚ ์งœ ๋˜๋Š” ์‹œ๊ฐ„(๋ฒ„์ „์— ์‹œ๊ฐ„๊นŒ์ง€ ๋ช…์‹œํ•œ ๊ฒฝ์šฐ)๊ฐ€ ๊ฒฝ๊ณผํ•˜๋ฉด

๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์บ์‹ฑํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ์— ์š”์ฒญ์„ ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ๋‚ ๋ฆฐ๋‹ค

 

๋˜ํ•œ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ, ์ˆ˜๋™์œผ๋กœ application.yml ๋“ฑ์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•˜๊ณ , ํ•˜๋‚˜์˜ js๋งŒ ์ˆ˜์ •ํ–ˆ๋”๋ผ๋„ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  js๊ฐ€ ์ƒˆ๋กœ ์š”์ฒญ๋˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค

 

์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด @ControllerAdvice์™€ WebConfig์—์„œ ResourceHandlerRegistry์— ๋Œ€ํ•œ ์„ค์ •์„ ํ†ตํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค

 

์Šคํ”„๋ง์—์„œ๋Š” ์ •์  ์ž์›์— ๋Œ€ํ•ด ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ JAR(WAR)์— ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ, ์ด ๋•Œ ํ•ด๋‹น ์ •์  ์ž์›์— ๋Œ€ํ•ด ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ•ด์‹œ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ๋ช…์— ๋ถ™์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„ ์žฌ ๊ธฐ๋™์‹œ, ์ •์ ์ž์›์„ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์ด ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๋‚ ๋ฆด ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋ฐ”๋กœ ์ƒˆ ์š”์ฒญ์„ ๋‚ ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ ๋ฒ„์ „์— ๋Œ€ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ๋ถˆํŽธํ•จ ๋˜ํ•œ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

0. @ControllerAdvice

- Controller์— ๋Œ€ํ•ด ์ „์—ญ url ์„ค์ •์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์„ค์ • ํด๋ž˜์Šค๋กœ ์—ฌ๊ธฐ์„œ ResourceUrlProvider๋ฅผ ์„ค์ •ํ•œ๋‹ค

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.resource.ResourceUrlProvider;

@ControllerAdvice
public class ControllerAdviceConfig { // @Controller๋กœ ๋งคํ•‘๋˜๋Š” view resolver ์— ์ผ๊ด„ ์„ค์ •, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ

    private final ResourceUrlProvider resourceUrlProvider;

    public ControllerAdviceConfig(ResourceUrlProvider resourceUrlProvider) {
        this.resourceUrlProvider = resourceUrlProvider;
    }

    @ModelAttribute("urls") // ์ •์  ์ž์›์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ์ƒ์„ฑ ์‹œ ํ•„์š” ๋กœ์ง
    public ResourceUrlProvider resourceUrlResolver(){
        return this.resourceUrlProvider;
    }
}


1. WebConfig

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.VersionResourceResolver;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
        registry
                // ์„ค์ •ํ•˜๋ ค๋Š” ์ •์  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}


WebConfig์—์„œ ์บ์‹ฑ์„ ์›ํ•˜๋Š” ์ •์  ์ž์›์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ ๋’ค, ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด ์ปค์Šคํ…€ view Resolver๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค

 

2. view(์ถ”๊ฐ€์‚ฌํ•ญ)

๋‚˜๋Š” jsp์—์„œ ์ฐธ์กฐํ•˜๋Š” jsํŒŒ์ผ์˜ ์บ์‹ฑ ์ž๋™ํ™”๊ฐ€ ํ•„์š”ํ–ˆ๊ธฐ ๋–„๋ฌธ์— ํ•ด๋‹น jsp์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐธ์กฐ ๋ฌธ๊ตฌ๋ฅผ ์ž…๋ ฅํ—€๋‹ค

<script src="${urls.getForLookupPath('/js/example.js')}"></script>

 

3. ์ •๋ฆฌ

์ด์™€ ๊ฐ™์€ ์„ค์ •์„ ํ†ตํ•ด ๋น„๊ต์  ์ ์€ ์ž‘์—…์œผ๋กœ ์ •์  ํŒŒ์ผ ์บ์‹ฑ์˜ ์ž๋™ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐฐํฌํ• ๋•Œ๋งˆ๋‹ค ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ๊ณ ์นจ์„ ๋‹ค์‹œํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฐ•์ ์„ ์–ป๋Š”๋‹ค

728x90