๐์๋ชป๋ ์ค๋ช ์ ๋ํ ์ง์ ์ด๋ ์กฐ์ธ์ ๋๊ธ์ ํ์ํฉ๋๋ค๐
์๋ก
์ฌ์๋์ด ํด์ฌํ๊ณ , ์ฃผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ๋ค๋ฃจ๋ ๋ฐฑ์๋ ์์ ์ ํ ์ผ์ด ๋ง์์ก๋ค. ๊ธฐ์กด์๋ ์ฝ๋๋ฅผ ๋ง์น ๋ ์ํผ์ฒ๋ผ ์ธ์์ ๊ฐ๋ฐํด์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์ค์ค๋ก ๋๋ฒ๊น ํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค. ๊ทธ๋์ ์ฃผ 1ํ ํด๊ทผ ํ ์คํฐ๋๋ฅผ ํตํด ์คํ๋ง ์ ๋ฌธ๋ถํฐ ๊ณต๋ถํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ค๋์ ๊ทธ ์ฒซ ๋ฒ์งธ ์ฑํฐ์ธ ์น๊ฐ๋ฐ ๊ธฐ์ด์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
์คํ๋ง์ ํตํ ์น ๊ฐ๋ฐ ๋ฐฉ๋ฒ
์คํ๋ง์ผ๋ก ์น๊ฐ๋ฐ์ ํ ๋ ์๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
1. ์ ์ ์ปจํ ์ธ : HTML ํ์ผ ๊ทธ๋๋ก ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ
2. MVC์ ํ ํ๋ฆฟ ์์ง : ์๋ฒ์์ HTML ํ์ผ์ ๋์ ์ผ๋ก ๋ณํํ ๋ค ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ
3. API : JSON์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์ง์ ์ ์ผ๋ก ์ ๋ฌ
๊ฐ ๋ฐฉ๋ฒ์ ํน์ง๊ณผ ์คํ๋ง์์์ ๋์๋ฐฉ์์ ๋ํด์ ์์๋ณด์.
์ ์ ์ปจํ ์ธ ์ ๋์๊ณผ ํน์ง
์ ์ ์ปจํ
์ธ ๋ ํด๋์ค ๊ฒฝ๋ก๋ ServletContext ๋ฃจํธ์ ์๋ /static(or /public, /resources, META-INF/resources) ๋๋ ํฐ๋ฆฌ์์ ์ ๊ณตํ๋ค. ํด๋น ํด๋ ๋ด์ HTML ํ์ผ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ค๋ ํน์ง์ด ์๋ค. ๋ณ๋์ ์ค์ ์์ด ์คํ๋ง๋ถํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด์ง๋ง Spring MVC์ ResourceHttpRequestHandler๋ฅผ ์ฌ์ฉํ์ฌ ๋์ํ๊ธฐ ๋๋ฌธ์ ์์ฒด WebMvcConfigurer๋ฅผ ์ถ๊ฐํ๊ณ addResourceHandlers ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ํด๋น ๋์์ ์์ ํ ์๋ ์๋ค.(ํ์ง๋ง ์ด๋ ๊ฒ ์์ ํด์ ์ฌ์ฉํ ์ด์ ๊ฐ ์์..) ๋ํ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์์ค๋ /**์ mapping๋๋ฉฐ, ์ด ๊ฒฝ๋ก๋ฅผ ์์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ spring.mvc.static-path-pattern ์์ฑ์ ๋ณ๊ฒฝํ์ฌ mapping ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์คํ๋ง๋ถํธ๋ก ์คํํ ์น ๋ธ๋ผ์ฐ์ ์์ ์ ์ ์ปจํ ์ธ ์ธ HTMLํ์ผ์ ํ์ํ๊ธฐ ์ํด ํฐ์บฃ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด, ์คํ๋ง๋ถํธ์ ์คํ๋ง์ปจํ ์ด๋์์๋ ํด๋น url๊ณผ mapping ๋ controller๋ฅผ ์ฐพ๋๋ค. ํ์ง๋ง controller๊ฐ ์๋ ์ ์ ์ปจํ ์ธ ์ด๊ธฐ ๋๋ฌธ์, static ํด๋ ๋ฑ์ ์ดํด๋ณด๊ณ ๋์ผํ ์ด๋ฆ์ HTMLํ์ผ์ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
MVC์ ํ ํ๋ฆฟ ์์ง์ ๋์๊ณผ ํน์ง
์ด ๋ฐฉ๋ฒ์ ํน์ง์ ํ๋ฒ ๋ ๋๋ง ํ HTML์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ๋ค๋ ์ ์ด๋ค. ์ดํด๋ฅผ ์ํด MVC๋ ๋ฌด์์ธ์ง์ ๋ํด ๋จผ์ ์์๋ณด์. MVC๋ Model, View, Controller์ ๊ตฌ์ฑ์ ๋ปํ๋ฉฐ, ์ญํ ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. Model์ controller๊ฐ ํ๋ฉด์ ํ์ํด์ผ ํ๋ ๊ฒ๋ค์ ์ ๋ฆฌํด์ ๋ด๋ ๊ณณ์ด๋ฉฐ, ์ด๋ฅผ view์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค. View๋ ์ค๋ก์ง ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ๋ง์ ๋ด๋นํ๋ฉฐ, Controller๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ฉฐ, ์์ฒญ์ ๋ฐ์์ ๋ ํ๋ฉด ๋ท๋จ์์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ผ๋ค์ ๋ด๋ ์ญํ ์ด๋ค. ์ฌ๊ธฐ์ View๊ฐ php, jsp ๋ฑ ํ ํ๋ฆฟ์์ง์ ํตํด Model, Controller์ ์ ๋ณด๋ฅผ ๋ฐ์ HTML์ ๋ค์ ๋ ๋๋ง ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ๋๋ก ๊ฐ๋ฐํ๋ฉด ๋๋ค. ์ด์ฒ๋ผ ํ ํ๋ฆฟ์์ง์ MVC๋ฐฉ์์ผ๋ก ์ชผ๊ฐ์ ๋์ํ๋๋ก ๋ง๋ค์๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ ์ ์๋ค.
์น ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ํฐ์บฃ์๋ฒ๋ก ๋ณด๋์ ๋ ์คํ๋ง์ปจํ ์ด๋์์ ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ Controller๋จ์์ mapping๋ ์ ๋ณด๊ฐ ์กด์ฌํ๋ค๋ฉด, ์ปจํธ๋กค๋ฌ์ ๋์์ ๋จผ์ ์ํํ๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก viewResolver๊ฐ HTMLํ์ผ์ ๋ ๋๋งํด ๋ณํ์ ๋ง์น HTML์ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
API์ ๋์๊ณผ ํน์ง
API ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ด๋ ค์ค๋ค๋ ํน์ง์ ๊ฐ์ง๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Controller์์ @ResponseBody๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ด๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ HTML์ <Body> ํ๊ทธ ๋ด๋ถ๋ก ์ ๋ฌํ๋ค๋ ๋ป์ด ์๋, HTTP ๋ด ์๋ต Body๋ถ๋ถ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋๊ฒจ์ฃผ๊ฒ ๋ค๊ณ ์ ํ๋ ๊ฒ์ ๋ปํ๋ค. ๋ฐ๋ผ์ return ๊ฐ์ด view ํ ํ๋ฆฟ์ ๊ฑฐ์น๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ดํฐ ํ์ ๊ทธ๋๋ก ์ ๋ฌ๋๋ค๋ ํน์ง์ด ์๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํฐ์บฃ์๋ฒ๋ก ์ ๋ฌ๋ ์์ฒญ์ MVC ๋์ ๋์ผํ๊ฒ ์คํ๋ง์ปจํ ์ด๋ ๋ด mapping๋ Controller๋ก ์ ๋ฌ๋๊ณ , ํด๋น Controller์ ์ ์ฉ๋ @ResponseBody๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์์ฑํ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก return์ผ๋ก ๋ฐํํ๋ค. ์ด๋ HttpMessageConverter๊ฐ JsonConverter๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ JSON ํํ๋ก ๋ณํํ์ฌ ์ด๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
์ ๋ฆฌํ๋ฉฐ,
์ด๋ ๊ฒ ์ค๋์ ์คํ๋ง์ ํตํด ์น๊ฐ๋ฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ธ ๊ฐ์ง์ ๋ํด ๊ณต๋ถํ๋ค. ๋ถ๋๋ฝ์ง๋ง ํ์ ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฐฉ์์ด API์ธ์ง๋ ์ ํํ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํด ์์๊ณ , view ๊ตฌ์ฑ์ ์ํด model์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ๋ฐฉ๋ฒ๋ ์ด์ ์ผ ์ ๋๋ก ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ์์ง ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ ๋ฐ์ ๋ด์ง ๋ชปํ์ง๋ง, ์ ์ฐจ ํ์ตํ๋ฉฐ ๊ฐ ๋ฐฉ๋ฒ์ ์ ์ ํ๊ฒ ํ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ ๋์ด์ผ๊ฒ ๋ค๐ช
Reference
- https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content
- https://inf.run/Yxp3
Spring Boot Features
Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest
docs.spring.io
[๋ฌด๋ฃ] ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ ๋ฐ์ ๋น ๋ฅด๊ฒ ํ์ตํ ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ...
www.inflearn.com
'BE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ERROR] org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (0) | 2023.05.31 |
---|---|
[postgreSQL] pgAdmin4 ํ ์ด๋ธ csv ํ์ผ ์ถ์ถ ๋ฐฉ๋ฒ (0) | 2023.02.11 |
[AxiosError] Request failed with status code 403 (0) | 2022.04.27 |
[ERROR] ContextLoaderListener ๊ด๋ จ ์ค๋ฅ (4) | 2022.04.20 |