• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

Spring Web MVC 3

09 Feb 2021

๋ฐฑ๊ธฐ์„ ๋‹˜์˜ ์Šคํ”„๋ง ์›น MVC๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ฆฌํ•œ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. ์ƒ๋žต๋œ ๋‚ด์šฉ๋„ ๋งŽ๊ณ , ์‹ค์ œ ๊ฐ•์˜์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๊ตฌํ˜„๊ณผ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ์‹œ๋‹ˆ ๊นŠ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜์‹œ๊ธฐ๋ฅผ ์ ๊ทน ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC ๊ตฌ์„ฑ ์š”์†Œ

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

multipartResolver
  • ํŒŒ์ผ ์—…๋กœ๋“œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

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

๊ตฌ์ฒด์ ์œผ๋กœ๋Š” http servlet request๋ฅผ multipart http servlet request๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด ์š”์ฒญ์ด ๋‹ด๊ณ ์žˆ๋Š” ํŒŒ์ผ์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

multipartResolver์˜ ๊ตฌํ˜„์ฒด
  1. CommonsMultipartResolver
  2. StandardServletMultipartResolver (-> ์Šคํ”„๋ง๋ถ€ํŠธ default multipartResolver)

๊ธฐ๋ณธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์—๋Š” ์•„๋ฌด๋Ÿฐ multipartResolver๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€์•Š์ง€๋งŒ, ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ StandardServletMultipartResolver ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฆฌ์กธ๋ฒ„ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

localeResolver
  • ํด๋ผ์ด์–ธํŠธ ๋กœ์ผ€์ผ(์ง€์—ญ) ์ •๋ณด ํ™•์ธ

์š”์ฒญ์ด ๋””์ŠคํŒจ์ฒ˜์„œ๋ธŒ๋ฆฟ์— ๋“ค์–ด์™”์„ ๋•Œ, ์š”์ฒญ์„ ๋ถ„์„ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ๋กœ์ผ€์ผ ๋ฆฌ์กธ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š” ์š”์ฒญ์ด ์–ด๋А ์ง€์—ญ์—์„œ ์˜จ๊ฑด์ง€ ํ™•์ธํ•˜๋Š”, ์ง€์—ญ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€์—ญ์— ๋”ฐ๋ผ์„œ ์ง€์—ญ์— ํ•ด๋‹นํ•˜๋Š” ์ ์ ˆํ•œ ์ง€์—ญ์–ธ์–ด์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌํ˜„์ฒด๋Š” ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ๊ธฐ์ค€์œผ๋กœ AcceptHeader ๊ตฌํ˜„์ฒด์ด๋‹ค. ์š”์ฒญ์— ๋“ค์–ด์žˆ๋Š” accept-language๋ฅผ ์ด์šฉํ•ด์„œ ์˜์–ด๊ถŒ์ธ์ง€, ํ•œ๊ตญ์–ด๊ถŒ์ธ์ง€ ๋“ฑ๋“ฑ์„ ํŒ๋‹จํ•œ๋‹ค. ์ด ์™ธ์—๋„ Session๊ธฐ๋ฐ˜์œผ๋กœ ํŒ๋‹จํ•˜๋Š” SessionLocaleResolver ๋“ฑ๋„ ์žˆ๋‹ค.

ThemeResolver
  • css์™€ script๋ฅผ ๋ฐ”๊พผ๋‹ค (ex. ๋‹คํฌ๋ชจ๋“œ)

๊ทธ ๋‹ค์Œ์€ ํ…Œ๋งˆ๋ฆฌ์กธ๋ฒ„ ThemeResolver์ธ๋ฐ, ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด css์™€ script๊ฐ€ ์ƒฅ ๋ฐ”๋€Œ๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์Šคํ”„๋ง MVC๋Š” Theme์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค˜์„œ, Theme์ด๋ผ๋Š” ํ‚ค๊ฐ’์„ ๋ทฐ์— ์ „๋‹ฌํ•˜๊ณ  ๋ทฐ๊ฐ€ ๊ทธ ํ‚ค๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ ์ ˆํ•œ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ๊ฐ€๋ น ์ ์ ˆํ•œ css๋ฅผ ์ฝ์–ด์™€์„œ, ํ™”๋ฉด์˜ ํ…Œ๋งˆ, ์ „์ฒด์ ์ธ ๋ถ„์œ„๊ธฐ๋ฅผ ํ…Œ๋งˆ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ThemeResolver๋Š” Cookie, Session, Fixed๊ฐ€ ์žˆ๋Š”๋ฐ ๊ธฐ๋ณธ๊ฐ’์€ Fixed๋กœ ์‚ฌ์‹ค์ƒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

HandlerMapping
  • ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๊ทธ ์š”์ฒญ์„ ํ‘œํ˜„ํ•˜๋Š”, ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค

HandlerMapping์€ ๋งŽ์ด ๋‹ค๋ค˜์œผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ฃฌ๋‹ค. ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๊ทธ ์š”์ฒญ์„ ํ‘œํ˜„ํ•˜๋Š”, ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์š”์ฒญ์„ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น/์•ฑ์œผ๋กœ ํ—ฌ๋กœ ๋ผ๊ณ  ๋ณด๋‚ด๋ฉด HandlerMapping์ด ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ค€๋‹ค. ์ดํ›„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ(ํ•ธ๋“ค๋Ÿฌ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์ž์ฒด๊ฐ€ ๋ฆฌํ„ด์ด ๋œ๋‹ค. ์ด๋Ÿฐ ๊ฑธ ํ•ด์ฃผ๋Š”๊ฒŒ HandlerMapping์ด ํ•ด์ฃผ๋Š” ์ผ์ด๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋งคํ•‘์ด ํ•ด์ฃผ๋Š” ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐœ๊ฐ€ ๋“ฑ๋ก์ด ๋œ๋‹ค.

  1. RequestMappingHandler๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๊ฒƒ
  2. BeanNameUrlHandler๋Š” ๋นˆ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ์ด ์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ์ด ์žˆ๋Š”๊ฐ€ ์—†๋Š”๊ฐ€๋ฅผ ์ฐพ๋Š”๋‹ค.
HandlerAdapter
  • ๊ฐ๊ฐ์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค

๊ทธ๋‹ค์Œ์— ์ฐพ์•„๋ณผ HandlerAdapter๋Š” ๊ฐ๊ฐ์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์Šคํ”„๋ง MVC ํ™•์žฅ๋ ฅ์˜ ํ•ต์‹ฌ์ด๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํŽ‘์…˜ ์Šคํƒ€์ผ๋กœ ์ •์˜ํ•˜๊ณ , ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋™์ž‘ํ•œ๋‹ค.

HandlerExceptionResolver
  • ํ•ธ๋“ค๋Ÿฌ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค

์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ MVC๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹  ๋ถ„๋“ค์€ ExceptionHandler๋ผ๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ํ•ด๋ณด์…จ์„ํ…๋ฐ์š”. ์ด๋ ‡๊ฒŒ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋‚˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ต์…‰์…˜ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ต์„ผ์…ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ต์…‰์…˜ ๋ฆฌ์กธ๋ฒ„๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ExceptionHandlerExceptionResolver๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค. @ExceptionHandler ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‚˜์ค‘์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

RequestToViewNameTransrator
  • ๋ทฐ ์ด๋ฆ„์„ ์ถ”์ธกํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

RequestToViewNameTransrator๋Š”, ๋ฆฌํ„ด๊ฐ’์ธ ๋ทฐ ์ด๋ฆ„์„ ์ƒ๋žตํ•ด๋„ ์š”์ฒญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒ๋‹จํ•ด์ค๋‹ˆ๋‹ค. ๋ทฐ ์ด๋ฆ„์„ ๋ฆฌํ„ดํ•  ๋•Œ ์•ˆ์คฌ๋Š”๋ฐ, ํ˜น์€ ModelAndView์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์œผ๋กœ viewName์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š”, ์Šคํ”„๋ง์€ ์š”์ฒญ์„ ๊ฐ–๊ณ  ํŒ๋‹จ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ น sample๋กœ ๋“ค์–ด์™”์œผ๋‹ˆ๊นŒ, ๋ทฐ ์ด๋ฆ„๋„ sample์ด๊ฒ ์ง€? ํ•˜๋Š” ๊ธฐ๋ณธ ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๊ฐ€ DefaultRequestToViewNameTransrator ํ•˜๋‚˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์—์„œ ๋ทฐ ์ด๋ฆ„์„ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค์˜€๊ตฌ์š”.

ViewResolver
  • ๋ทฐ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค

ViewResolver๋Š” ๋ทฐ ์ด๋ฆ„์ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌํ„ด๋˜๋“ , ์š”์ฒญ์—์„œ ๋ทฐ ์ด๋ฆ„์„ ์ถ”์ธกํ•˜๋˜, ๋ทฐ ์ด๋ฆ„์ด ๋‚˜์˜ค๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋ทฐ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” InternalResourceViewResolver๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ๋“ฑ๋ก์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ๋Š” ํ•˜๋‚˜๋งŒ ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” ๋ทฐ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์ข€ ๋” ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๊ตฌ์š”. InternalResourceViewResolver๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JSP๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๊ฐ€ jsp๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

FlashMapManager
  • FlashMapManager๋Š” ํ™”๋ฉด์—์„œ ๋ฆฌํ”„๋ ˆ์‹œํ–ˆ์„ ๋•Œ, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋˜ ๋ณด๋‚ด์˜ค์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ํŒจํ„ด -> url path๋‚˜ url request parameter ๋“ฑ์œผ๋กœ ์ด๋ฏธ ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ์„ธ์…˜์— ์ €์žฅํ•ด๋‘๊ณ , ์ค‘๋ณต ์ „์†ก์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋“ฏ?

FlashMapManager๋Š” ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ์Šคํ”„๋ง ์ดˆ๊ธฐ, ๋Œ€๋žต 2003๋…„๋ถ€ํ„ฐ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „์ด ๋ช…์‹œ๋˜์–ด์žˆ์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์žˆ๋˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

redirect๋ฅผ ํ•  ๋•Œ, ๋ณดํ†ต ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ , ์š”์ฒญํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๊ทธ๊ฑธ ์ €์žฅ์„ ํ•˜๊ณ  redirect๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. redirect๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ™”๋ฉด์—์„œ ๋ฆฌํ”„๋ ˆ์‰ฌ๋ฅผ ํ•  ๋•Œ ์š”์ฒญ ๋ฐ์ดํ„ฐ ๋“ฑ์ด ๋˜ ๋„˜์–ด์˜ค๊ณ , ๊ทธ๊ฑธ ๋งค๋ฒˆ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค. FlashMapManager๋Š” ํ™”๋ฉด์—์„œ ๋ฆฌํ”„๋ ˆ์‹œํ–ˆ์„ ๋•Œ, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋˜ ๋ณด๋‚ด์˜ค์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ํŒจํ„ด์ด๋‹ค.

post ์š”์ฒญ์„ ๋ฐ›์€ ๋‹ค์Œ์—๋Š” ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ํ•˜๊ณ , get ์š”์ฒญ์œผ๋กœ redirect๋ฅผ ํ•˜๋Š” ๊ฑฐ์—์š”. ๊ทธ๋ž˜์„œ GETํ•ด์„œ VIEW๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑฐ์ฃ . ๊ทธ๋Ÿผ ๊ทธ ์ƒํ™ฉ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฆฌํ”„๋ ˆ์‹œ๋ฅผ ํ•ด๋„, ๋‹ค์‹œ ํ•œ ๋ฒˆ form ์„œ๋ธŒ๋ฏธ์…˜์ด ์ผ์–ด๋‚˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ get ์š”์ฒญ์ด ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ€๊ฒŒ ๋˜๋Š”๊ฑฐ์ฃ . ๊ทธ๋Ÿฐ ์‹์œผ๋กœ form ์„œ๋ธŒ๋ฏธ์…˜ ์ค‘๋ณต์„ ์กฐ๊ธˆ์ด๋ผ๋„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํŒจํ„ด์ด๋‹ค.

์Šคํ”„๋ง MVC ๋™์ž‘ ์›๋ฆฌ ๋งˆ๋ฌด๋ฆฌ

  • ์ฒ˜์Œ์—” ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ web.xml๋„ ์—†๊ณ  ๊ทธ๋ƒฅ SpringBooTApplication์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด main method๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ , ์ปจํŠธ๋กค๋Ÿฌ์™€ ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉ

  • ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋ฐ˜์—๋Š” ์„œ๋ธ”๋ฆฟ์ด!

๊ฒฐ๊ตญ์—๋Š” ์Šคํ”„๋ง mvc, ์›น mvc๋„ ์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ณ , ๋”ฐ๋ผ์„œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์•„์ฃผ ์ „ํ˜•์ ์ธ ์„œ๋ธ”๋ฆฟ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์Šคํ”„๋ง mvc๋ฅผ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์„œ๋ธ”๋ฆฟ์„ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰์„ ํ•ด๋ดค๊ณ , ๊ทธ ์„œ๋น„์Šค๊ฐ€ delegation(์œ„์ž„)ํ•˜๋Š” post, do get ๋“ฑ์„ ์‚ฌ์šฉํ•ด๋ณด์•˜๊ตฌ์š”. filter์™€ listner๋„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ–ˆ๋˜๊ฑด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ž…๋‹ˆ๋‹ค. ์ด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์˜ ๋™์ž‘์›๋ฆฌ, ํŠนํžˆ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋“ค์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ์„ ๋ชจ๋‘ ์ฐพ์•„์„œ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ „๋žต์ด ์—†๋‹ค๋ฉด DispatcherServlet.properties์— ์ •์˜๋œ ๊ธฐ๋ณธ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. web.xml์— ์ง€๊ธˆ๊นŒ์ง€๋Š” ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋ก์„ ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค web.xml์—†์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.

web.xml์„ ๋Œ€์ฒดํ•˜์—ฌ ์ž๋ฐ” ์ฝ”๋“œ๋กœ Dispatcher Servlet์„ ๋“ฑ๋กํ•˜๋Š” ๋ฒ•

public class WebApplication implements WebApplicationInitializer {
    @Override
    public void onStartUp(ServletContext servletContext) throws ServletException {
        // ์ด ์•ˆ์—์„œ ์„œ๋ธ”๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋“ฑ๋กํ•œ๋‹ค.
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(WebConfig.calss);
        context.refresh();
        
        DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic dynamic = servletContext.addServlet("app", dispatcherServlet); //๋“ฑ๋ก
        app.addMapping("/app/*"); //๋งคํ•‘
    }
}

dispatcher servlet์„ ๋งŒ๋“ค ๋•Œ ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋“ฑ๋ก์„ ํ•ด์ฃผ๊ณ , ๋งคํ•‘์„ ํ•œ๋‹ค. ์œ„์ฒ˜๋Ÿผ web.xml๋ง๊ณ , ์ž๋ฐ” ํŒŒ์ผ๋งŒ์„ ๊ฐ–๊ณ ๋„ ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์Šคํ”„๋ง 3.1, ์„œ๋ธ”๋ฆฟ 3.0 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Dispatcher Servlet์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ†ฐ์บฃ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์— Dispatcher Servlet์ด ๋“ค์–ด๊ฐ€๋Š” ํ˜•ํƒœ์ธ๊ฑฐ๊ณ ,

์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ œ์ผ ์ฒ˜์Œ ๋งŒ๋“ค์—ˆ๋˜ ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘์„ ํ•  ๋•Œ, ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ์ด๋ผ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž„๋ฒ ๋””๋“œ ํ˜•ํƒœ๋กœ(์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ข…์†๋˜๋Š” ํ˜•ํƒœ๋กœ) ๊ตฌ๋™์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ์— ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋ก์„ ํ•ด์ค๋‹ˆ๋‹ค.

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์ด์ฒ˜๋Ÿผ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๊ฐ–๊ณ ์žˆ๋Š” ์ฃผ๊ด€์ด ์žˆ์–ด์š”. ์Šคํ”„๋ง ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€, ์ด๋Ÿฌํ•œ ์„ค์ •์ด ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค๋ผ๋Š” ์ฃผ๊ด€์— ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•ด๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ น ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋„ ์žˆ์„ ๊ฒƒ์ด๊ตฌ์š”. ๋ทฐ ๋ฆฌ์กธ๋ฒ„๊ฐ„์˜ ์ˆœ์„œ, ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์“ธ์ง€ ๋“ฑ๋“ฑ๋„ ๊ฐœ๋ฐœ์ž๋“ค์ด ํŽธ๋ฆฌํ•˜๋„๋ก ์„ค์ •์„ ํ•ด๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง MVC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ๋„ˆ๋ฌด ๊ธฐ์ดˆ์ ์ธ ์ˆ˜์ค€์˜ ๊ธฐ๋ณธ ์ „๋žต๋งŒ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉ์„ ํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ์ผ์ผํžˆ, ํŠนํžˆ ์œ ์šฉํ•œ ViewResolver๋“ค์„ ์–ผ๋งˆ๋‚˜ ๊ผผ๊ผผํžˆ, ๋งŽ์ด ์„ค์ •์„ ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ๋•Œ์—๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ๋งˆ์น˜ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•ด๋„ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ž๋™์„ค์ •ํŒŒ์ผ์— ์˜ํ•˜์—ฌ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC ๋นˆ ์„ค์ •

์ด์ „ ์ฒซ๋ฒˆ์งธ ํŒŒํŠธ๋ฅผ ํ•™์Šตํ•˜์‹  ๋ถ„๋“ค์€ ์ดํ•ดํ•˜์‹œ๊ฒ ์ง€๋งŒ, ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋Œ€์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ๊ณผ properties์— ์ •์˜๋˜์–ด์žˆ๋Š” ๊ธฐ๋ณธ์ „๋žต์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ „๋žต์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค๋“ค์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์ ์šฉ์ด ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ ๋ฆฌ์†Œ์Šค ๋ทฐ ๋ฆฌ์กธ๋ฒ„์˜ ๊ฒฝ์šฐ์—๋Š” ํ”„๋ฆฌํ”ฝ์Šค์™€ ์„œํ”ฝ์Šค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„ค์ •๋˜์–ด์žˆ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ setPrefix, setSuffix๋กœ ์„ค์ •์„ ํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€๋ถ€๋ถ„์˜ ๋นˆ๋“ค์ด ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ๊ฐ’๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@Bean
public Handlermapping handlerMapping() {
    RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
    return handlerMapping;
}

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

@Bean
public HandlerMapping handlerMapping() {
    RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
    handlerMapping.setInterceptors();
    handlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return handlerMapping;
}

setInterceptors : ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์€ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜€์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „, ๋˜๋Š” ์ดํ›„์— ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ๋น„์Šทํ•œ ํ•ธ๋“ค๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์„ค์ •ํ•ด์ค„ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ์ˆ˜ ์žˆ๊ตฌ์š”, ๊ทธ๋ž˜์„œ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์žฅ์ ์„ ๋”์šฑ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๊ตฌ์š”.

ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์—๋‹ค๊ฐ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ตฌ์š”. setOrder๋ผ๋Š” ๊ฑด ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„(order)๊ฐ€ ๋†’์€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งคํ•‘ํ•ด์˜ค๊ณ , ์ฐพ๊ฒŒ๋˜๋ฉด ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋”๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ์˜ค๋”๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ตฌ์š”. ๊ฐ€๋ น Ordered.HIGHEST_PRECEDENCE๋ฅผ ์ฃผ๋ฉด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ ์ธํ„ฐ์…‰ํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ž ์‹œ ๋’ค์— ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์—์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Bean
public HandlerAdapter handlerAdapter() {
    RequestMapingHandlerAdapter handlerAdapter = new RequestMapingHandlerAdapter();
    handlerAdapter.set
    return handlerAdapter;
}

ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์—ฌ๋Ÿฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ น ArgumentResolver๋ฅผ ์‚ฌ์šฉํ•ด ์›ํ•˜๋Š” argument๋ฅผ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, MessageConveters๋ฅผ ์‚ฌ์šฉํ•ด ์š”์ฒญ ๋ณธ๋ฌธ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ’์„ Message Body๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ”์ธ๋”ฉํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ResponseBody์˜ ๊ฒฝ์šฐ์—๋„ MessageConverters๋ฅผ ์‚ฌ์šฉํ•˜๊ตฌ์š”.

์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์ผ์ผํžˆ ์„ค์ •์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋นˆ ์„ค์ •์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์–˜๋„ค๋“ค์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’๋“ค๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Message Converter๋“ค์— ์ถ”๊ฐ€๋˜๋Š” ์ปจ๋ฒ„ํ„ฐ๋“ค์ด ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” stringHttpMessageConverter ์—ญ์‹œ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๋นˆ ์„ค์ •์„ ์ง์ ‘ ํ•˜์ง„ ์•Š๊ณ , ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ด์ „์—๋„ ์Šคํ”„๋ง MVC์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์กฐ๊ธˆ ๋” ํŽธํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ผ์ผํžˆ ๋นˆ์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๊ตฌ๋‚˜, ์ •๋„๋ฉด ์•„์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@EnableWebMvc

  • ์ผ์ผํžˆ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹ 
  • MVC์™€ ๊ฐ™์€ ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ์šฉ๋„ ํŽธ๋ฆฌํ•˜๋„๋ก ์Šคํ”„๋ง์—์„œ ์ง€์›ํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜
  • ์‚ฌ์šฉ๋ฒ•
    1. @Configuration์ด ์žˆ๋Š” ํŒŒ์ผ์— @EnableWebMvc์„ ์ฃผ๊ณ 
    2. WebApplicationContext์— context.setServletContext(servletContext)

์ผ์ผํžˆ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์„ ํ•˜๊ธฐ๋ณด๋‹จ, ์กฐ๊ธˆ ๋” ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์„ค์ •์—์„œ, ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ, ์ฆ‰ MVC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์— ๋” ํŽธ๋ฆฌํ•˜๋„๋ก ์Šคํ”„๋ง์ด EnableWebMvc๋ผ๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์• ๋…ธํ…Œ์ด์…˜์€ Configuration์— ๊ฐ™์ด ์ฃผ๋ฉด ๋˜๊ตฌ์š”. ComponentScan์€ ์žˆ์–ด๋„ ๋˜๊ณ , ์—†์–ด๋„ ๋ฉ๋‹ˆ๋‹ค

WebApplicationContext์— context.setServletContext(servletContext)๋ฅผ ํ•˜๋Š” ์ด์œ  : @EnableWebMvc๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…์ข… ์ฐธ์กฐํ•จ. ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•ญ์ƒ ์„ค์ •์ด ๋˜์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€?

  1. EnableWebMvc๋ฅผ ํ•ด์ฃผ๋ฉด
  2. DelegatingWebMvcConfiguration์„ import
  3. DelegatingWebMvcConfiguration๊ฐ€ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฐ€๋ณด๋ฉด ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘, ๊ธฐ๋ณธ์ ์ธ Interceptor๋“ค ๋“ฑ์ด ์ถ”๊ฐ€๋˜์–ด์žˆ๋‹ค.

์ง์ ‘ Bean ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€?

์ง€๊ธˆ๊นŒ์ง€๋Š” Bean์„ ์ง์ ‘ ๋“ฑ๋กํ•ด์„œ webMVC์— ๋“ฑ๋กํ•˜๊ณ , ์ง์ ‘ ๋“ฑ๋กํ•˜์ง€์•Š์€ ๊ฒƒ์€ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ๊ณผ properties์— ์žˆ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. EnableWebMvc๋ฅผ ์“ฐ๋ฉด ์–ด๋–ป๊ฒŒ ์„ค์ •์ด ๋‹ฌ๋ผ์งˆ๊นŒ์š”? EnableWebMvc ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๊ณ , ์ด ์ƒํƒœ๋กœ ํ†ฐ์บฃ์„ ๊ตฌ๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ๋งคํ•‘๋ถ€ํ„ฐ ๋ณด๋ฉด, RequestMappingHandlerMapping์˜ order(์šฐ์„ ์ˆœ์œ„)๊ฐ€ 0์œผ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ RequestMappingHandlerMapping์œผ๋กœ ๋จผ์ € ํ™•์ธํ•˜๊ณ , BeanNameUrlHandlerMapping์œผ๋กœ ๊ทธ ๋‹ค์Œ์— ํ™•์ธ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” ์Œ์ˆ˜๋ถ€ํ„ฐ ์–‘์ˆ˜๊ฐ’์ด ์žˆ๋Š”๋ฐ, 0์ด๋ฉด ๋”ฑ ๊ฐ€์šด๋ฐ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. handlerAdapter์—์„œ๋„ RequestMappingHandlerAdapter๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์›น MVC๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์• ์ดˆ์— RequestMappingHandlerAdapter ์œ„์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ๋งŒ ํ™•์ธํ•˜๊ณ  ๋‚ฎ์€ BeanNameUrlHandlerMapping๊นŒ์ง€๋Š” ํ™•์ธํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋”์šฑ ์ตœ์ ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. handlerMappings, handlerAdapters ๋ชจ๋‘ RequestMappingHandlerMapping๊ณผ RequestMappingHandlerAdapter๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ์„ค์ •์„ ์ฃผ์–ด ์ตœ์ ํ™”๋ฅผ ์‹œํ‚ค๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๋™์ ์œผ๋กœ ๋ฉ”์„ธ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. EnableWebMvc๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€๊ฒŒ, Delegation ๊ตฌ์กฐ(์–ด๋”˜๊ฐ€์— ์œ„์ž„ํ•˜๋Š” ์‹์˜ ๊ตฌ์กฐ)๋กœ ๋นˆ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ์ด์— ๊ธฐ์กด์˜ ๋นˆ์—, HandlerMapping, Adapter์—์„œ ์ถ”๊ฐ€ํ•˜๋Š” ์„ค์ •๋“ค์ด ์†์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘, ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด ํด๋ž˜์Šค๊ฐ€ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๋งคํ•‘, ์–ด๋Œ‘ํ„ฐ์— ์กฐ๊ธˆ๋งŒ ๋” ์ˆ˜์ •์„ ํ•˜๋Š” ์‹์œผ๋กœ ๋นˆ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.



spring Share Tweet +1