[์Šคํ”„๋ง MVC] - 14. HTTP message body ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ
ยท
Spring/Spring MVC
HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ - ๋‹จ์ˆœ ํ…์ŠคํŠธ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋‹ค๋ฅด๊ฒŒ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง์ ‘ ๋„˜์–ด์˜ค๋Š” ๊ฒฝ์šฐ๋Š” @RequestParam , @ModelAttribute ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. InputStream ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("messageBody={}",messageBody); HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋ฅผ InputStream ์„ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. @PostMapping("/request-body-string-v2") pu..
[์Šคํ”„๋ง MVC] - 13. ์š”์ฒญ ๋งคํ•‘ / ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ
ยท
Spring/Spring MVC
์š”์ฒญ ๋งคํ•‘ @RestController public class MappingController { @RequestMapping("/hello-basic") public String helloBasic() { return "OK"; } @RestController @Controller ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด String ์ด๋ฉด ๋ทฐ ์ด๋ฆ„์œผ๋กœ ์ธ์‹๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ทฐ๋ฅผ ์ฐพ๊ณ  ๋ทฐ๊ฐ€ ๋žœ๋”๋ง ๋œ๋‹ค. @RestController ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋ทฐ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ”๋กœ ์ž…๋ ฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ok ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. @RequestMapping("/hello-basic") /hello-basic URL ํ˜ธ์ถœ์ด ์˜ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋งคํ•‘ํ•œ๋‹ค. @RequestMapping ์— metho..
[์Šคํ”„๋ง MVC] - 12. ๋กœ๊ทธ / SLF4J / Logback
ยท
Spring/Spring MVC
Welcome ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ ์Šคํ”„๋ง ๋ถ€ํŠธ์— Jar ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด /resources/static/ ์œ„์น˜์— index.html ํŒŒ์ผ์„ ๋‘๋ฉด Welcome ํŽ˜์ด์ง€๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ๋กœ๊น… ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ธฐ ๋ณ„๋„์˜ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ( spring-boot-starter-logging ) ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Logback, Log4J, Log4J2 ๋“ฑ๋“ฑ ์ˆ˜ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, SLF4J๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , ๊ทธ ๊ตฌํ˜„์ฒด๋กœ Logback ๊ฐ™์€ ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค. ๋กœ๊ทธ ์„ ์–ธ private final Logger log = LoggerFactory.getLogger(getClass()); @Slf4j public class LogTestController ..
[์Šคํ”„๋ง MVC] - 11. @Controller / @RequestMapping
ยท
Spring/Spring MVC
์Šคํ”„๋ง MVC ๊ตฌ์กฐ @RequestMapping ์• ๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ , ์‹ค์šฉ์ ์ธ ์ปจํŠธ๋กค๋Ÿฌ @RequestMapping ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค. ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ @RequestMapping RequestMappingHandlerMapping RequestMappingHandlerAdapter @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } } @Controller ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ์Šคํ”„..
[์Šคํ”„๋ง MVC] - 10. DispatcherServlet / ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ
ยท
Spring/Spring MVC
SpringMVC ๊ตฌ์กฐ DispatcherServlet ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ ์Šคํ”„๋ง MVC์˜ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ(DispatcherServlet)์ด๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” DispacherServlet ์„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด์„œ ๋ชจ๋“  ๊ฒฝ๋กœ( urlPatterns="/" )์— ๋Œ€ํ•ด์„œ ๋งคํ•‘ํ•œ๋‹ค. ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋˜๋ฉด FrameworkServlet.service() ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ DispacherServlet.doDispatch() ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. 1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ // Determine handler for the current request. mappedHandler = getHandler(processedRequest); if (mappedHandler == null) {..
[์Šคํ”„๋ง MVC] - 9. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ - ์–ด๋Œ‘ํ„ฐ
ยท
Spring/Spring MVC
๋งŒ์•ฝ ์–ด๋–ค ๊ฐœ๋ฐœ์ž๋Š” ControllerV3 ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๊ณ , ์–ด๋–ค ๊ฐœ๋ฐœ์ž๋Š” ControllerV4 ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•œ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ControllerV3 , ControllerV4 ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งˆ์น˜ v3๋Š” 110v์ด๊ณ , v4๋Š” 220v ์ „๊ธฐ ์ฝ˜์„ผํŠธ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์–ด๋Œ‘ํ„ฐ์ด๋‹ค. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด์ž. V5 ๊ตฌ์กฐ - ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ: ์ค‘๊ฐ„์— ์–ด๋Œ‘ํ„ฐ ์—ญํ•  , ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ: ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ด๋ฆ„์„ ๋” ๋„“์€ ๋ฒ”์œ„์ธ ..
[์Šคํ”„๋ง MVC] - 8. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ - ModelView
ยท
Spring/Spring MVC
ModelView - V3 ModelView ์„œ๋ธ”๋ฆฟ์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Model์„ ์ง์ ‘ ๋งŒ๋“ค๊ณ , ์ถ”๊ฐ€๋กœ View ์ด๋ฆ„๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด 0. HTTP ์š”์ฒญ @WebServlet(name = "frontControllerServletV3",urlPatterns = "/front-controller/v3/*") public class FrontControllerServletV3 extends HttpServlet { /front-controller/v3 ํ•˜์œ„ ๋ชจ๋“  ์š”์ฒญ์€ ์ด ์„œ๋ธ”๋ฆฟ์—์„œ ๋ฐ›์•„๋“ค์ธ๋‹ค. 1. ์ปจํŠธ๋กค๋Ÿฌ ์กฐํšŒ private Map controllerMap = new HashMap(); public FrontControllerServletV3() { controllerMap.put("/front..
[์Šคํ”„๋ง MVC] - 7. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ
ยท
Spring/Spring MVC
ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ์ „ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ํ›„ FrontController ํŒจํ„ด ํŠน์ง• ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ ํ•˜๋‚˜๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์Œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœ ์ž…๊ตฌ๋ฅผ ํ•˜๋‚˜๋กœ! / ๊ณตํ†ต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋จ V1 ๊ตฌ์กฐ urlPatterns = "/front-controller/v1/*" /front-controller/v1 ๋ฅผ ํฌํ•จํ•œ ํ•˜์œ„ ๋ชจ๋“  ์š”์ฒญ์€ ์ด ์„œ๋ธ”๋ฆฟ์—์„œ ๋ฐ›์•„๋“ค์ธ๋‹ค. private Map controllerMap = new HashMap(); public FrontControllerServletV1() { controllerMap.put("/front-controller/v1..