๐ŸŒผ Spring ๊ธฐ์ดˆ โ‘ข - MVC ํŒจํ„ด / TIL - day 22

ํ•˜๋ฆฌ๋น„ยท2025๋…„ 3์›” 20์ผ
0

๐ŸŒผ Spring

๋ชฉ๋ก ๋ณด๊ธฐ
4/11
post-thumbnail

โ–ช๏ธMVC ํŒจํ„ด ๊ฐœ์š”โ–ช๏ธ


๐Ÿ“– Template Engine

๐Ÿ’ก๋™์ ์ธ ์›นํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ / ํ”ํžˆ ๋งํ•˜๋Š” UI (SSR์— ์‚ฌ์šฉ)

๐Ÿ“Œ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • HTML ๋ฌธ์„œ ์ค‘ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด ๋” ํŽธ๋ฆฌํ•˜๋‹ค

  • ์˜ˆ๋ฅผ ๋“ค์–ด ์›นํŽ˜์ด์ง€๊ฐ€ ์žˆ์„ ๋•Œ
    ํŠน์ • ๊ธ€์„ ์กฐํšŒํ•  ๋•Œ, ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ€ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์€ ๊ณ ์ •์ž„
    ๋ณ€ํ•ด์•ผ ํ•˜๋Š” ๊ณณ๋งŒ!! ์ฝ”๋“œ๋กœ ๋„ฃ์–ด์ค€๋‹ค

๐Ÿ“Œ ๋Œ€ํ‘œ์ ์ธ ํ…œํ”Œ๋ฆฟ ์—”์ง„

  • 1๏ธโƒฃ ํƒ€์ž„๋ฆฌํ”„ - ์Šคํ”„๋ง๊ณผ ์—ฐ๋™์ด ์ž˜๋˜๊ณ , ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๋งŽ๋‹ค
  • 2๏ธโƒฃ JSP

๐Ÿ“– MVC ํŒจํ„ด ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

๐Ÿ’ก์„œ๋ธ”๋ฆฟ๊ณผ jsp๋งŒ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ทฐ ๋ Œ๋”๋ง๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๊ตฌ์กฐ๊ฐ€ ๋„˜ ๋ณต์žกํ•จ (์œ ์ง€๋ณด์ˆ˜ ํž˜๋“ฆ)
โž ๋”ฐ๋ผ์„œ mvc (๋ชจ๋ธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ) ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค

โœ”๏ธ Servlet, JSP๋งŒ ์‚ฌ์šฉ์‹œ ๋ฌธ์ œ์ 

ServletJSP
ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋กœ์ง๊ณผ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด
ํ•˜๋‚˜์˜ Servlet ์•ˆ์— ๋‹ค ์„ž์—ฌ ๋“ค์–ด์žˆ์Œ
์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ๋ณธ html์ฝ”๋“œ๊ฐ€ ์ž๋ฐ”์ฝ”๋“œ๋ž‘ ๊ฐ™์ด ์žˆ์Œ
โž ์„œ๋ธ”๋ฆฟ์—์„œ ๋ทฐ๋งŒ ๋ถ„๋ฆฌ๋œ๊ฒƒ
๋‹ค ์„ž์ž„๋ทฐ๋Š” ๋ถ„๋ฆฌ๋˜์—ˆ์ง€๋งŒ ๋กœ์ง์ด ์„ž์ž„

๐Ÿ“– MVC ํŒจํ„ด


๐Ÿ’กํ•˜๋‚˜์˜ jsp๋‚˜ servlet์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜๊ฑธ Model , View , Controller ๋กœ ๋ถ„๋ฆฌ

  • ๐ŸŒŸ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ทฐ์˜ ์™„์ „ํ•œ ๋ถ„๋ฆฌ!!

โœ”๏ธ Controller

  • HTTP Request๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ
  • View์— ์ „๋‹ฌํ•  ๊ฒฐ๊ณผ ์กฐํšŒ ํ›„ Model์— ์ž„์‹œ์ €์žฅ
  • Layered architecture ๊ตฌ์กฐ ์ด์šฉํ•ด ์—ญํ• ์ด ๋˜ ์„ธ๋ถ„ํ™” ๋œ๋‹ค!
    • 1๏ธโƒฃ Controller Layer โž HTTP Request๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ
    • 2๏ธโƒฃ Service Layer โž ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰
    • 3๏ธโƒฃ Repository Layer โž ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ

โœ”๏ธ Model

  • View์— ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ

โœ”๏ธ View

  • Model ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด์„ Rendering

๐Ÿ“Œ MVC ํŒจํ„ด์˜ ๋ฌธ์ œ์ 

๊ธฐ๋Šฅ๋ณ„๋กœ ์„œ๋ธ”๋ฆฟ์ด ๊ณ„์† ํ•„์š”ํ•จ..

  • ์ค‘๋ณต ํ˜ธ์ถœ
  • ๋ทฐ์˜ ๊ฒฝ๋กœ๋„ ๊ณ„์† ์ž…๋ ฅํ•ด์ค˜์•ผํ•œ๋‹ค
  • ๋ฆฌํ€˜์ŠคํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฆฌ์Šคํฐ์Šค๋ฅผ ์•ˆ์”€ ( jsp๊ฐ€ ๋‹ค ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— )
  • *๊ณตํ†ต ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ ๋  ์ˆ˜๋ก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋ถ€๋ถ„์ด ๋งŽ์•„์ง
    โž ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?
    • ์ด๊ฒƒ๋„ ๋ฉ”์„œ๋“œ๋„ ์ค‘๋ณต ํ˜ธ์ถœํ•ด์•ผํ•˜๊ณ  ๊นŒ๋จน์„ ์ˆ˜๋„ ์žˆ์Œ
    • ๋ฉ”์„œ๋“œ ๋Š˜์–ด๋‚ ๋•Œ๋งˆ๋‹ค ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์—…๋ฒ”์œ„ ์ปค์ง

*๊ณตํ†ต๊ธฐ๋Šฅ?
๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ (log ์ถœ๋ ฅ, ์ธ๊ฐ€ ๋“ฑ)


๐Ÿ“– ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด

๐Ÿ’ก์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „์— ๊ณตํ†ต๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํŒจํ„ด
โž ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜๋‹ค! ๊ณตํ†ต๊ธฐ๋Šฅ์˜ ์„œ๋ธ”๋ฆฟ์„ ๊ผฌ์˜ฅ ์ง€๋‚˜๊ฐ€์•ผํ•ด

  1. ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๊ณ  ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌ
  2. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœํ•œ๋‹ค โž ์ปจํŠธ๋กค๋Ÿฌ ๋งตํ•‘
  3. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค
    ( ๋‚˜๋จธ์ง€ ์• ๋“ค์€ ์ƒ์†์ด๋‚˜ webservlet์„ ์•ˆ์จ๋„ ๋œ๋‹ค )
    โž ์‘๋‹ต์€ ์ „๋ถ€ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์–ด๋Œ‘ํ„ฐ ํ•„์š”

๐Ÿ“– ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

๐Ÿ’ก ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋„์ž…

  1. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋กœ์ง ์ฒ˜๋ฆฌ ํ›„ ๊ทธ๊ฒƒ์— ๋งž๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
  2. ๋ฐ˜ํ™˜๋œ ์‘๋‹ต์„ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ๊ณตํ†ต๋กœ์ง๊ณผ ๋งž์ถฐ ๋ณ€ํ™˜ํ•œ๋‹ค
  3. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ณตํ†ต ๋กœ์ง ์ˆ˜ํ–‰
  • ๋ชจ๋‘ ๊ฐ์ž์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค(์ฑ…์ž„๋ถ„๋ฆฌ)
  • ์ƒˆ๋กœ์šด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ ์–ด๋Œ‘ํ„ฐ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ณตํ†ต๋กœ์ง์— ์˜ํ–ฅ ์—†์Œ

๐Ÿš€ Spring MVC ํŒจํ„ด ๊ฐœ์š”

โถ Servlet๋งŒ ์‚ฌ์šฉ - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, View๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์Œ
โท JSP๋งŒ ์‚ฌ์šฉ - View๋Š” ๋ถ„๋ฆฌํ•˜์˜€์œผ๋‚˜ ๋กœ์ง์ด Jsp์— ํฌํ•จ
โธ MVC ํŒจํ„ด ์‚ฌ์šฉ - ๋ชจ๋ธ, ๋ทฐ, ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์˜€์œผ๋‚˜ ๊ณตํ†ต๊ธฐ๋Šฅ์ž„์—๋„ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต์ž…๋ ฅํ•ด์•ผํ•จ
โน ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด - ํ•˜๋‚˜์˜ ์ž…๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ์˜ ์‘๋‹ต์„ ์ด๊ฒƒ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”์•ผํ•จ
โบ ์–ด๋Œ‘ํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด - ํ•ธ๋“ค๋Ÿฌ์˜ ์‘๋‹ต์„ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์— ๋งž๊ฒŒ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค


โ–ช๏ธ Spring MVC ํŒจํ„ดโ–ช๏ธ


๐Ÿ“– Spring MVC ํŒจํ„ด

๐Ÿ“Œ Front Controller (๋””์ŠคํŒจ์ณ ์„œ๋ธ”๋ฆฟ)

  • ์š”์ฒญ์„ ๋ฐ›๊ณ  ์•Œ๋งž๋Š” ํ•ธ๋“ค๋Ÿฌ, ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฐพ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ํ•ธ๋“ค๋Ÿฌ ๋ชฉ๋ก , ์–ด๋Œ‘ํ„ฐ ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

๐Ÿ“Œ Handler Adapter

  • ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€? ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ•„์š”
  • ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ์„ ์ง€์‹œํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๋ฆฌํ„ดํ•  ๋•Œ ์•Œ๋งž๋Š” ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค

๐Ÿ“Œ Handler

  • ๋กœ์ง๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค ์• ๋“ค์ด ๋‹ค ๊ฑธ๋Ÿฌ์˜ด

๐Ÿ“– Spring MVC์˜ ์ฃผ์š” Interface

๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
DispatcherServlet ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด๋‚˜ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

โœ”๏ธ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก

  1. HandlerMapping
  2. HandlerAdapter
  3. ViewResolver
  4. View

๐Ÿ“– Controller Interface

  • ๐Ÿ’ก์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž„ํ”Œ๋ฆฌ๋จผํŠธํ•˜์—ฌ ์›ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • Annotation ๊ธฐ๋ฐ˜์˜ Controller์™€๋Š” ์ƒ๊ด€์—†๋‹ค

๐Ÿ“Œ@Component

  • Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์–ด๋…ธํ…Œ์ด์…˜
  • Spring์ด ์‹คํ–‰๋  ๋•Œ, @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„์„œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋กœ ๋งŒ๋“ค๊ณ  ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค.

@Component = "๋„ˆ ์ด๊ฑฐ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด!"
@Service, @Repository, @Controller ๋“ฑ = "์ด๊ฑฐ ๋นˆ์ธ๋ฐ, ์—ญํ• ์€ ์ด๊ฑฐ์•ผ!"

โœ”๏ธ Spring Bean

  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด, ์ฆ‰ ์ธ์Šคํ„ด์Šค !
  • Spring์€ ๋‚ด๋ถ€์ ์œผ๋กœ @Component ๊ณ„์—ด์˜ ํด๋ž˜์Šค๋“ค์„ ๊ฐ์ฒดํ™” ์‹œํ‚ค๊ณ 
    Spring Bean์œผ๋กœ ๋“ฑ๋กํ•ด๋‘”๋‹ค
  • ํŠน์ • ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น ๊ฒฝ๋กœ์™€ ๋ฐ”์ธ๋”ฉ ๋œ Spring Bean์„ ์ฐพ์•„์„œ
    ๊ทธ Spring Bean์— ๋งคํ•‘๋œ Controller๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•ด์ค€๋‹ค.

๐Ÿ“Œ Handler Mapping, Handler Adapter์˜ ์šฐ์„  ์ˆœ์œ„

์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ /class/1 ๊ฐ™์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด,
์ค‘์•™์—์„œ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๋Š” DispatcherServlet์ด ์ด๊ฑธ ๋ฐ›์•„.

๊ทผ๋ฐ DispatcherServlet ํ˜ผ์ž์„  ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•จ

"์ด URL์€ ๋ˆ„๊ตฌํ•œํ…Œ ๋งก๊ธฐ์ง€...? ๋ˆ„๊ตฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰ํ•ด์•ผ ํ•˜์ง€...?"

HandlerMapping URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค Bean์˜ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ ์ฐพ์Œ
HandlerAdapter ์ฐพ์€ Bean์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ• ์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

์šฐ์„ ์ˆœ์œ„Handler MappingHandler Adapter์˜๋ฏธ
1๏ธโƒฃRequestMappingHandlerMapping
- Annotation ๊ธฐ๋ฐ˜ Controller์˜ @RequestMapping์— ์‚ฌ์šฉ
RequestMappingHandlerAdapter
- Annotation ๊ธฐ๋ฐ˜ Controller์˜ @RequestMapping์— ์‚ฌ์šฉ
์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” ๋ฐฉ์‹
(@RequestMapping, @GetMapping ๋“ฑ)
2๏ธโƒฃBeanNameUrlHandlerMapping
- Spring Bean Name์œผ๋กœ HandlerMapping
HttpRequestHandlerAdapter
- HttpRequestHandler ์ฒ˜๋ฆฌ
ํŠน์ • URL๊ณผ Bean ์ด๋ฆ„์„ ๋งคํ•‘ํ•˜๊ฑฐ๋‚˜, HttpRequestHandler ๊ตฌํ˜„์ฒด ์‚ฌ์šฉ ์‹œ
3๏ธโƒฃ-SimpleControllerHandlerAdapter
- Controller Interface ์ฒ˜๋ฆฌ
๊ณผ๊ฑฐ์˜ Controller ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ๋ฐฉ์‹

๐Ÿ“– View Resolver

0๊ฐœ์˜ ๋Œ“๊ธ€