@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. ์ ๋ฆฌ
์ด์ ๊ฐ์ ์ค์ ์ ํตํด ๋น๊ต์ ์ ์ ์์ ์ผ๋ก ์ ์ ํ์ผ ์บ์ฑ์ ์๋ํ๊ฐ ๊ฐ๋ฅํ๊ณ , ํด๋ผ์ด์ธํธ์์ ๋ฐฐํฌํ ๋๋ง๋ค ๋ฌด์กฐ๊ฑด ์๋ก๊ณ ์นจ์ ๋ค์ํ ํ์๊ฐ ์์ด์ง๋ ๊ฐ์ ์ ์ป๋๋ค
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring messging, Stomp๋ฅผ ํ์ฉํ ๋ฉ์ธ์ง ๊ด๋ฆฌ + ๋ค์ค ์ธ์ ๊ด๋ฆฌ ๊ตฌํ (0) | 2025.04.20 |
---|---|
Spring Data JPA : Auditing & HATEOAS (0) | 2023.02.13 |
T ์์นด๋ฐ๋ฏธ : JPA ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด (3) (0) | 2023.02.10 |
SpringData ์ฟผ๋ฆฌ์ QueryDSL (0) | 2023.02.08 |
SpringData JPA ํ์ด์ง๊ณผ ์ ๋ ฌ (0) | 2023.02.03 |