๐Ÿ™Œ์ž˜๋ชป๋œ ์„ค๋ช…์— ๋Œ€ํ•œ ์ง€์ ์ด๋‚˜ ์กฐ์–ธ์˜ ๋Œ“๊ธ€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ™Œ

์„œ๋ก 

์‚ฌ์ˆ˜๋‹˜์ด ํ‡ด์‚ฌํ•˜๊ณ , ์ฃผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•  ์ผ์ด ๋งŽ์•„์กŒ๋‹ค. ๊ธฐ์กด์—๋Š” ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋ ˆ์‹œํ”ผ์ฒ˜๋Ÿผ ์™ธ์›Œ์„œ ๊ฐœ๋ฐœํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์Šค์Šค๋กœ ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ 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, DB ์ ‘๊ทผ ๊ธฐ์ˆ  ๊ฐ•์˜

 

MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์˜ ๋™์ž‘๊ณผ ํŠน์ง•

์ด ๋ฐฉ๋ฒ•์˜ ํŠน์ง•์€ ํ•œ๋ฒˆ ๋ Œ๋”๋ง ํ•œ HTML์„ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ดํ•ด๋ฅผ ์œ„ํ•ด MVC๋ž€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด์ž. MVC๋Š” Model, View, Controller์˜ ๊ตฌ์„ฑ์„ ๋œปํ•˜๋ฉฐ, ์—ญํ• ์— ๋”ฐ๋ผ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. Model์€ controller๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด์„œ ๋‹ด๋Š” ๊ณณ์ด๋ฉฐ, ์ด๋ฅผ view์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. View๋Š” ์˜ค๋กœ์ง€ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์ผ๋งŒ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, Controller๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ ํ™”๋ฉด ๋’ท๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ผ๋“ค์„ ๋‹ด๋Š” ์—ญํ• ์ด๋‹ค. ์—ฌ๊ธฐ์„œ View๊ฐ€ php, jsp ๋“ฑ ํ…œํ”Œ๋ฆฟ์—”์ง„์„ ํ†ตํ•ด Model, Controller์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„ HTML์„ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•˜๋„๋ก ๊ฐœ๋ฐœํ•˜๋ฉด ๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ…œํ”Œ๋ฆฟ์—”์ง„์„ MVC๋ฐฉ์‹์œผ๋กœ ์ชผ๊ฐœ์„œ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ํ†ฐ์บฃ์„œ๋ฒ„๋กœ ๋ณด๋ƒˆ์„ ๋•Œ ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•˜๋Š” Controller๋‹จ์—์„œ mapping๋œ ์ •๋ณด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์ž‘์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ viewResolver๊ฐ€ HTMLํŒŒ์ผ์„ ๋ Œ๋”๋งํ•ด ๋ณ€ํ™˜์„ ๋งˆ์นœ HTML์„ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

์ถœ์ฒ˜: ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  ๊ฐ•์˜

 

API์˜ ๋™์ž‘๊ณผ ํŠน์ง•

API ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋‚ด๋ ค์ค€๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค. ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Controller์—์„œ @ResponseBody๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ HTML์˜ <Body> ํƒœ๊ทธ ๋‚ด๋ถ€๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๋œป์ด ์•„๋‹Œ, HTTP ๋‚ด ์‘๋‹ต Body๋ถ€๋ถ„์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„˜๊ฒจ์ฃผ๊ฒ ๋‹ค๊ณ  ์ •ํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ return ๊ฐ’์ด view ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํ˜•์‹ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. 

 

์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ†ฐ์บฃ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋œ ์š”์ฒญ์€ MVC ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ ๋‚ด mapping๋œ Controller๋กœ ์ „๋‹ฌ๋˜๊ณ , ํ•ด๋‹น Controller์— ์ ์šฉ๋œ @ResponseBody๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ return์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ HttpMessageConverter๊ฐ€ JsonConverter๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ด๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

์ถœ์ฒ˜: ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  ๊ฐ•์˜

@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

 

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

+ Recent posts