์๋ธ๋ฆฟ(Servlet) API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ ํ๋ ์์ํฌ
Spring Web MVC ๋ฅผ ์ค์ฌ์ Spring MVC
( Spring MVC ํ๋ ์์ํฌ ๋ผ๊ณ ๋ ๋ถ๋ฆ )
โ๏ธ ์๋ธ๋ฆฟ(Servlet)
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ํน์ ๊ท์ฝ์ ๋ง์ถ์ด์ Java ์ฝ๋๋ก ์์ฑํ๋ ํด๋์ค ํ์ผ
โ
( ์ํ์น ํฐ์บฃ(Apache Tomcat) - ์๋ธ๋ฆฟ๋ค์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์คํ์ด ๋๋๋ก ํด์ฃผ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container) ์ค ํ๋ )
โ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ๋๋ ค์ค ์์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ
- ์๋น์ค ๊ณ์ธต (Service Layer)
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ฌํญ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์์ญ
โ - ๋น์ฆ๋์ค ๋ก์ง (Business Logic)
โ ์ค์ ๋ก ์์ฒญ ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Java ์ฝ๋๋ก ๊ตฌํํ ๊ฒ
โ Model ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ ์น๋ธ๋ผ์ฐ์ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฉด์ ๋ณด์ฌ์ง๋ ๋ฆฌ์์ค(Resource)๋ฅผ ์ ๊ณตํ๋ ์ญํ
โ๏ธ View์ ํํ
1. HTML ํ์ด์ง์ ์ถ๋ ฅ
โ HTML ํ์ด์ง๋ฅผ ์ง์ ๋ ๋๋งํด์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์กํ๋ ๋ฐฉ์
( SSR์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์ )
โ HTML ํ๊ทธ๋ก ๊ตฌ์ฑ๋ ํ์ด์ง์ Model ๋ฐ์ดํฐ๋ฅผ ์ฑ์ ๋ฃ์ ํ, ์ต์ข ์ ์ธ HTML ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์กํด์ค
( But, ์ด๋ ํ๋ก ํธ์๋, ๋ฐฑ์๋๊ฐ ํตํฉ๋ ๊ตฌ์กฐ )
โ
2.PDF, Excel ๋ฑ์ ๋ฌธ์ ํํ๋ก ์ถ๋ ฅ
โ Model ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ PDF ๋ฌธ์๋ Excel ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์กํ๋ ๋ฐฉ์
โ ๋ฌธ์ ๋ด์์ ๋ฐ์ดํฐ๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์
โ
3. XML, JSON ๋ฑ ํน์ ํ์์ ํฌ๋งท์ผ๋ก์ ๋ณํ
โ Model ๋ฐ์ดํฐ๋ฅผ ํน์ ํ๋กํ ์ฝ ํํ๋ก ๋ณํํด์ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์กํ๋ ๋ฐฉ์
โ ํน์ ํ์์ ๋ฐ์ดํฐ๋ง ์ ์กํ๊ณ , ํ๋ฐํธ์๋ ์ธก์์ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก HTML ํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐฉ์
( CSR์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์)
- ์ฅ์
- ํ๋ฐํธ์๋ ์์ญ / ๋ฐฑ์๋ ์์ญ์ด ๋ช ํํ๊ฒ ๊ตฌ๋ถ โ ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์๊ฐ ์๋์ ์ผ๋ก ์ฉ์ด
- ํ๋ฐํธ์๋ ์ธก์์ ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง
โ๏ธ JSON ( JavaScript Object Notation )
โ Spring MVC์์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ ํ์
โ ๊ธฐ๋ณธ ํฌ๋งท = {โ์์ฑโ:โ๊ฐโ} ํํ
ํด๋ผ์ด์ธํธ ์ธก์ ์์ฒญ์ ์ง์ ์ ์ผ๋ก ์ ๋ฌ ๋ฐ๋ ์๋ํฌ์ธํธ(Endpoint)
Model๊ณผ View์ ์ค๊ฐ์์ ์ํธ ์์ฉ์ ํด์ฃผ๋ ์ญํ
( ์์ฒญ ์ ๋ฌ๋ฐ๊ณ , Model ๋ฐ์ดํฐ๋ฅผ View๋ก ์ ๋ฌ )
โ๏ธ ์๋ํฌ์ธํธ (Endpoint)
์ปดํจํฐ์ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๊ณ ์ปดํจํฐ ๋คํธ์ํฌ์ ์ ๋ณด๋ฅผ ๊ตํํ๋ ๋ฌผ๋ฆฌ์ ๋๋ฐ์ด์ค
( ๊ฐ๋จํ๊ฒ ์ถ๋ฆฐ ๋์ ๋ฐฉ์ )
[์ฐธ๊ณ ] https://jsonformatter.org/json-to-java ์ด์ฉ
์์ ๊ฐ์ด ์ง์๋ค์ ์ ๋ณด๋ฅผ JSON ํ์์ผ๋ก ๋ฃ๊ณ ๋๋ ค๋ณด๋,
์๋์ ๊ฐ์ด Java๋ก ๋ณ๊ฒฝ๋์ด ์ ๋์๋ค!
[์ฐธ๊ณ ] https://codebeautify.org/blog/json-full-form/
(1) ๋จผ์ ํด๋ผ์ด์ธํธ
๊ฐ ์์ฒญ์ ์ ์กํ๋ฉด DispatcherServlet
ํด๋์ค์ ์์ฒญ์ด ์ ๋ฌ๋จ
๐ ํด๋ผ์ด์ธํธ๊ฐ
DispatcherServlet
ํํ ์์ฒญ ์ ์กํ๊ณ ์ ๋ฌ ๋ฐ์
(2) DispatcherServlet
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ Controller
์ ๋ํ ๊ฒ์์ HandlerMapping
์ธํฐํ์ด์ค์๊ฒ ์์ฒญ
๐
DispatcherServlet
โHandlerMapping
"์ผContoller
์ข ๊ฒ์ํด๋ด"
(3) HandlerMapping
์ด ํด๋ผ์ด์ธํธ ์์ฒญ + ๋งคํ๋๋ ํธ๋ค๋ฌ ๊ฐ์ฒด๋ฅผ ๋ค์ DispatcherServlet
์๊ฒ ๋ฆฌํด
๐
HandlerMapping
โDispatcherServlet
"์ผ ๊ทธ ์์ฒญ์ ์๋ง์ Controller ์ฐพ์์ด"
( ์ฌ๊ธฐ์ ํธ๋ค๋ฌ ๊ฐ์ฒด - Controller ๋ด๋ถ ๋ฉ์๋)
- ํธ๋ค๋ฌ ๊ฐ์ฒด๋ ํด๋น ํธ๋ค๋ฌ์ Handler ๋ฉ์๋ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์
( Handler ๋ฉ์๋ = Controller ํด๋์ค ์์ ๊ตฌํ๋ ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋ )
(4) ์์ฒญ์ ์ฒ๋ฆฌํ Controller
ํด๋์ค๋ฅผ ์ฐพ์์ผ๋, ์ด์ ์ค์ ๋ก ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ Handler ๋ฉ์๋
๋ฅผ ์ฐพ์ ํธ์ถํด์ผ ํจ
DispatcherServlet
์ด Handler ๋ฉ์๋
์ง์ ํธ์ถํ์ง ์๊ณ , HandlerAdpater
์๊ฒ Handler
๋ฉ์๋ ํธ์ถ ์์ํจ
๐
DispatcherServlet
โHandlerAdpater
"์ผ ์ด๊ฑฐ Handler ํํ ์ฒ๋ฆฌํ๋ผ๊ณ ํด"
(5) HandlerAdapter
๊ฐ DispatcherServlet
์ผ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ Controller
์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ํด๋น Controller
์ Handler ๋ฉ์๋
ํธ์ถ
๐
HandlerAdapter
โController
"์ผ Handler ๋ฉ์๋ ๋ ๋์์ ์ด๊ฑฐ ์ฒ๋ฆฌํด๋ด"
( ์ด Controller ํด๋์ค๊ฐ Spring MVC์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ต์ข ๋ชฉ์ ์ง )
์ฌ๊ธฐ๊น์ง ํ๋ฆ์ ๋ฐ์ ๋ ! ์ด์ ๋ฐ๋๋ก ~
(6) Controller
์ Handler
๋ฉ์๋๊ฐ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ํ ๋ฆฌํด ๋ฐ์ ๊ฒฐ๊ณผ๋ฌผ์ธ Model ๋ฐ์ดํฐ
๋ฅผ HandlerAdapter
์๊ฒ ์ ๋ฌ
๐
Controller
โHandlerAdapter
"์ผ ์ด๊ฑฐ ๋ค ํด์ ๊ฒฐ๊ณผ๋ฌผ(Model) ๋ํํ ์ค๊ฒ"
(7) HandlerAdapter
๊ฐ ์ ๋ฌ๋ฐ์ Model ๋ฐ์ดํฐ
์ View ์ ๋ณด
๋ฅผ ๋ค์ DispatcherServlet
์๊ฒ ์ ๋ฌ
๐
HandlerAdapter
โDispatcherServlet
"์ผ ๊ฒฐ๊ณผ๋ฌผ(Model)์ด๋ View ์ ๋ณด ์ค๊ฒ"
(8) DispatcherServlet
์ด ์ ๋ฌ ๋ฐ์ View ์ ๋ณด
๋ฅผ ๋ค์ ViewResolver
์๊ฒ ์ ๋ฌํด์ View ๊ฒ์
์์ฒญ
๐
DispatcherServlet
โViewResolver
"์ผ ์ด View ์ ๋ณด ๊ฒ์ํด๋ด"
(9) ViewResolver
๊ฐ View ์ ๋ณด
์ ํด๋นํ๋ View
๋ฅผ ์ฐพ์์ View
๋ฅผ ๋ค์ ๋ฆฌํด
๐
ViewResolver
โDispatcherServlet
"๊ทธ ์ ๋ณด์ ํด๋นํ๋ View ์ฌ๊ธฐ ์์ด"
(10) DispatcherServlet
์ด ViewResolver
๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ View ๊ฐ์ฒด
๋ฅผ ํตํด Model ๋ฐ์ดํฐ
๋ฅผ ๋๊ฒจ์ฃผ๋ฉด์, ํด๋ผ์ด์ธํธ
์๊ฒ ์ ๋ฌํ ์๋ต ๋ฐ์ดํฐ
์์ฑ์ ์์ฒญ
๐
DispatcherServlet
โView ๊ฐ์ฒด
"์ผ ์ฌ๊ธฐ ๊ฒฐ๊ณผ๋ฌผ(Model) ์์ผ๋๊น ํด๋ผ์ด์ธํธํํ ์ค ์๋ต ๋ฐ์ดํฐ ์ข ๋ง๋ค์ด๋ด"
(11) View
๊ฐ ์๋ต ๋ฐ์ดํฐ
์์ฑํด์ ๋ค์ DispatcherServlet
์๊ฒ ์ ๋ฌ
๐
View
โDispatcherServlet
"์ผ ์ฌ๊ธฐ ๋ค ๋ง๋ฆ"
(12) DispatcherServlet
์ด View
๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ์๋ต ๋ฐ์ดํฐ
๋ฅผ ์ต์ข
์ ์ผ๋ก ํด๋ผ์ด์ธํธ
์๊ฒ ์ ๋ฌ
๐
DispatcherServlet
โํด๋ผ์ด์ธํธ
"์ ๋ค ํ์ด. ์๋ต ๋ฐ์ดํฐ ์ค๊ฒ"
โ ์ ํ๋ฆ์ ๋ณด๋ฉด DispatcherServlet์ด ๊ต์ฅํ ์ค๊ฐ์์ ํ๋ ์ผ์ด ๋ง์ ๋ฐ๋น ๋ณด์ !
But, ์ค์ ๋ก ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ค์๊ฒ ๋ค ์์(Delegate)ํ๊ณ ์์
(Front Controller Pattern)
โ DispatcherServlet = ๋ฐ์ง์ฌ์ฅ
โ DispatcherServlet
์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ฅ ์๋จ์ ๋ฐฐ์น๋์ด ๋ค๋ฅธ ๊ตฌ์ฑ์์๋ค๊ณผ ์ํธ์์ฉํ๋ฉด์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํจํด
โ๏ธ Handler ๋ฉ์๋
โController
ํด๋์ค์ ์๋ ์ ๋ํ ์ด์ ์ด ๋ถ์ด ์๋ ๋ฉ์๋๋ค
Ex. @GetMapping, @PostMapping, PatchMapping ๋ฑ
โ๏ธ HandlerMapping
์ฌ์ฉ์์ ์์ฒญ๊ณผ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋Handler
๋ฅผ ๋งคํํด์ฃผ๋ ์ญํ
โ HTTP ์์ฒญ ๋ฉ์๋(GET,POST ๋ฑ)์ Mapping URL์ ๊ธฐ์ค์ผ๋ก ํด๋น Handler์ ๋งคํ
( ์ฌ๋ฌ ๋ชจ๋ ํธ๋ค๋ฌ ๋ฉ์๋๋ค์ @~Mapping ์ ๋ํ ์ด์ ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์์ )
โ
( Spring ์์๋ ์ฌ๋ฌ๊ฐ์ง ์ ํ์HandlerMapping ํด๋์ค
๋ฅผ ์ ๊ณตํ๋๋ฐ ์ค๋ฌด์์๋ ์ฃผ๋ก Spring์์ ๋ํดํธ๋ก ์ ํRequestMappingHandlerMapping
์ฌ์ฉ )
โ๏ธ HandelrAdpter
๋ค๋ฅธ ํ๋ ์์ํฌ์ ํธ๋ค๋ฌ๋ฅผ Spring MVC์ ํตํฉํ๊ธฐ ์ํด ์ฌ์ฉ
โ
โ๏ธ Adapter (์ด๋ํฐ)
๋ฌด์ธ๊ฐ๋ฅผ ๋ค๋ฅธ ํ์์ด๋ ํํ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ
โ๏ธ Resolve
๋ฌด์ธ๊ฐ๋ฅผ ํด์ํ๊ณ ํด๊ฒฐํด์ฃผ๋ค
( ์ ๋ฒ์ ๋ฐฐ์ ์ง๋ง ์์์๊น๋ด ํ๋ฒ ๋ ์ฒจ๋ถํ๋ค )
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ
โ๏ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๋ค
โ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ์ ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํน์ ๋ฒ์๋ก ์ ํํ๋ ๊ฒ
์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์๊ตฌ ์ฌํญ์ ์์งํ๋ ์ผ
ํจํค์ง ๊ตฌ์กฐ ์์ฑ
1. ๊ธฐ๋ฅ ๊ธฐ๋ฐ ํจํค์ง ๊ตฌ์กฐ (package-by-feature)
Ex. Coffee, Member ๋ฑ
( Coffee ํจํค์ง ์์๋ CoffeeController, CoffeeDto, CoffeeRepository ๋ฑ์ ๊ธฐ๋ฅ์ด ์์ )
2. ๊ณ์ธต ๊ธฐ๋ฐ ํจํค์ง ๊ตฌ์กฐ (package-by-layer)
Ex. controller, dto, model, repository, service ๋ฑ
( controller ํจํค์ง ์์๋ CoffeeController, MemberController ๋ฑ์ ๊ธฐ๋ฅ์ด ์์ )
โ ์ ๋๊ฐ๋ฅผ ์ํฉ์ ๋ฐ๋ผ ์๋ง๊ฒ ์ฌ์ฉํ๋ฉด ๋์ง๋ง,
ํ
์คํธ์ ๋ฆฌํฉํ ๋ง์ด ์ฉ์ดํ๊ณ , ํฅํ์ ๋ง์ดํฌ๋ก ์๋น์ค ์์คํ
์ผ๋ก์ ๋ถ๋ฆฌ๊ฐ ์๋์ ์ผ๋ก ์ฉ์ดํ ๊ธฐ๋ฅ ๊ธฐ๋ฐ ํจํค์ง ๊ตฌ์กฐ ์ฌ์ฉ ๊ถ์ฅํจ
โ main()
๋ฉ์๋๊ฐ ํฌํจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํธ๋ฆฌํฌ์ธํธ(Entrypoint) ์์ฑ
But, Spring Initialize๋ฅผ ํตํด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด ์ํธ๋ฆฌํฌ์ธํธ ํด๋์ค๊ฐ ์๋์ผ๋ก ์์ฑ๋์ด ์์
โ๏ธ ์ํธ๋ฆฌํฌ์ธํธ (Eentrypoint)
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์
@RequestParam
โ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, form-data ๋ฑ์ Servlet request Parameter๋ฅผ ๋ฐ์ธ๋ฉ ํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉ
@RequestHeader
โ request header๋ฅผ ๋ฐ์ธ๋ฉํด์ header์ key/value์ ์ ๊ทผํ ์ ์์
@RequestBody
โ request body๋ฅผ ์ฝ์ด์ ์ง์ ํ Java ๊ฐ์ฒด๋ก deserialization ํด์ค
@RequestPart
โ 'multipart/form-data' ํ์์ request ๋ฐ์ดํฐ๋ฅผ part ๋ณ๋ก ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ํด์ค
@PathVariable
โ @RequestMapping ์ ํจํด ํ์์ผ๋ก ์ ์๋ URL์ ๋ณ์์ ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ํด์ค
@MatrixVariable
โ URL ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ ๋ถ๋ถ์ key/value ์์ผ๋ก ๋ ๋ฐ์ดํฐ์ ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ํด์ค
HttpEntity
โ request header์ body์ ์ ๊ทผํ ์ ์๋ ์ปจํ
์ด๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์
[์ฐธ๊ณ ] https://itvillage.tistory.com/41
Project ํด๋์ Section3-Week1 ํ์ผ์ ์์
์์ธํ ์ค๋ช ์ ์๋ ์ฐธ๊ณ !
JSON ๋ฌธ์์ด์ ์์์
ํ๋ ๊ฒ์ ๊ฐ์ ํ๊ธฐ ์ํ์ฌ
โ Map ๊ฐ์ฒด๋ก ๋์ ํ๊ณ ํ์
์ ResponseEntity ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํจ !
( ์ค์ต ์ฝ๋ ๊ฐ์ด ๋ณด๋ฉด์ ์ดํดํ๊ธฐ )
์ค๋ ๊ฐ๋
๋ ์ดํดํ๊ธฐ ์ฌ์ ๊ณ ๋ค ๊ด์ฐฎ์๋ค !
ํ์ด์์ ์ค์ต๋ ๋น ๋ฅด๊ฒ ๋๋ฌ๊ณ ์์์ด ์ข์๋ค.
ํ์ง๋ง git์์ push๋ฅผ ํ ๋ ์๊ธด ์ค๋ฅ ๋๋ฌธ์ ๋ช์๊ฐ์ ์ก์๋จน์ ๊ฑด์ง.. ใ
ใ
ใ
ํ ๊ฒ ๋ง๋ค ..