๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/Boost Course Web

4.1 Spring MVC

1) Spring MVC๋ž€?

MVC๋ž€?

  • MVC๋Š” Model-View-Controller์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

  • ์›๋ž˜๋Š” ์ œ๋ก์Šค ์—ฐ๊ตฌ์†Œ์—์„œ ์ผํ•˜๋˜ ํŠธ๋คผ๊ทธ๋ฒ  ๋ฆฐ์ฆˆ์ปค๊ทธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์†Œ๊ฐœํ•œ ๊ฐœ๋…์œผ๋กœ, ๋ฐ์ŠคํŠธํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ์œผ๋กœ ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Model : ๋ชจ๋ธ์€ ๋ทฐ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ƒํ’ˆ ๋ชฉ๋ก์ด๋‚˜, ์ฃผ๋ฌธ ๋‚ด์—ญ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • View : ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ทฐ(View)๋Š” ์‹ค์ œ๋กœ ๋ณด์ด๋Š” ๋ถ€๋ถ„์ด๋ฉฐ, ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋Š” JSP, JSF, PDF, XML๋“ฑ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • Controller : ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์— ์‘๋‹ตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋‹ค๋ฅธ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

MVC Model 1 ์•„ํ‚คํ…์ฒ˜

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์š”์ฒญ์„ JSP๊ฐ€ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋”ฐ๋ผ์„œ ์š”์ฒญ๋งŒํผ JSP ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•ด์•ผ๊ฒ ์ฃ .

์ด๋Ÿฐ JSP๋Š” Java๋กœ ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค์ธ Java bean์„(2) ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(3)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ ์š”.

์ด ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ์ด๋Ÿฐ ์ผ์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .

์—ฌ๊ธฐ์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” Java bean์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์€ JDBC๋กœ ์ž‘์„ฑํ–ˆ๋˜ Role Dao ๊ฐ™์€ ํด๋ž˜์Šค.

๋ฌธ์ œ์ ์€ JSP ์ž์ฒด์— Java ์ฝ”๋“œ๋ž‘ HTML ์ด๋Ÿฐ ์ฝ”๋“œ๋“ค์ด ๋ง‰ ์„ž์—ฌ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€ -> ๋‹ค์Œ ๋ชจ๋ธ

MVC Model 2 ์•„ํ‚คํ…์ฒ˜

์š”์ฒญ ์ž์ฒด๋ฅผ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๊ฒŒ ํ•˜๊ณ ์š”.(1)

์„œ๋ธ”๋ฆฟ์ด Java bean์„ ์ด์šฉํ•ด์„œ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ค๊ณ 

์ด๋Ÿฐ ๊ฒฐ๊ณผ๋“ค์„ JSP๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๋Š” ๋ชจ๋ธ ์‚ฌ์šฉ (5)

์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ณ ์š”.

JSP๋Š” ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๋Š” View์˜ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ .

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋กœ์ง๊ณผ ๋ทฐ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์˜ˆ์š”.

MVC Model2 ๋ฐœ์ „ํ˜•ํƒœ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ”„๋ก ํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๊ณ  ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค๊ฐ€ ๋‹ค ๋ฐ›์•„์š”.

์ด ์„œ๋ธ”๋ฆฟ์€ ๋”ฑ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์š”. ์ด๊ฒŒ ๋ชจ๋“  ์š”์ฒญ์„ ๋‹ค ๋ฐ›์ง€๋งŒ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ๋งŒ ๋ฐ›๊ณ  ์‹ค์ œ ์ผ์€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„์š”.

์‹ค์ œ ์ผ์€ ์—ฌ๊ธฐ์— ๋‚˜์˜ค๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌ์ผœ์„œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ํ˜น์€ ํ•ธ๋“ค๋Ÿฌ ํด๋ž˜์Šค๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๊ธฐ๋„ ํ•ด์š”.

์„œ๋ธ”๋ฆฟ์€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์กฐ๊ธˆ ๋ถˆํŽธํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์ด๋Ÿฐ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์š”์ฒญ์€ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๊ณ  ๊ทธ ์š”์ฒญ์˜ ์‹ค์ œ ์ฒ˜๋ฆฌ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ˜น์€ ํ•ธ๋“ค๋Ÿฌ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•จ์œผ๋กœ์จ ๊ด€๋ จ๋œ URL์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ๋‹ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒŒ ๋ผ์š”.

์ด๋Ÿฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Java bean ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์—๋‹ค ๋‹ด๊ณ  ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ๋ณด๋‚ด๋ฉด ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์•Œ๋งž์€ ๋ทฐ์—๊ฒŒ ๋ชจ๋ธ์„ ์ „๋‹ฌํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Spring Web Module

Model2 MVC ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” Spring Module

์•ž์—์„œ ์–˜๊ธฐํ•œ ๋ชจ๋ธ 2์˜ ๋ฐœ์ „๋œ ํ˜•ํƒœ๊ฐ€ Spring ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋“ˆ ์ค‘์— ํ•˜๋‚˜์ธ Web ๋ชจ๋“ˆ์— ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ๊ณ ์š”. ์ด๋Ÿฌํ•œ Web ๋ชจ๋“ˆ์„ ๋ณดํ†ต Spring MVC๋ผ๊ณ  ํ•ด์š”.


2) Spring MVC๊ตฌ์„ฑ์š”์†Œ

Spring MVC ๊ธฐ๋ณธ ๋™์ž‘ ํ๋ฆ„

ํŒŒ๋ž‘: ์ œ๊ณต, ๋ณด๋ผ: ๊ฐœ๋ฐœ์ž์ง์ ‘, ๋…น์ƒ‰: ๋‘˜ ๋‹ค

DispatcherServlet

  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ (Front Controller)

  • ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์€ ํ›„ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ๋„˜๊ธฐ๊ณ  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

  • DispathcerServlet์€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

DispatcherServlet ๋‚ด๋ถ€ ๋™์ž‘ํ๋ฆ„

์š”์ฒญ ์„ ์ฒ˜๋ฆฌ ์ž‘์—…์‹œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ
org.springframework.web.servlet.LocaleResolver

  • ์ง€์—ญ ์ •๋ณด๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ์ „๋žต ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

  • ๋””ํดํŠธ์ธ AcceptHeaderLocalResolver๋Š” HTTP ํ—ค๋”์˜ ์ •๋ณด๋ฅผ ๋ณด๊ณ  ์ง€์—ญ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

org.springframework.web.servlet.FlashMapManager

  • FlashMap๊ฐ์ฒด๋ฅผ ์กฐํšŒ(retrieve) & ์ €์žฅ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

  • RedirectAttributes์˜ addFlashAttribute๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅํ•œ๋‹ค.

  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ›„ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด ๋ฐ”๋กœ ์ •๋ณด๋Š” ์‚ญ์ œ๋œ๋‹ค.

org.springframework.web.context.request.RequestContextHolder

  • ์ผ๋ฐ˜ ๋นˆ์—์„œ HttpServletRequest, HttpServletResponse, HttpSession ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ผ๋ฐ˜ ๋นˆ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, Web์— ์ข…์†์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

org.springframework.web.multipart.MultipartResolver

  • ๋ฉ€ํ‹ฐํŒŒํŠธ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „๋žต

์š”์ฒญ ์ „๋‹ฌ์‹œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ

org.springframework.web.servlet.HandlerMapping

  • HandlerMapping๊ตฌํ˜„์ฒด๋Š” ์–ด๋–ค ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.

  • ๋””ํดํŠธ๋กœ ์„ค์ •๋˜๋Š” ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ๋งคํ•‘์€ BeanNameHandlerMapping๊ณผ DefaultAnnotationHandlerMapping 2๊ฐ€์ง€๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

org.springframework.web.servlet.HandlerExecutionChain

  • HandlerExecutionChain๊ตฌํ˜„์ฒด๋Š” ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋œ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ฆ‰, ๋ฌด์—‡์ด ์‹คํ–‰๋˜์–ด์•ผ ๋ ์ง€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰์ „๊ณผ ์‹คํ–‰ํ›„์— ์ˆ˜ํ–‰๋  HandlerInterceptor๋„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

org.springframework.web.servlet.HandlerAdapter

  • ์‹ค์ œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋Š” ์„ ํƒ๋œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‘๋‹ต์„ ModelAndView๋กœ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋‹ค.

  • ๋””ํดํŠธ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ์–ด๋Œ‘ํ„ฐ๋Š” HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHanlderAdapter 3๊ฐ€์ง€์ด๋‹ค.

  • @RequestMapping๊ณผ @Controller ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ •์˜๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ DefaultAnnotationHandlerMapping์— ์˜ํ•ด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๊ฒฐ์ •๋˜๊ณ , ๊ทธ์— ๋Œ€์‘๋˜๋Š” AnnotationMethodHandlerAdapter์— ์˜ํ•ด ํ˜ธ์ถœ์ด ์ผ์–ด๋‚œ๋‹ค.

์š”์ฒญ ์ฒ˜๋ฆฌ์‹œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ

org.springframework.web.servlet.ModelAndView

  • ModelAndView๋Š” Controller์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ view์™€ view์—์„œ ์‚ฌ์šฉํ•  ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

org.springframework.web.servlet.RequestToViewNameTranslator

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ ์ด๋ฆ„์ด๋‚˜ ๋ทฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ URL๊ณผ ๊ฐ™์€ ์š”์ฒญ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ž๋™์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ „๋žต ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. ๋””ํดํŠธ๋Š” DefaultRequestToViewNameTranslator์ด๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ์‹œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ

org.springframework.web.servlet.handlerexceptionresolver

  • ๊ธฐ๋ณธ์ ์œผ๋กœ DispatcherServlet์ด DefaultHandlerExceptionResolver๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

  • HandlerExceptionResolver๋Š” ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์กŒ์„ ๋•Œ ์–ด๋–ค ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๋ทฐ ๋ Œ๋”๋ง ๊ณผ์ •์‹œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ

org.springframework.web.servlet.ViewResolver

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฆฌํ„ดํ•œ ๋ทฐ ์ด๋ฆ„์„ ์ฐธ๊ณ ํ•ด์„œ ์ ์ ˆํ•œ ๋ทฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๋กœ์ง์„ ๊ฐ€์ง„ ์ „๋žต ์˜คํ”„์ ํŠธ์ด๋‹ค.

  • ๋ทฐ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


3) Spring MVC๋ฅผ ์ด์šฉํ•œ ์›น ํŽ˜์ด์ง€ ์ž‘์„ฑ ์‹ค์Šต

ํ”„๋กœ์ ํŠธ ์ด๋ฆ„: mvcexam04

 

pom.xml์€ ๋งํฌ์—์„œ ๋ณด๊ธฐ

 

error log1 - Dynamic Web Module ๋ฒ„์ „ ๋ฐ”๊พธ๊ธฐ

.settings/org.eclipse.wst.common.project.facet.core.xml ํŒŒ์ผ์— jst.web ๋ฒ„์ „ 2.3 -> 3.1๋กœ ๋ฐ”๊พธ๊ณ  ์—…๋ฐ์ดํŠธ ์ดํด๋ฆฝ์Šค ์žฌ์‹œ์ž‘

<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
  <fixed facet="wst.jsdt.web"/>
  <installed facet="jst.web" version="3.1"/>
  <installed facet="wst.jsdt.web" version="1.0"/>
  <installed facet="java" version="1.8"/>
</faceted-project>

web.xml์˜ ๋ฒ„์ „ ๋ฐ”๊พธ๊ธฐ

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

<faceted-project>
  <fixed facet="wst.jsdt.web"/>
  <installed facet="jst.web" version="3.1"/>
  <installed facet="wst.jsdt.web" version="1.0"/>
  <installed facet="java" version="1.8"/>
</faceted-project>

 

error log2 - jsp ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ›„ 404 ์—๋Ÿฌ

 

WEB-INF/views ํด๋” ๋‚ด์— jsp ํŒŒ์ผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ํŒŒ์ผ๋ช…์— ์˜คํƒ€๊ฐ€ ๋‚˜์„œ ์ด๋ฆ„ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ ๊ณ„์† 404์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ ๋ฐœํ–‰.ํ•ด๊ฒฐ์ฑ…: ํŒŒ์ผ ์‚ญ์ œ ํ›„ JSP File์„ ํ†ตํ•ด ์ •ํ™•ํ•œ ์ด๋ฆ„์œผ๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ธฐ

 

error log3 ํ•œ๊ธ€ ๊นจ์ง _ web.xml์— ์ฒจ๋ถ€ (web-app ํƒœ๊ทธ ์•ˆ์—)

    <filter-name>encodingFilter</filter-name>

    <filter-class>

        org.springframework.web.filter.CharacterEncodingFilter

</filter-class>

<init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

</init-param>
    <filter-name>encodingFilter</filter-name>

    <url-pattern>/\*</url-pattern>

 

DispatcherServlet์„ FrontController๋กœ ์„ค์ •ํ•˜๊ธฐ (3๊ฐ€์ง€ ๋ฐฉ๋ฒ•)

  • web.xml ํŒŒ์ผ์— ์„ค์ • (๋งŽ์ด ์‚ฌ์šฉ, ๋˜ ๋‹ค์‹œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰จ)

 ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•, web.xml ํŒŒ์ผ์— spring ์„ค์ • ์ฝ์–ด๋“ค์ด๋„๋ก DispathcerServlet์„ค์ •

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•, Java config(ํด๋ž˜์Šค)๋ฅผ spring ์„ค์ • ์ฝ์–ด๋“ค์ด๋„๋ก DispathcerServlet์„ค์ • (๊ฐ•์˜์—์„œ ์ง„ํ–‰ํ•œ ์‹ค์Šต)

  • javax.servlet.ServletContainerInitializer ์‚ฌ์šฉ (๊ฐ•์˜์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š์Œ)

    • ์„œ๋ธ”๋ฆฟ 3.0 ์ŠคํŽ™ ์ด์ƒ์—์„œ web.xmlํŒŒ์ผ์„ ๋Œ€์‹ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • Spring MVC๋Š” ServletContainerInitializer๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” SpringServletContainerInitializer๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • SpringServletContainerInitializer๋Š” WebApplicationInitializer ๊ตฌํ˜„์ฒด๋ฅผ ์ฐพ์•„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ onStartup ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    • ๊ทธ๋ž˜์„œ ๋งจ ์ฒ˜์Œ ์‹คํ–‰ ์‹œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค.

  • org.springframework.web.WebApplicationInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉ (๋งŽ์ด ์‚ฌ์šฉ)

 

Spring MVC ์„ค์ •

kr.or.connect.webmvc.config.WebMvcContextConfiguration

error log4 - implements WebMvcConfigurer์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค.

public class WebMvcContextConfiguration implements WebMvcConfigurer 

public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter

๋‘˜ ์ค‘ ๋˜๋Š” ๊ฑธ๋กœ ํ•˜์ž

 

### ๊ด€๋ จ ์„ค๋ช…

@Configuration

  • org.springframework.context.annotation์˜ Configuration ์• ๋…ธํ…Œ์ด์…˜๊ณผ Bean ์• ๋…ธํ…Œ์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ƒˆ๋กœ์šด ๋นˆ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

@EnableWebMvc

  • DispatcherServlet์˜ RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter ๋“ฑ Web์— ํ•„์š”ํ•œ ๋นˆ๋“ค์„ ๋Œ€๋ถ€๋ถ„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

  • xml๋กœ ์„ค์ •์˜ mvc:annotation-driven/ ์™€ ๋™์ผํ•˜๋‹ค.(์ˆ˜์—… ์•ˆ๋‹ค๋ฃธ)

  • ๊ธฐ๋ณธ ์„ค์ • ์ด์™ธ์˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค๋ฉด WebMvcConfigurerAdapter ๋ฅผ ์ƒ์†๋ฐ›๋„๋ก Java config class๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋„๋ก ํ•œ๋‹ค.

WebMvcConfigurationSupport ์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด

@ComponentScan

  • ComponentScan์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด Controller, Service, Repository, Component์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • DefaultAnnotationHandlerMapping๊ณผ RequestMappingHandlerMapping๊ตฌํ˜„์ฒด๋Š” ๋‹ค๋ฅธ ํ•ธ๋“œ๋Ÿฌ ๋งคํ•‘๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ •๊ตํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๋‘ ๊ฐœ์˜ ๊ตฌํ˜„์ฒด๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๋งคํ•‘ ๊ด€๊ณ„๋ฅผ ์ฐพ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋“ค ๊ตฌํ˜„์ฒด๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ฆ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ๋นˆ์—์„œ RequestMapping์• ๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ ์ฐพ์•„ HandlerMapping๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

  • HandlerMapping์€ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์–ด๋Š ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „๋‹ฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • DefaultAnnotationHandlerMapping์€ DispatcherServlet์ด ๊ธฐ๋ณธ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋ณธ ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘ ๊ฐ์ฒด์ด๊ณ , RequestMappingHandlerMapping์€ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

WebMvcConfigurer

  • org.springframework.web.servlet.config.annotation.WebMvcConfigurer

  • @EnableWebMvc ๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์ด ๋ชจ๋‘ ์ž๋™์œผ๋กœ ๋˜์ง€๋งŒ, ๊ธฐ๋ณธ ์„ค์ • ์ด์™ธ์˜ ์„ค์ •์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ํด๋ž˜์Šค(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ƒ์† ๋ฐ›์€ ํ›„, ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

Controller(Handler) ํด๋ž˜์Šค ์ž‘์„ฑํ•˜๊ธฐ (์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค)

  • @Controller ์• ๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค ์œ„์— ๋ถ™์ธ๋‹ค.

  • ๋งตํ•‘์„ ์œ„ํ•ด @RequestMapping ์• ๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

@RequestMapping

  • Http ์š”์ฒญ๊ณผ ์ด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ Controller ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

  • Http Method ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    - @RequestMapping(value="/users", method=RequestMethod.POST)
    - From Spring 4.3 version (@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping)

  • Http ํŠน์ • ํ•ด๋”์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    - @RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json")

  • Http Parameter ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    - @RequestMapping(method = RequestMethod.GET, params = "type=raw")

  • Content-Type Header ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    - @RequestMapping(method = RequestMethod.GET, consumes = "application/json")

  • Accept Header ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    - @RequestMapping(method = RequestMethod.GET, produces = "application/json")

Controller์ž‘์„ฑ ์‹ค์Šต

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/mvcexam/plusform ์ด๋ผ๊ณ  ์š”์ฒญ์„ ๋ณด ๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ 2๊ฐœ์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ์ฐฝ๊ณผ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ํ™”๋ฉด์„ ์ถœ๋ ฅํ•œ๋‹ค.

  2. ์›น ๋ธŒ๋ผ์šฐ์ €์— 2๊ฐœ์˜ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด http://localhost:8080/mvcexam/plus URL๋กœ 2๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์ด POST๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ์„œ๋ฒ„๋Š” 2๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ ๊ฐ’์„ JSP์—๊ฒŒ request scope์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

Spring MVC๊ฐ€ ์ง€์›ํ•˜๋Š” Controller๋ฉ”์†Œ๋“œ ์ธ์ˆ˜ ํƒ€์ž…

  • javax.servlet.ServletRequest

  • javax.servlet.http.HttpServletRequest

  • org.springframework.web.multipart.MultipartRequest

  • org.springframework.web.multipart.MultipartHttpServletRequest

  • javax.servlet.ServletResponse

  • javax.servlet.http.HttpServletResponse

  • javax.servlet.http.HttpSession

  • org.springframework.web.context.request.WebRequest

  • org.springframework.web.context.request.NativeWebRequest

  • java.util.Locale

  • java.io.InputStream

  • java.io.Reader

  • java.io.OutputStream

  • java.io.Writer

  • javax.security.Principal

  • java.util.Map

  • org.springframework.ui.Model

  • org.springframework.ui.ModelMap

  • org.springframework.web.multipart.MultipartFile

  • javax.servlet.http.Part

  • org.springframework.web.servlet.mvc.support.RedirectAttributes

  • org.springframework.validation.Errors

  • org.springframework.validation.BindingResult

  • org.springframework.web.bind.support.SessionStatus

  • org.springframework.web.util.UriComponentsBuilder

  • org.springframework.http.HttpEntity<?>

  • Command ๋˜๋Š” Form ๊ฐ์ฒด

Spring MVC๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ธ์ˆ˜ ์• ๋…ธํ…Œ์ด์…˜

  • @RequestParam

  • @RequestHeader

  • @RequestBody

  • @RequestPart

  • @ModelAttribute ์‚ฌ์šฉ์˜ˆ์‹œ๋Š” UserController

  • @PathVariable

  • @CookieValue

@RequestParam ์‚ฌ์šฉ์˜ˆ์‹œ๋Š” PlusController

  • Mapping๋œ ๋ฉ”์†Œ๋“œ์˜ Argument์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

  • @RequestParam์˜ name์—๋Š” http parameter์˜ name๊ณผ ๋ฉฅํ•‘

  • @RequestParam์˜ required๋Š” ํ•„์ˆ˜์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จ

@PathVariable ์‚ฌ์šฉ์˜ˆ์‹œ๋Š” GoodsController

  • @RequestMapping์˜ path์— ๋ณ€์ˆ˜๋ช…์„ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•œ place holder๊ฐ€ ํ•„์š”ํ•จ

  • place holder์˜ ์ด๋ฆ„๊ณผ PathVariable์˜ name ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด mapping ๋จ

  • required ์†์„ฑ์€ default true ์ž„

@RequestHeader

  • ์š”์ฒญ ์ •๋ณด์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ์ฝ์–ด๋“ค ์ผ ๋•Œ ์‚ฌ์šฉ

  • @RequestHeader(name="ํ—ค๋”๋ช…") String ๋ณ€์ˆ˜๋ช…

Spring MVC๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋ฆฌํ„ด ๊ฐ’

  • org.springframework.web.servlet.ModelAndView

  • org.springframework.ui.Model

  • java.util.Map

  • org.springframework.ui.ModelMap

  • org.springframework.web.servlet.View

  • java.lang.String

  • java.lang.Void

  • org.springframework.http.HttpEntity<?>

  • org.springframework.http.ResponseEntity<?>

  • ๊ธฐํƒ€ ๋ฆฌํ„ด ํƒ€์ž…

'Spring > Boost Course Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

4.4 Controller  (0) 2020.11.19
4.3 WEB API  (0) 2020.11.19
4.2 Layered Architecture  (0) 2020.11.19
3.3 Spring JDBC  (0) 2020.11.19
3.2 Spring Test  (0) 2020.11.19
3.1 Spring Core  (0) 2020.11.19