[์คํ๋ง ๋ถํธ/MVC] ์ ์ ๋ฆฌ์์ค(Static Resources) ๊ธฐ๋ณธ ์ค์ ๊ณผ ์ปค์คํ ๋ฐฉ๋ฒ
์คํ๋ง ๋ถํธ๋ ์ ์ ๋ฆฌ์์ค(static resources)์ ๋ํ ๊ธฐ๋ณธ ๋งคํ ์ค์ ๊ณผ ์ปค์คํ ์ ์ง์ํ๋ค.
์ค์ ๋ก ํ์ธํด๋ณด์.
์คํ๋ง ๋ถํธ ํ๋ก์ ํธ์ src/main/resources/static/์ hello.html์ ์๋ก ๋ง๋ ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hello Static Resource
</body>
</html>
์ ์ ๋ฆฌ์์ค๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ๊ธฐ๋ํ์ง ์๊ณ ๋น๋ํ๋ ๊ฒ ๋ง์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ์ ์๋ค.
ํ๋ก์ ํธ ๋น๋ ํ http://localhost:8080/hello.html๋ก ์์ฒญํด๋ณด์.
์ ์ ๋ฆฌ์์ค ๋งคํ URL ํจํด
๊ธฐ๋ณธ์ ์ผ๋ก /**(๋ฃจํธ) ๋ถํฐ ๋งคํ๋๋ค.
๋ฐ๋ผ์ ์ ์์ฒ๋ผ http://127.0.0.1:8080/hello.html์ ์์ฒญํ๋ฉด ์ ์ ๋ฆฌ์์ค location(์์น)์์ ์ฐพ์ ์๋ตํ๋ค.
์ ์ ๋ฆฌ์์ค ๋งคํ ํจํด์ ๋ฃจํธ๊ฐ ์๋ ๋ค๋ฅธ ํจํด์ผ๋ก ๋ฐ๊ฟ๋ณด์.
์ ์ ๋ฆฌ์์ค ๋งคํ ํจํด ๋ณ๊ฒฝ - spring.mvc.static-path-pattern
application.properties
spring.mvc.static-path-pattern=/static/**
์ฐธ๊ณ ๋ก ์ด ํ๋กํผํฐ๋ WebMvcProperties์ ๊ตฌํ๋์ด ์๋ค.
์ ์ ๋ฆฌ์์ค Location(์์น)
์ ์ ๋ฆฌ์์ค location์ด๋ ์๋ฒ๊ฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
์คํ๋ง ๋ถํธ์ ๊ธฐ๋ณธ ์ ์ ๋ฆฌ์์ค ์์น๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ ResourceProperties์ ์ ์๋์ด ์์ผ๋ฉฐ, ์คํ๋ง ๋ถํธ 1.5.3.RELEASE ๋ถํฐ ํ์ฌ ๊ธฐ์ค ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ธ 2.3.3.RELEASE ๊น์ง ๋์ผํ๋ค.
- classpath:/META-INF/resources/
- classpath:/resources/
- "classpath:/static/"
- "classpath:/public/"
์ ์ ๋ฆฌ์์ค location์ ๋ฐ๊ฟ๋ณด์.
์ ์ ๋ฆฌ์์ค location ๋ณ๊ฒฝ - spring.resources.static-locations
์ ์ ๋ฆฌ์์ค location์ /static-test/์ผ๋ก ๋ณ๊ฒฝํด๋ณผ ๊ฒ์ด๋ค.
ํ๋ก์ ํธ src/main/resources/์ static-test ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ hello.html์ ์์น์ํจ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
static-test/hello.html
</body>
</html>
application.properties์ spring.resources.static-locations์ ์ด์ฉํ์ฌ ์์์ ๋ง๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์ ํ๋ค.
spring.resources.static-locations=classpath:/static-test/
์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ๊ธฐ๋ํ๊ณ http://localhost:8080/hello.html๋ก ์์ฒญํ๋ค.
spring.resources.static-locations ํ๋กํผํฐ๋ ResourceProperties์ ์ ์๋์ด ์๋ค.
์ด spring.resources.static-locations ํ๋กํผํฐ๋ฅผ ํตํด location์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์คํ๋ง ๋ถํธ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ locations๋ฅผ overrideํ๊ธฐ ๋๋ฌธ์ ์ค์ ํ์๋ ๊ธฐ๋ณธ location์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ค์์ WebConfigurer๋ฅผ ํตํ ์ปค์คํฐ๋ง์ด์ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ ์ ๋ฆฌ์์ค ์ค์ ์ปค์คํฐ๋ง์ด์ง - WebConfigurer
WebMvcConfigurer๋ฅผ ๊ตฌํํ๋ ํด๋์ค์์ addResourceHandlers๋ฅผ overrideํ์ฌ ์ ์ ๋ฆฌ์์ค ํธ๋ค๋ฌ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ์ ์ ๋ฆฌ์์ค ํธ๋ค๋ฌ๋ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ ์ปค์คํ ํธ๋ค๋ฌ๊ฐ ์ถ๊ฐ๋๋ค.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/m/**")
.addResourceLocations("classpath:/m/")
.setCachePeriod(20)
;
}
}
/m/** ํจํด ์์ฒญ ์ classpath์ /m/ ๋๋ ํ ๋ฆฌ์์ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์๋ตํ๋๋ก ํ๋ ์ค์ ์ด๋ค.
setCachePeriod๋ฅผ ํตํด ์บ์ฑ ์ ๋ต์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค. (์ด ๋จ์)
์ค์ ํ ํธ๋ค๋ฌ์ ๋ํด ํ ์คํธํ๊ธฐ ์ํด src/main/resources์ m ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ hello.html์ ์์น์ํจ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
m/hello.html
</body>
</html>
ResourceHttpRequestHandler
์ ์ ๋ฆฌ์์ค์ ๋ํ ์์ฒญ์ ์๋ต์ ResourceHttpRequestHandler๊ฐ ์ฒ๋ฆฌํ๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ด์ ๊ณผ ๋์ผํ ๋ฆฌ์์ค๋ฅผ ๋ค์ ์์ฒญํด๋ณด์.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ์์ฒญ ํค๋์ If-Modified-Since๊ฐ ๋ณด๋ด์ง๊ณ ์๋ต ํค๋์ Last-Modified, ์๋ต ์ฝ๋๋ก 304๋ฅผ ๋ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
304 ์๋ต ์ฝ๋๋ hello.html์ ์๋ฒ์์ ๋ฐ์์ค๋๊ฒ ์๋๋ผ ๋ธ๋ผ์ฐ์ ์์ ์บ์ฑํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋ค.
๋ค์ hello.html์ ์์ ํ๊ณ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๋ค ํ ์คํธํด๋ณด์.
์ด๋ก ์ธํด hello.html์ modified date๊ฐ ํ์ฌ ์๊ฐ์ผ๋ก ๊ฐฑ์ ๋๊ณ http://127.0.0.1:8080/hello.html ์ฌ์์ฒญ ์ HTTP ๋ฉ์์ง๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ ์ฅํ๊ณ ์๋ hello.html ๋ฆฌ์์ค์ modified date๋ฅผ If-Modified-Since์ ๋ด์ ๋ณด๋ด๊ณ ์๋ฒ๋ hello.html์ด ๊ทธ ๋ณด๋ค ๋์ค์ ์์ ๋์์ผ๋ฏ๋ก 200 ์๋ต ์ฝ๋๋ก ๋ฆฌ์์ค๋ฅผ ๋ค์ ๋ณด๋ธ๋ค.
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ๋ถํธ ๊ฐ๋ ๊ณผ ํ์ฉ
๋๊ธ