[Spring][๊ฐœ๋…] ๐Ÿš€ ๋น„์ฆˆ๋‹ˆ์Šค๋Š” MVC ํŒจํ„ด์ด ๊ฒฐ์ •ํ•œ๋‹ค! ๋‹น์‹ ์˜ ์›น์•ฑ์„ ๊ตฌํ•˜๋Š” ๊ตฌ์กฐ์  ๋น„๋ฐ€ ๐Ÿ”ฅ

๊น€์ƒ์šฑยท2024๋…„ 10์›” 19์ผ
post-thumbnail

๐Ÿ”ฅ MVC ํŒจํ„ด์˜ ๋น„๋ฐ€: ์•ฑ ์„ฑ๊ณต์˜ ์—ด์‡ ! ๐Ÿ”ฅ

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๊ผญ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๊ฐœ๋…์ด ๋ฐ”๋กœ MVC ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ตฌ์กฐ์ด๊ธฐ๋„ ํ•˜์ฃ . ๊ทธ๋Ÿผ MVC ํŒจํ„ด์ด ๋ฌด์—‡์ธ์ง€, ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.


1. Model (๋ชจ๋ธ): ์•ฑ์˜ ํ•ต์‹ฌ์„ ์›€์ง์ด๋Š” ๋‡Œ! ๐Ÿง 

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

  • ์ƒํƒœ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฆ‰๊ฐ์  ์‘๋‹ต!
    ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ชจ๋ธ์€ ์ด๋ฅผ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์‡ผํ•‘๋ชฐ์—์„œ ์ œํ’ˆ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค๋ฉด, ๋ชจ๋ธ์ด ํ•ด๋‹น ์ œํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ์ฒ˜๋ฆฌ
    ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ƒํ’ˆ ๊ฐ€๊ฒฉ์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋„ ๋ชจ๋ธ์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‹œ ์ฆ‰์‹œ ๋ทฐ์— ์•Œ๋ฆผ
    ๋ชจ๋ธ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด, ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ทฐ์— ์•Œ๋ฆฌ๋ฉด์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ตœ์‹  ์ •๋ณด๋ฅผ ํ™”๋ฉด์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2. View (๋ทฐ): ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋‚˜๋Š” ์ฒซ์ธ์ƒ! ๐Ÿ‘€

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

  • ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋Š” ์Šค๋งˆํŠธํ•œ ์—…๋ฐ์ดํŠธ
    ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•  ๋•Œ๋งˆ๋‹ค, ๋ทฐ๋Š” ๋ชจ๋ธ์—๊ฒŒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ฃ .

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

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


3. Controller (์ปจํŠธ๋กค๋Ÿฌ): ์กฐ์ข…์„์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ํ†ต์ œํ•˜๋Š” ์กฐ์ข…์‚ฌ! โœˆ๏ธ

  • ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ฐ›์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘์„ ์ •์˜
    ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์„ ๋ฐ›์•„ ์ ์ ˆํ•œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋™์ž‘์ด ๋ชจ๋‘ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

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

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


๐Ÿ’ก MVC ํŒจํ„ด์˜ ํ™•์žฅ์„ฑ: ์„ฑ๊ณต์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋น„๋ฒ•! ๐Ÿ’ก

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ์ผ์ด ์‰ฝ์ง€ ์•Š์€๋ฐ์š”, MVC ํŒจํ„ด์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ํšจ์œจ์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” MVC ํŒจํ„ด์˜ ํ™•์žฅ์„ฑ, ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


1. ํ™•์žฅ์„ฑ์˜ ๋น„๊ฒฐ: Model, View, Controller์˜ ์™„๋ฒฝํ•œ ๋ถ„๋ฆฌ! ๐Ÿš€

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ์„ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ
    MVC ํŒจํ„ด์€ Model, View, Controller์˜ ์„ธ ๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ด ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ ์‹œ์—๋„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์ „ํ˜€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ฃ .

  • ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ
    MVC ํŒจํ„ด์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ํ•œ ์˜์—ญ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์˜์—ญ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•ด๋„ ํ™”๋ฉด(View)์ด๋‚˜ ์‚ฌ์šฉ์ž ์š”์ฒญ ์ฒ˜๋ฆฌ(Controller)์—๋Š” ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋งค์šฐ ์šฉ์ดํ•˜๋ฉฐ, ํŠน์ • ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•  ๋•Œ๋„ ๋ถ€๋‹ด์ด ์ ์Šต๋‹ˆ๋‹ค.

  • ๋‚ฎ์€ ๊ฒฐํ•ฉ์„ฑ, ๋†’์€ ๋…๋ฆฝ์„ฑ
    ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์€, ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜๋Š” ์ •๋„๊ฐ€ ๋งค์šฐ ์ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉด, ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜์ •๊ณผ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฒฐํ•ฉ์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ตฌ์กฐ๋Š” ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ํŠนํžˆ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


2. MVC ํŒจํ„ด์˜ ์žฅ์ : ํšจ์œจ์ ์ธ ํ˜‘์—…๊ณผ ์œ ์ง€๋ณด์ˆ˜! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

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

  • ํ™•์žฅ์„ฑ์— ์ตœ์ ํ™”๋œ ์˜์—ญ๋ณ„ ๊ฐœ๋ฐœ
    ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ๋ชจ๋ธ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜์—ญ๋ณ„๋กœ ์ง‘์ค‘ํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ™”๋ฉด(View)์„ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด, ๊ฐ ์˜์—ญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ฉ๋‹ˆ๋‹ค.

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


3. MVC ํŒจํ„ด์˜ ๋‹จ์ : ๋„์ž… ์‹œ ์–ด๋ ค์›€๊ณผ ๋ณต์žก์„ฑ โš ๏ธ

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

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


๐Ÿ”ฅ ์„œ๋ธ”๋ฆฟ๊ณผ JSP์˜ ์™„๋ฒฝ ์ฝค๋ณด! ์›น ์š”์ฒญ ํ๋ฆ„ ์™„๋ฒฝ ํ•ด๋ถ€ ๐Ÿ”ฅ

์„œ๋ธ”๋ฆฟ(Servlet)๊ณผ JSP(Jakarta Server Pages)๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๋–ผ๋ ค์•ผ ๋—„ ์ˆ˜ ์—†๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€, ๊ทธ ๊ณผ์ •์„ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Client์˜ ์š”์ฒญ์ด Servlet์œผ๋กœ! ๐Ÿš€

  • ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก
    ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ๋™์ž‘์„ ํ•  ๋•Œ๋งˆ๋‹ค, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์ด ์š”์ฒญ์€ ๊ณง๋ฐ”๋กœ Servlet์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. Servlet์€ Controller ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ชจ๋“  ์š”์ฒญ์„ ์ผ๋‹จ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ดํ•ดํ•˜๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฒซ ๊ด€๋ฌธ์ด ๋ฐ”๋กœ Servlet์ž…๋‹ˆ๋‹ค.

2. Servlet์ด Business Service Object์— ํ˜ธ์ถœ์„ ๋‚ ๋ฆฐ๋‹ค! ๐Ÿ“ž

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ์ค€๋น„
    Servlet์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Business Service Object๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ์ค‘์ถ” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ์ง์ด ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

3. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๋งŒ๋‚จ! SQL ์ฟผ๋ฆฌ ์‹คํ–‰ โŒจ๏ธ

  • DAO(Database Access Object) ํ˜ธ์ถœ
    ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, DAO๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. DAO๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ค‘์š”ํ•œ ํ†ต๋กœ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ์—ฌ๊ธฐ์—์„œ ์ผ์–ด๋‚˜๋ฉฐ, Persistence Layer๋กœ ๋ถ„๋ฆฌ๋˜์–ด ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

4. DAO๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ Entity ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜! ๐Ÿ› ๏ธ

  • ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด, DAO๋Š” ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Entity๋ผ๋Š” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. Entity๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ’์„ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Business Service Object๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ Servlet์œผ๋กœ ๋ณต๊ท€! ๐Ÿ”

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

6. Servlet์ด JSP๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ค€๋น„ ์™„๋ฃŒ! ๐ŸŽฏ

  • ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ JSP์— ์ „๋‹ฌ (forward)
    Servlet์€ View ์—ญํ• ์„ ํ•˜๋Š” JSP์— ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ forwardํ•ฉ๋‹ˆ๋‹ค. JSP๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋™์  ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, Servlet์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. forward๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

7. JSP๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ตœ์ข… ์‘๋‹ต! HTML๋กœ ๋ณ€ํ™˜ ๐Ÿ“ค

  • ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ
    JSP๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋™์  HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‚ฌ์šฉ์ž๋Š” ํ™”๋ฉด์„ ํ†ตํ•ด ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์š”์ฒญ์—์„œ ์‘๋‹ต๊นŒ์ง€์˜ ํ๋ฆ„์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ Spring MVC: ์›น ๊ฐœ๋ฐœ์˜ ๋งˆ์Šคํ„ฐํ‚ค! ๐ŸŒŸ

Spring MVC๋Š” ๋‹จ์ˆœํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…(DI)์ด๋‚˜ AOP์™€ ๊ฐ™์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋„˜์–ด, ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ, Spring MVC์˜ ํŠน์ง•๊ณผ ๊ตฌ์กฐ์  ์ด์ ์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


1. DI, AOP, ๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์•„๊ฐ€ MVC๊นŒ์ง€! Spring์˜ ๊ฐ•๋ ฅํ•œ ์ง€์› ๐Ÿš€

  • DI์™€ AOP์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋„˜์–ด์„  MVC ์ง€์›
    Spring์€ ๋‹จ์ˆœํžˆ DI(Dependency Injection)๋‚˜ AOP(Aspect-Oriented Programming)์™€ ๊ฐ™์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Servlet ๊ธฐ๋ฐ˜์˜ MVC ํ”„๋ ˆ์ž„์›Œํฌ๊นŒ์ง€๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
    Spring MVC ๋•๋ถ„์— ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์‰ฝ๊ฒŒ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Model 2 Architecture & Front Controller ํŒจํ„ด: ์›น ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜ ์ „๋žต ๐Ÿ—๏ธ

  • Model 2 Architecture
    Spring MVC๋Š” Model, View, Controller๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Model 2 Architecture๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  • Front Controller ํŒจํ„ด, DispatcherServlet์˜ ํž˜
    Front Controller ํŒจํ„ด์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋‹จ์ผ ์ง„์ž…์ (DispatcherServlet)์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Spring MVC๋Š” ์ด ํŒจํ„ด์„ ์ฑ„ํƒํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ์š”์ฒญ์— ์ ํ•ฉํ•œ Controller๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ์ œ์–ดํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•œ ์ค‘์•™ ์ง‘์ค‘ํ˜• ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ„ด ๋•๋ถ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ๊ณผ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.


3. Spring์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ํ•˜๋Š” MVC: ํŠธ๋žœ์žญ์…˜, DI, AOP ํ•œ ๋ฒˆ์—! โšก

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

  • DI(Dependency Injection)๋กœ ์˜์กด์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ
    ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ Spring์ด ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•ด์ค๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • AOP๋กœ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ
    AOP(Aspect-Oriented Programming)๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ณด์•ˆ ๋“ฑ์˜ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ํ•ต์‹ฌ ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿšจ Spring MVC์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ํ•ด๋ถ€: ๋””์ŠคํŒจ์ฒ˜์„œ๋ธ”๋ฆฟ๋ถ€ํ„ฐ ๋ทฐ๊นŒ์ง€! ๐Ÿšจ

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


1. DispatcherServlet: ๋ชจ๋“  ์š”์ฒญ์˜ ์ฒซ ๋ฒˆ์งธ ๊ด€๋ฌธ! ๐Ÿšช

  • ์—ญํ• 
    DispatcherServlet์€ Spring MVC์—์„œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›๋Š” Front Controller์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๋‚ด๋Š” ๋ชจ๋“  ์š”์ฒญ์€ ์ด๊ณณ์„ ๊ฑฐ์ณ์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ Controller์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ ์ ˆํ•œ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • Controller์—์„œ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ View์—๊ฒŒ ์ „๋‹ฌํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ ํ™”๋ฉด์œผ๋กœ ์‘๋‹ต์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
  • Front Controller ํŒจํ„ด์˜ ํ•ต์‹ฌ
    DispatcherServlet์€ Spring MVC์˜ ์ค‘์•™ ์ง„์ž…์ ์œผ๋กœ, ์—ฌ๋Ÿฌ Controller๋กœ์˜ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฐฐํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ๋ฆ„์„ ์ผ์›ํ™”ํ•ฉ๋‹ˆ๋‹ค.


2. HandlerMapping: ์š”์ฒญ๊ณผ Controller๋ฅผ ์ด์–ด์ฃผ๋Š” ๋‹ค๋ฆฌ! ๐ŸŒ‰

  • ์—ญํ• 
    HandlerMapping์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค Controller๊ฐ€ ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ๋งก์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • ์š”์ฒญ URL๊ณผ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ(Controller)๋ฅผ ์ฐพ์•„ ์š”์ฒญ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
    • DispatcherServlet์ด ์š”์ฒญ์— ๋งž๋Š” Controller๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

3. Controller: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ง€ํœ˜์ž ๐ŸŽผ

  • ์—ญํ• 
    Controller๋Š” ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋งž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋งž์ถฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ Model์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋Š” ModelAndView ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์™€ View ์ •๋ณด๋ฅผ DispatcherServlet์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

4. ModelAndView: ๋ฐ์ดํ„ฐ์™€ ๋ทฐ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋‹ด๋Š” ์ƒ์ž ๐Ÿ“ฆ

  • ์—ญํ• 
    ModelAndView๋Š” Controller๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋กœ, Model(๋ฐ์ดํ„ฐ)๊ณผ View(ํ™”๋ฉด ์ •๋ณด)๋ฅผ ํ•จ๊ป˜ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • Model: ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • View: ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ๋ทฐ์˜ ์ด๋ฆ„(์˜ˆ: JSP ํŒŒ์ผ๋ช…)์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • Controller๋Š” ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ๋„˜๊ธฐ๋ฉฐ, ๋ทฐ์—์„œ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

5. ViewResolver: ๋ทฐ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ํƒ์ • ๐Ÿ•ต๏ธ

  • ์—ญํ• 
    ViewResolver๋Š” Controller๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋ทฐ ํŒŒ์ผ์„ ์ฐพ์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • ViewResolver๋Š” Controller์—์„œ ๋ฆฌํ„ด๋œ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ ˆํ•œ JSP ํŒŒ์ผ์ด๋‚˜ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Controller๊ฐ€ viewName์œผ๋กœ "home"์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ViewResolver๋Š” "home.jsp" ํŒŒ์ผ์„ ์ฐพ์•„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

6. View: ์ตœ์ข… ์‘๋‹ต์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ™”๋ฉด ์ฐฝ์ž‘์ž ๐ŸŽจ

  • ์—ญํ• 
    View๋Š” Controller๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ตํ•  HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ตœ์ข… ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ

    • JSP, Thymeleaf์™€ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
    • Controller์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒ Spring MVC: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์—์„œ ์‘๋‹ต๊นŒ์ง€์˜ ์™„๋ฒฝ ์—ฌ์ •! ๐Ÿš€

Spring MVC์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํ๋ฆ„์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด Spring MVC์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ (Request): ์‹œ์ž‘์ ์€ ์–ธ์ œ๋‚˜ ํด๋ผ์ด์–ธํŠธ์—์„œ! ๐Ÿ“ฒ

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ๋™์ž‘(์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ, ํผ ์ œ์ถœ)์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ๊ทธ ์š”์ฒญ์ด DispatcherServlet์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ๋กœ ์›น ํŽ˜์ด์ง€์—์„œ "๋กœ๊ทธ์ธ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋Š” ์ˆœ๊ฐ„ ์ด ์š”์ฒญ ํ๋ฆ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

2. HandlerMapping์„ ํ†ตํ•œ Controller ํƒ์ƒ‰ ๐Ÿ”

  • DispatcherServlet์€ ๋จผ์ € HandlerMapping์„ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ ์ ˆํ•œ Controller๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • HandlerMapping์€ ์š”์ฒญ URL์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค Controller๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

3. HandlerAdapter๋กœ ์š”์ฒญ ์ „๋‹ฌ ๐Ÿ› ๏ธ

  • HandlerMapping์ด ์ ํ•ฉํ•œ Controller๋ฅผ ์ฐพ์œผ๋ฉด, HandlerAdapter๊ฐ€ ๊ทธ Controller์—๊ฒŒ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ HandlerAdapter๋Š” ์š”์ฒญ์„ Controller๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

4. Controller์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๐ŸŽฏ

  • Controller๋Š” ์ „๋‹ฌ๋ฐ›์€ ์š”์ฒญ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ํ›„, ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ model๊ณผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋ทฐ ํŒŒ์ผ์˜ ์ด๋ฆ„(viewName)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ model์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด๊ณ , viewName์€ "home.jsp" ๊ฐ™์€ ๋ทฐ ํŒŒ์ผ์˜ ์ด๋ฆ„์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. DispatcherServlet์ด ViewResolver๋กœ ๋ทฐ ํƒ์ƒ‰ ๐Ÿ”

  • DispatcherServlet์€ Controller๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ viewName์„ ๋ฐ”ํƒ•์œผ๋กœ ViewResolver๋ฅผ ํ˜ธ์ถœํ•ด ์ ์ ˆํ•œ ๋ทฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ViewResolver๋Š” viewName๊ณผ ๋งค์นญ๋˜๋Š” JSP ํŒŒ์ผ์ด๋‚˜ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ฐพ์•„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

6. ViewResolver๊ฐ€ View์— ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ „๋‹ฌ ๐Ÿ“„

  • ViewResolver๋Š” ๋ทฐ ํŒŒ์ผ์„ ์ฐพ์€ ํ›„, model ๊ฐ์ฒด์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ View์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • View๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋™์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•  ์ค€๋น„๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค.

7. View๊ฐ€ DispatcherServlet์œผ๋กœ ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๐Ÿ–ฅ๏ธ

  • View๋Š” model ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ข… ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ DispatcherServlet์— ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

8. ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต (Response): ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ! โœ…

  • ๋งˆ์ง€๋ง‰์œผ๋กœ, DispatcherServlet์€ ๋ Œ๋”๋ง๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์š”์ฒญํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ "home" ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

๐Ÿš€ DispatcherServlet์„ ํ†ตํ•œ Spring MVC ์š”์ฒญ ์ฒ˜๋ฆฌ ์™„๋ฒฝ ํ•ด๋ถ€! ๐Ÿš€

Spring MVC์˜ ๊ฐ•๋ ฅํ•œ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


1. DispatcherServlet์ด ์š”์ฒญ์„ ์ˆ˜์‹ : ๋ชจ๋“  ์š”์ฒญ์˜ ์‹œ์ž‘์  ๐Ÿšช

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ์ž‘์—…์„ ์š”์ฒญํ•  ๋•Œ, ๊ทธ ์š”์ฒญ์€ Spring MVC์˜ DispatcherServlet์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • DispatcherServlet์€ Front Controller๋กœ, ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋‹จ์ผํ™”๋œ ์ง„์ž…์ ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ›์€ ์š”์ฒญ์€ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ์œ„์ž„๋ฉ๋‹ˆ๋‹ค.

2. HandlerMapping์— ์š”์ฒญํ•  Controller ๋ฌธ์˜ ๐Ÿ”

  • DispatcherServlet์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด HandlerMapping์— ๋ฌธ์˜ํ•ฉ๋‹ˆ๋‹ค.
  • HandlerMapping์€ ์š”์ฒญ URL๊ณผ ๋งคํ•‘๋œ Controller๋ฅผ ์ฐพ์•„์„œ, ์ด ์š”์ฒญ์„ ์–ด๋А Controller๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

3. DispatcherServlet์ด Controller์— ์š”์ฒญ ์ „๋‹ฌ ๐Ÿ“จ

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

4. Controller๊ฐ€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ModelAndView๋กœ ๋ฐ˜ํ™˜ ๐Ÿ“ฆ

  • Controller๋Š” ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ModelAndView ๊ฐ์ฒด๋ฅผ DispatcherServlet์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ModelAndView ๊ฐ์ฒด๋Š” Model๊ณผ View ์ •๋ณด๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ Model์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ, View๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ํ™”๋ฉด(์˜ˆ: JSP ํŒŒ์ผ๋ช…)์ž…๋‹ˆ๋‹ค.

5. ViewResolver๊ฐ€ ๋ทฐ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ƒ„ ๐Ÿ—บ๏ธ

  • ModelAndView ๊ฐ์ฒด์—๋Š” ๋‹จ์ˆœํžˆ ๋…ผ๋ฆฌ์ ์ธ View ์ด๋ฆ„๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ ๋ Œ๋”๋งํ•  ๊ตฌ์ฒด์ ์ธ ๋ทฐ ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ViewResolver๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ViewResolver๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋ทฐ ์ด๋ฆ„์„ JSP ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "home"์ด๋ผ๋Š” ๋…ผ๋ฆฌ์ ์ธ ์ด๋ฆ„์„ "home.jsp"๋ผ๋Š” ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

6. View๊ฐ€ ์ตœ์ข… ํ™”๋ฉด์„ ๋ Œ๋”๋ง ๐Ÿ’ป

  • View๋Š” Model์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด์—ฌ์ค„ HTML ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • DispatcherServlet์€ ์ด ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ต(response)์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ํ™”๋ฉด์—์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป Spring MVC ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„: ๋‹จ๊ณ„๋ณ„ ์™„๋ฒฝ ๊ฐ€์ด๋“œ! ๐Ÿš€

Spring MVC๋ฅผ ์‚ฌ์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์€ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋‰˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ํ”„๋กœ์ ํŠธ ์„ค์ •๋ถ€ํ„ฐ ์š”์ฒญ ์ฒ˜๋ฆฌ, ๊ฒฐ๊ณผ ์‘๋‹ต๊นŒ์ง€์˜ ๋ชจ๋“  ํ๋ฆ„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Spring MVC์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„ ๋‹จ๊ณ„๋ฅผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์„ธ์š”!


1. Spring MVC๋ฅผ ์ด์šฉํ•œ Application ๊ตฌํ˜„ Step

1.1 DispatcherServlet ๋“ฑ๋ก ๋ฐ ์„ค์ •ํŒŒ์ผ ๋“ฑ๋ก ๐Ÿ“‘

  • Spring MVC ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ DispatcherServlet์„ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • web.xml์— DispatcherServlet์„ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, ์ตœ์‹  ๋ฐฉ์‹์ธ JavaConfig๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DispatcherServlet์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ํ†ตํ•ด Spring MVC ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • DispatcherServlet์€ Front Controller ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์„œ๋ธ”๋ฆฟ์ž…๋‹ˆ๋‹ค.

1.2 HandlerMapping ์„ค์ • โš™๏ธ

  • HandlerMapping์„ ํ†ตํ•ด ํŠน์ • URL์ด ์–ด๋–ค Controller์™€ ์—ฐ๊ฒฐ๋ ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • HandlerMapping์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ URL์„ ๋ถ„์„ํ•˜์—ฌ ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ์ฐพ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์„ ์ ์ ˆํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.3 ์„ค์ • ํŒŒ์ผ ๋“ฑ๋ก ๐Ÿ—‚๏ธ

  • Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋  ๋•Œ ํ•„์š”ํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์„ servlet-context.xml ๋˜๋Š” root-context.xml๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • servlet-context.xml ํŒŒ์ผ์€ ์ฃผ๋กœ Spring MVC์™€ ๊ด€๋ จ๋œ ์„ค์ •์„ ํฌํ•จํ•˜๋ฉฐ, root-context.xml์€ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

1.4 View Resolver ์„ค์ • ๐Ÿ› ๏ธ

  • Controller์—์„œ ๋ฐ˜ํ™˜๋œ ๋…ผ๋ฆฌ์  View ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด View Resolver๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, "home"์ด๋ผ๋Š” ๋…ผ๋ฆฌ์  ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด, View Resolver๋Š” ์ด๋ฅผ "home.jsp"์™€ ๊ฐ™์€ ์‹ค์ œ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

1.5 JSP ์ฝ”๋“œ ์ž‘์„ฑ ๐Ÿ“

  • JSP ํŒŒ์ผ์€ ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด์—ฌ์ค„ HTML ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • JSP๋Š” Model์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋™์ ์œผ๋กœ HTML์„ ์ƒ์„ฑํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

2. Controller ์ž‘์„ฑ: ์š”์ฒญ ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ๐ŸŽฏ

  • Controller๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
  • Spring MVC์—์„œ๋Š” Controller๊ฐ€ ์ง์ ‘ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹ , Service ๋ ˆ์ด์–ด์— ์š”์ฒญ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์ด๋กœ์จ Controller๋Š” ๋‹จ์ˆœํžˆ Service๋‚˜ Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View์— ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

3. Spring MVC ํ๋ฆ„: ์š”์ฒญ์—์„œ ์‘๋‹ต๊นŒ์ง€์˜ ์™„๋ฒฝํ•œ ์—ฌ์ • ๐Ÿ”„

3.1 Web ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์š”์ฒญ (Request) ๐Ÿ“ฒ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํผ์„ ์ œ์ถœํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ํ†ตํ•ด ์š”์ฒญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

3.2 DispatcherServlet์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ๐Ÿšฆ

  • DispatcherServlet์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, ๊ทธ ์š”์ฒญ์„ ์ ์ ˆํ•œ Controller๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

3.3 Controller์—์„œ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐ Service ํ˜ธ์ถœ ๐Ÿ’ผ

  • Controller๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ”ํƒ•์œผ๋กœ Service ๋ ˆ์ด์–ด์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์š”์ฒญํ•˜๊ณ , ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

3.4 Model๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ๐Ÿ“Š

  • Service๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ Model์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

3.5 View๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐ ๋ Œ๋”๋ง ๐ŸŽจ

  • Controller๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ View์— ์ „๋‹ฌํ•˜๊ณ , View๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

Spring MVC ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ: ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ!

Spring MVC ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ํ•ต์‹ฌ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด, ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ€์ด๋“œ๋Š” Spring MVC ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ฉฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


1. Java ํŒŒ์ผ: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ํ•ต์‹ฌ! ๐Ÿง 

  • ํ”„๋กœ์ ํŠธ์—์„œ Controller, Service, Model ๋“ฑ ์ฃผ์š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์ด ์—ฌ๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • Controller๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Service๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, Model์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    src/main/java/com/example/controller/HelloController.java
    HelloController๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” Controller๋กœ, /hello ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2. ์„œ๋ฒ„ ์‹คํ–‰์— ํ•„์š”ํ•œ ์„ค์ • ํŒŒ์ผ: ์„œ๋ฒ„ ํ™˜๊ฒฝ ์„ค์ •์˜ ์ค‘์‹ฌ! โš™๏ธ

  • ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ log4j.xml๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ์„ค์ • ํŒŒ์ผ์ด๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์˜ ์„ค์ • ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ ๊ด€๋ฆฌ, ํ™˜๊ฒฝ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    log4j.xml
    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ ์„ค์ • ํŒŒ์ผ๋กœ, ๋กœ๊ทธ ๋ ˆ๋ฒจ, ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


3. ํ…Œ์ŠคํŠธ ํŒŒ์ผ (JUnit, Spring Test): ํ’ˆ์งˆ ๋ณด์ฆ์˜ ํ•„์ˆ˜ ์š”์†Œ! ๐Ÿ”

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • JUnit์ด๋‚˜ Spring Test ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    src/test/java/com/example/controller/HelloControllerTest.java
    HelloController๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.


4. Spring ์„ค์ • ํŒŒ์ผ: Spring์˜ ์‹ฌ์žฅ! ๐Ÿงฉ

  • Spring ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์ž…๋‹ˆ๋‹ค.

  • ์ฃผ๋กœ XML ํŒŒ์ผ ๋˜๋Š” Java Config ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ๋นˆ(bean) ์„ค์ •, DispatcherServlet ์„ค์ • ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    servlet-context.xml
    Spring MVC์˜ ์„ค์ • ํŒŒ์ผ๋กœ, DispatcherServlet ์„ค์ •, Controller ๋งคํ•‘, View Resolver ์„ค์ • ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.


5. View (JSP) ํŒŒ์ผ: ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋‚˜๋Š” ์›น ํŽ˜์ด์ง€ ๐ŸŒ

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ๋™์  ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” JSP ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • JSP๋Š” Controller๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋™์ ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    src/main/webapp/WEB-INF/views/hello.jsp
    hello.jsp๋Š” HelloController๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ HTML ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.


6. Web ์„ค์ • ํŒŒ์ผ: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘์ ! ๐Ÿšฆ

  • web.xml๊ณผ ๊ฐ™์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ • ํŒŒ์ผ๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • DispatcherServlet์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ, ๋ฆฌ์Šค๋„ˆ ๋“ฑ์„ ์ •์˜ํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    web.xml
    DispatcherServlet์„ ๋“ฑ๋กํ•˜๊ณ , URL ๋งคํ•‘์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. Spring MVC์˜ ์ค‘์š”ํ•œ ์‹œ์ž‘์  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


7. Maven ์„ค์ • ํŒŒ์ผ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋นŒ๋“œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ๋„๊ตฌ! ๐Ÿ› ๏ธ

  • ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ๋นŒ๋“œ ์„ค์ •์„ ๊ด€๋ฆฌํ•˜๋Š” pom.xml ํŒŒ์ผ์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • pom.xml์„ ํ†ตํ•ด Spring, JUnit, MySQL Connector ๋“ฑ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ , Maven์ด ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:
    pom.xml
    Maven ์„ค์ • ํŒŒ์ผ๋กœ, ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋นŒ๋“œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์ •์˜ํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


์ผ๋ฐ˜์ ์ธ Spring MVC ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ ๐Ÿ—๏ธ

  • src/main/java/com/example/controller/HomeController.java:
    Controller ํด๋ž˜์Šค๋Š” /home ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ /home์— ์ ‘์†ํ•˜๋ฉด ์ด ํด๋ž˜์Šค๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , View์— ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • src/main/webapp/WEB-INF/views/home.jsp:
    home.jsp๋Š” HomeController๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ HTML ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • src/main/resources/application.properties:
    Spring ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ๋กœ๊ทธ ์„ค์ •, ๊ธฐํƒ€ ํ™˜๊ฒฝ ์„ค์ •๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • pom.xml:
    Maven ์„ค์ • ํŒŒ์ผ๋กœ, ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Sprint MVC, JUnit, MySQL ๋“ฑ)๋ฅผ ์ •์˜ํ•˜๊ณ  ๋นŒ๋“œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • src/test/java/com/example/controller/HomeControllerTest.java:
    JUnit ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋กœ, HomeController๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.


Spring ApplicationContext: IoC ์ปจํ…Œ์ด๋„ˆ์˜ ํ•ต์‹ฌ ์—ญํ• !

ApplicationContext๋Š” Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋กœ, Inversion of Control (IoC) ์›์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฃผ์š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ(bean)์„ ๊ด€๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค.


ApplicationContext์˜ ์ฃผ์š” ์—ญํ• 

  1. ๋นˆ(bean) ๊ด€๋ฆฌ ๐ŸŽฏ

    • ApplicationContext๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •์˜๋œ ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋นˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ApplicationContext๋Š” ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜์กด์„ฑ ์ฃผ์ž…(DI) ๐Ÿ”—

    • ApplicationContext๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Controller๊ฐ€ Service๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ, ApplicationContext๋Š” Service ๊ฐ์ฒด๋ฅผ Controller์— ์ฃผ์ž…ํ•˜์—ฌ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. ๋นˆ ์„ค์ • ๋ฐ ์กฐํšŒ ๐Ÿ”

    • ApplicationContext๋Š” XML ์„ค์ • ํŒŒ์ผ, JavaConfig, ์• ๋„ˆํ…Œ์ด์…˜ ๋“ฑ์„ ํ†ตํ•ด ๋นˆ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋นˆ์„ ์ •์˜ํ•˜๊ณ , ApplicationContext๋Š” ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋นˆ์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

ApplicationContext์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ

  • ApplicationContext๋Š” root-context.xml์ด๋‚˜ servlet-context.xml ๊ฐ™์€ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด ApplicationContext๋Š” ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ApplicationContext๋Š” ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ , ํ•„์š” ์‹œ ์ด๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring ApplicationContext์˜ ๋™์ž‘ ์˜ˆ์‹œ

๋‹ค์Œ์€ Spring ApplicationContext์—์„œ ๋นˆ ๊ด€๋ฆฌ์™€ ์˜์กด์„ฑ ์ฃผ์ž…์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

1. Service ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด

// Service ์ธํ„ฐํŽ˜์ด์Šค
public interface UserService {
    void createUser();
}

// Service ๊ตฌํ˜„์ฒด
public class UserServiceImpl implements UserService {
    @Override
    public void createUser() {
        System.out.println("Creating a user...");
    }
}

2. Controller ํด๋ž˜์Šค

// Controller
public class UserController {
    private UserService userService;
    
    // ์ƒ์„ฑ์ž ์ฃผ์ž… (DI)
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    public void handleRequest() {
        userService.createUser();
    }
}

3. XML ๊ธฐ๋ฐ˜์˜ Spring ์„ค์ • ํŒŒ์ผ

<beans>
    <!-- UserService ๋นˆ ์ •์˜ -->
    <bean id="userService" class="com.example.UserServiceImpl" />
    
    <!-- UserController ๋นˆ ์ •์˜ ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… -->
    <bean id="userController" class="com.example.UserController">
        <constructor-arg ref="userService" />
    </bean>
</beans>

4. ApplicationContext์˜ ๋™์ž‘

  • Spring์ด ๊ตฌ๋™๋  ๋•Œ, ApplicationContext๋Š” userService ๋นˆ์„ ๋จผ์ € ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ, ApplicationContext๋Š” userController ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ƒ์„ฑ์ž์— userService ๋นˆ์„ ์ฃผ์ž…ํ•˜์—ฌ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • UserController๋Š” UserService๋ฅผ ํ™œ์šฉํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ Spring MVC์˜ ํ•ต์‹ฌ: ContextLoaderListener๋กœ ๋ชจ๋“  ๊ฑธ ์žฅ์•…ํ•˜์ž! ๐Ÿš€

Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋ ค๋ฉด ContextLoaderListener์™€ Root ApplicationContext์˜ ์—ญํ• ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ์ค‘์š”ํ•œ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๋ณผ๊นŒ์š”?


1. ContextLoaderListener: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šคํƒ€ํŠธ ํฌ์ธํŠธ! ๐Ÿ’ฅ

ContextLoaderListener๋ž€? ๐Ÿค”

  • ContextLoaderListener๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Root ApplicationContext๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด Spring์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์„ค์ • ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นˆ(bean)์ด๋‚˜ ํ™˜๊ฒฝ ์„ค์ •์„ ๋กœ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

web.xml ์„ค์ • ๐Ÿ“

  • web.xml ํŒŒ์ผ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐ์น˜ ๊ธฐ์ˆ ์„œ(Deployment Descriptor)๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ์„œ๋ธ”๋ฆฟ, ๋ฆฌ์Šค๋„ˆ, ํ•„ํ„ฐ ๋“ฑ์˜ ์„ค์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ContextLoaderListener๋ฅผ ์„ค์ •ํ•˜์—ฌ Spring Context ํŒŒ์ผ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ๋นˆ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ 1: ContextLoaderListener ์„ค์ •

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  • ์ด ์ฝ”๋“œ๋Š” ContextLoaderListener๋ฅผ web.xml์— ๋“ฑ๋กํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋  ๋•Œ Spring์˜ Root ApplicationContext๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฆฌ์Šค๋„ˆ๋Š” root-context.xml๊ณผ ๊ฐ™์€ ์ „์—ญ ์„ค์ • ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณตํ†ต ๋นˆ ์„ค์ •์„ ์ ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2. Root ApplicationContext ์„ค์ •: ๋ชจ๋“  ์„ค์ •์„ ํ•œ ๋ฒˆ์—! ๐Ÿ”ง

context-param ์„ค์ • ๐Ÿ› ๏ธ

  • context-param ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฐธ์กฐํ•  ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ํ†ตํ•ด ContextLoaderListener๋Š” ์ง€์ •๋œ ์„ค์ • ํŒŒ์ผ์„ ์ฐพ์•„ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ 2: Root ์„ค์ • ํŒŒ์ผ ๋“ฑ๋ก

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
  • param-name์œผ๋กœ contextConfigLocation์„ ์ง€์ •ํ•˜๊ณ , param-value๋กœ root-context.xml ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • /WEB-INF/spring/root-context.xml์€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ตœ์ƒ์œ„ ApplicationContext ์„ค์ • ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋นˆ ์„ค์ •, ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ •, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ ๊ฐ™์€ ๊ณตํ†ต์ ์ธ ์„ค์ •์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

root-context.xml์˜ ์‹ค์ œ ์˜ˆ์‹œ: ์ด๊ฒŒ ๋ฐ”๋กœ ์‹ค์ „์ด๋‹ค! ๐Ÿ“‚

  • Root ApplicationContext๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ์„œ๋น„์Šค ๊ณ„์ธต์˜ ๋นˆ ์„ค์ • ๋“ฑ)๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, root-context.xml ํŒŒ์ผ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<!-- root-context.xml ์˜ˆ์‹œ -->
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mydb" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>
    
    <!-- ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์„ค์ • -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>
  • ์œ„ ์˜ˆ์‹œ์—์„œ root-context.xml ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3. ์‹คํ–‰ ํ๋ฆ„: ContextLoaderListener๊ฐ€ ๋‹ค ์ฑ…์ž„์ง„๋‹ค! ๐Ÿš€

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ๐ŸŽฌ

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด web.xml์— ์„ค์ •๋œ ContextLoaderListener๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. Root ApplicationContext ์ดˆ๊ธฐํ™” โš™๏ธ

    • ์ด ๋ฆฌ์Šค๋„ˆ๋Š” contextConfigLocation์—์„œ ์ง€์ •ํ•œ ๊ฒฝ๋กœ(/WEB-INF/spring/root-context.xml)๋ฅผ ์ฐพ์•„ Spring ApplicationContext๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋นˆ(bean) ๊ด€๋ฆฌ ๐Ÿ—๏ธ

    • ์ดˆ๊ธฐํ™”๋œ ApplicationContext๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋นˆ(bean)๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ DispatcherServlet ์„ค์ •: Spring MVC์˜ ์ง„์ •ํ•œ ๊ฒŒ์ดํŠธํ‚คํผ! ๐Ÿšช

DispatcherServlet์€ Spring MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ค‘์•™์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌํ•˜๋Š” Front Controller์ž…๋‹ˆ๋‹ค. DispatcherServlet์˜ ์„ค์ •์€ web.xml ํŒŒ์ผ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์—ฌ๊ธฐ์„œ DispatcherServlet์ด ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜๊ณ  ๋™์ž‘ํ•˜๋Š”์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!


1. DispatcherServlet ์„ค์ • (web.xml): ๋ชจ๋“  ์š”์ฒญ์„ ๊ด€์žฅํ•˜๋Š” ํ•ต์‹ฌ! ๐Ÿ’ผ

1.1 init-param ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋กœ ApplicationContext ์ •๋ณด ๋กœ๋“œ ๐Ÿ’ก**

  • init-param์€ DispatcherServlet์ด ์‚ฌ์šฉํ•  ์ถ”๊ฐ€์ ์ธ ์„ค์ •์„ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ init-param์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ "servlet-name"-servlet.xml ํŒŒ์ผ์—์„œ ApplicationContext ์ •๋ณด๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, servlet ์ด๋ฆ„์ด "hello"๋ผ๋ฉด, hello-servlet.xml์—์„œ ์„ค์ •์„ ๋กœ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1.2 Spring Container๊ฐ€ ์„ค์ • ํŒŒ์ผ์„ ์ฝ๊ณ  ApplicationContext ์ƒ์„ฑ! ๐Ÿ”„

  • Spring์€ ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด ApplicationContext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋นˆ(bean)๋“ค์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…(DI)๋„ ์ด ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ด ApplicationContext๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์—์„œ ๊ณต์œ ๋˜์–ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

1.3 url-pattern์œผ๋กœ DispatcherServlet์˜ ํ™œ๋™ ๋ฒ”์œ„ ์„ค์ •! ๐Ÿ—บ๏ธ**

  • url-pattern์„ ํ†ตํ•ด DispatcherServlet์ด ์ฒ˜๋ฆฌํ•  URL ํŒจํ„ด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "/" ํŒจํ„ด์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์š”์ฒญ์„ DispatcherServlet์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ๊ฒฝ๋กœ(์˜ˆ: /app/)๋กœ ์ œํ•œํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

1.4 Servlet์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ DispatcherServlet ์„ค์ • ๊ฐ€๋Šฅ! ๐Ÿ”ง

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ DispatcherServlet์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ DispatcherServlet์€ ๋…๋ฆฝ์ ์ธ ApplicationContext๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ๋ชจ๋“ˆ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

1.5 load-on-startup ์„ค์ •: ์ฆ‰์‹œ ์‹คํ–‰ ๋ชจ๋“œ! โšก**

  • load-on-startup ํƒœ๊ทธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ DispatcherServlet์ด ์–ธ์ œ ์ดˆ๊ธฐํ™”๋ ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ๋” ๋นจ๋ฆฌ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. 1๋กœ ์„ค์ •ํ•˜๋ฉด, ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ๋™์‹œ์— DispatcherServlet์ด ์ดˆ๊ธฐํ™”๋˜์–ด ์ฒซ ์š”์ฒญ ์‹œ ๋А๋ ค์ง€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DispatcherServlet ์„ค์ • ์˜ˆ์‹œ: ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๊ฒŒ์ž„ ๋! ๐Ÿ’ช

<servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/app-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

์„ค๋ช…: ๐Ÿ“‹

  • : DispatcherServlet์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ DispatcherServlet์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • : Spring MVC์˜ ๊ธฐ๋ณธ DispatcherServlet ํด๋ž˜์Šค์ธ org.springframework.web.servlet.DispatcherServlet์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • : ์ด ํƒœ๊ทธ๋กœ ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ์—์„œ๋Š” /WEB-INF/spring/app-config.xml ๊ฒฝ๋กœ์—์„œ Spring ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ, DispatcherServlet์„ ๋ฐ”๋กœ ๋กœ๋“œํ•ด ์ฒซ ์š”์ฒญ ์‹œ์˜ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • : DispatcherServlet์ด ์ฒ˜๋ฆฌํ•  URL ํŒจํ„ด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” /app/๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒฑ Spring MVC ํ”„๋กœ์ ํŠธ: ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๊ตฌ์กฐ

Spring MVC๋Š” Java ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring MVC ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์„ค์ •๋ถ€ํ„ฐ ๋™์ž‘ ๊ณผ์ •๊นŒ์ง€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. DispatcherServlet๋ถ€ํ„ฐ Controller, ViewResolver, ๊ทธ๋ฆฌ๊ณ  JSP๊นŒ์ง€, ํ”„๋กœ์ ํŠธ์˜ ์ „๋ฐ˜์ ์ธ ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ—๏ธ 1. DispatcherServlet ์„ค์ • (web.xml)

DispatcherServlet์€ Spring MVC์˜ ํ•ต์‹ฌ์ธ Front Controller๋กœ, ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € web.xml ํŒŒ์ผ์—์„œ ์ด ์„œ๋ธ”๋ฆฟ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- DispatcherServlet ์„ค์ • -->
    <servlet>
        <servlet-name>mainServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/main-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- DispatcherServlet URL ๋งคํ•‘ -->
    <servlet-mapping>
        <servlet-name>mainServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

๐Ÿ“ ์„ค๋ช…

  • DispatcherServlet์ด ๋ชจ๋“  URL ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • contextConfigLocation์—์„œ Spring ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด main-servlet.xml์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • load-on-startup์„ 1๋กœ ์„ค์ •ํ•ด ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ DispatcherServlet์ด ๋ฏธ๋ฆฌ ๋กœ๋“œ๋˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป 2. Controller ์ž‘์„ฑ

์ด์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Controller๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Model ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•˜๋Š” HelloController์ž…๋‹ˆ๋‹ค.

package com.example.hello;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    
    @GetMapping("/")
    public String index(Model model) {
        // Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€
        model.addAttribute("name", "ํ™๊ธธ๋™");
        
        // "index"๋Š” View ์ด๋ฆ„์ด๋ฉฐ, ViewResolver์— ์˜ํ•ด /WEB-INF/views/index.jsp๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
        return "index";
    }
}

๐Ÿ“ ์„ค๋ช…

  • @Controller ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Spring MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ธ์‹๋˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • @GetMapping("/"): ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Model ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ JSP๋กœ ์ „๋‹ฌํ•˜๊ณ , "index"๋ผ๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ 3. ViewResolver ์„ค์ • (servlet-context.xml)

ViewResolver๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ JSP ํŒŒ์ผ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Spring MVC์—์„œ ์ด ์„ค์ •์€ servlet-context.xml ํŒŒ์ผ์—์„œ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc 
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- Controller ์ž๋™ ์Šค์บ” -->
    <context:component-scan base-package="com.example.hello" />
    
    <!-- ViewResolver ์„ค์ • -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

๐Ÿ“ ์„ค๋ช…

  • component-scan์„ ์‚ฌ์šฉํ•ด com.example.hello ํŒจํ‚ค์ง€์—์„œ Controller๋ฅผ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • InternalResourceViewResolver๊ฐ€ prefix์™€ suffix๋ฅผ ํ†ตํ•ด JSP ํŒŒ์ผ์„ ์ฐพ์•„์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, index๋ผ๋Š” ๋ทฐ ์ด๋ฆ„์€ /WEB-INF/views/index.jsp๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

๐Ÿ–ผ๏ธ 4. JSP View ์ž‘์„ฑ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์งˆ index.jsp ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ณด์—ฌ์งˆ HTML ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello Spring MVC</title>
</head>
<body>
    <h3>์•ˆ๋…•ํ•˜์„ธ์š”, Spring MVC ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค!</h3>
    <h1>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, ${name}๋‹˜!</h1>
</body>
</html>

๐Ÿ“ ์„ค๋ช…

  • ${name}: Controller์—์„œ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JSP์—์„œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ํ™๊ธธ๋™์ด๋ผ๋Š” ๊ฐ’์ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

โš™๏ธ 5. JavaConfig ๋ฐฉ์‹์œผ๋กœ ์„ค์ •

์ตœ๊ทผ์—๋Š” XML ์„ค์ • ๋Œ€์‹  ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JavaConfig ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” JavaConfig ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.hello")
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

๐Ÿ“ ์„ค๋ช…

  • @Configuration: ์ด ํด๋ž˜์Šค๊ฐ€ Spring ์„ค์ • ํŒŒ์ผ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • @EnableWebMvc: Spring MVC์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • @ComponentScan: com.example.hello ํŒจํ‚ค์ง€์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • viewResolver(): JSP ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” InternalResourceViewResolver๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅSpring MVC ์„ค์ • ํŒŒ์ผ ์™„์ „ ์ •๋ณต: DispatcherServlet, root-context.xml, ๊ทธ๋ฆฌ๊ณ  [์ด๋ฆ„]-servlet.xml์˜ ๋น„๋ฐ€!๐Ÿ”ฅ

Spring MVC๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด DispatcherServlet, root-context.xml, ๊ทธ๋ฆฌ๊ณ  [์ด๋ฆ„]-servlet.xml์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ด ์„ธ ๊ฐ€์ง€ ์š”์†Œ์˜ ์—ญํ• ๊ณผ ์ƒํ˜ธ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , ์™œ root-context.xml์„ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿš€ 1. DispatcherServlet์ด๋ž€?

๐Ÿ“Œ 1.1 ๊ฐœ์š”

  • DispatcherServlet์€ Spring MVC ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ์œผ๋กœ, Front Controller ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  HTTP ์š”์ฒญ์€ DispatcherServlet์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๋“ฑ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 1.2 ์—ญํ• 

  • ์š”์ฒญ ์ฒ˜๋ฆฌ: ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘: ์š”์ฒญ URL๊ณผ ๋งคํ•‘๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ๋ทฐ ๋ฆฌ์กธ๋ฒ„: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋…ผ๋ฆฌ์  ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ(JSP, Thymeleaf ๋“ฑ)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ ๊ด€๋ฆฌ: ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ œ๊ณตํ•œ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—‚ 2. [์ด๋ฆ„]-servlet.xml์˜ ์—ญํ• 

๐Ÿ“Œ 2.1 ๊ฐœ์š”

  • [์ด๋ฆ„]-servlet.xml์€ DispatcherServlet์ด ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ์ „์šฉ Spring MVC ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ [์ด๋ฆ„]์€ DispatcherServlet์˜ ์ด๋ฆ„์ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ web.xml์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: DispatcherServlet์˜ ์ด๋ฆ„์ด "app"์ด๋ฉด ์„ค์ • ํŒŒ์ผ์€ app-servlet.xml์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 2.2 ์ฃผ์š” ์„ค์ • ๋‚ด์šฉ

  • ์ปจํŠธ๋กค๋Ÿฌ ์Šค์บ”: ์–ด๋–ค ํŒจํ‚ค์ง€์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฒ€์ƒ‰ํ• ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    <context:component-scan base-package="com.example.controller" />
  • ๋ทฐ ๋ฆฌ์กธ๋ฒ„(View Resolver): ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
  • MVC ์„ค์ • ํ™œ์„ฑํ™”: ์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ MVC ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
    <mvc:annotation-driven />
  • ์ •์  ๋ฆฌ์†Œ์Šค ๋งคํ•‘: CSS, JavaScript, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ •์  ์ž์›์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    <mvc:resources mapping="/resources/**" location="/static/" />

๐Ÿ“Œ 2.3 ์—ญํ•  ์š”์•ฝ

  • [์ด๋ฆ„]-servlet.xml์€ DispatcherServlet์˜ ๋™์ž‘์„ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ Spring MVC ๊ด€๋ จ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํŒŒ์ผ์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉฐ, ์ „์—ญ ์ปจํ…์ŠคํŠธ(Root ApplicationContext)์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒ 3. root-context.xml์˜ ์—ญํ• 

๐Ÿ“Œ 3.1 ๊ฐœ์š”

  • root-context.xml์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ • ํŒŒ์ผ๋กœ, Spring์˜ Root ApplicationContext๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ContextLoaderListener๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๋ฉฐ, ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ๊ณผ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 3.2 ์ฃผ์š” ์„ค์ • ๋‚ด์šฉ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •: ๋ฐ์ดํ„ฐ ์†Œ์Šค, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mydb" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>
  • ์„œ๋น„์Šค ๋นˆ ๋“ฑ๋ก: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์˜ ๋นˆ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    <bean id="userService" class="com.example.service.UserServiceImpl" />
  • ๊ณตํ†ต ๋นˆ ์„ค์ •: ๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ํ•„์š”ํ•œ ๋นˆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 3.3 ์—ญํ•  ์š”์•ฝ

  • root-context.xml์€ ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์—์„œ ๊ณต์œ ๋˜๋Š” ์ „์—ญ ๋นˆ๊ณผ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋“ค์€ Root ApplicationContext๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ณตํ†ต ๋นˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”— 4. root-context.xml์€ ์–ด๋–ป๊ฒŒ ๋กœ๋“œ๋˜๊ณ  ์—ฐ๊ฒฐ๋˜๋‚˜์š”?

๐Ÿ“Œ 4.1 ContextLoaderListener๋ฅผ ํ†ตํ•œ ๋กœ๋“œ

  • web.xml์—์„œ ContextLoaderListener๋ฅผ ์„ค์ •ํ•˜์—ฌ root-context.xml์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
  • ContextLoaderListener๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ Root ApplicationContext๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ง€์ •๋œ ์œ„์น˜์˜ ์„ค์ • ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 4.2 DispatcherServlet๊ณผ์˜ ๊ด€๊ณ„

  • DispatcherServlet์€ ์ž์‹ ๋งŒ์˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ(ApplicationContext)๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, Root ApplicationContext๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ root-context.xml์— ์ •์˜๋œ ์ „์—ญ ๋นˆ์„ [์ด๋ฆ„]-servlet.xml์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ 4.3 ๋นˆ์˜ ์ ‘๊ทผ ๋ฒ”์œ„

  • Root ApplicationContext: ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ.
  • ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ: ํ•ด๋‹น ์„œ๋ธ”๋ฆฟ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ๊ณผ๋Š” ๋…๋ฆฝ์ ์ž„.

โ“ 5. root-context.xml์„ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๐Ÿ“Œ 5.1 ์—ญํ•  ๋ถ„๋ฆฌ์˜ ์ค‘์š”์„ฑ

  • ์ „์—ญ ์„ค์ •๊ณผ ์„œ๋ธ”๋ฆฟ๋ณ„ ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ์ „์—ญ ์„ค์ • ๋ณ€๊ฒฝ ์‹œ ์„œ๋ธ”๋ฆฟ๋ณ„ ์„ค์ •์— ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ 5.2 ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ

  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์„œ๋ธ”๋ฆฟ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๊ณตํ†ต๋œ ์„ค์ •์€ root-context.xml์—, ๊ฐœ๋ณ„ ์„ค์ •์€ [์ด๋ฆ„]-servlet.xml์— ๋‘์–ด ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 5.3 ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ ๊ฐ„ ๋…๋ฆฝ์„ฑ ์œ ์ง€

  • ๊ฐ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, Root ApplicationContext๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ณตํ†ต ๋นˆ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐœ๋ณ„์ ์œผ๋กœ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 5.4 ๊ธฐ์ˆ ์ ์ธ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ถŒ์žฅ ๋ฐฉ์‹

  • web.xml์—์„œ ๋ชจ๋“  ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ , ํ˜‘์—… ์‹œ์—๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๐Ÿ“ 6. ์ „์ฒด์ ์ธ ๊ด€๊ณ„์™€ ๋™์ž‘ ํ๋ฆ„

  1. web.xml์—์„œ ContextLoaderListener๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด Root ApplicationContext๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ root-context.xml์„ ๋กœ๋“œํ•˜์—ฌ ์ „์—ญ ๋นˆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. web.xml์—์„œ DispatcherServlet์„ ์„ค์ •ํ•˜๊ณ , ๊ฐ ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ์„œ๋ธ”๋ฆฟ์€ ์ž์‹ ์˜ [์ด๋ฆ„]-servlet.xml ์„ค์ • ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋Š” Root ApplicationContext๋ฅผ ์ƒ์†๋ฐ›์•„ ์ „์—ญ ๋นˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์€ DispatcherServlet์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋ฉฐ, ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ 7. ์š”์•ฝ

  • DispatcherServlet: Spring MVC์˜ ํ•ต์‹ฌ ์„œ๋ธ”๋ฆฟ์œผ๋กœ, ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • [์ด๋ฆ„]-servlet.xml: ๊ฐ DispatcherServlet์ด ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ์ „์šฉ ์„ค์ • ํŒŒ์ผ๋กœ, ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๋“ฑ MVC ๊ด€๋ จ ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • root-context.xml: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ • ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์„œ๋น„์Šค ๋นˆ ๋“ฑ ๊ณตํ†ต ๋นˆ๊ณผ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ์˜ ์ด์ : ์—ญํ•  ๋ถ„๋ฆฌ, ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ ๊ฐ„ ๋…๋ฆฝ์„ฑ์„ ํ™•๋ณดํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์ถ”๊ฐ€์ ์ธ ์ฐธ๊ณ  ์‚ฌํ•ญ

  • Spring Boot: ๋งŒ์•ฝ Spring Boot๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์ด Java Config๋‚˜ application.properties๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Spring Boot๋Š” ์ž๋™ ์„ค์ •์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์„ค์ •์˜ ๋ณต์žก์„ฑ์„ ๋งŽ์ด ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
  • Annotation ๊ธฐ๋ฐ˜ ์„ค์ •: XML ์„ค์ • ๋Œ€์‹  Java ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •์„ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ @Configuration, @ComponentScan, @Bean ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์„ค์ • ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”: ์„ค์ • ํŒŒ์ผ ์™ธ์—๋„ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ, ํด๋ž˜์Šค๋ช… ๋“ฑ์—์„œ๋„ ์—ญํ• ์— ๋”ฐ๋ฅธ ๋ถ„๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ๋‘์–ด ๊ด€๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๐Ÿš€Spring MVC์—์„œ root-context.xml์„ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?๐Ÿค”

Spring MVC๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด web.xml์—์„œ ๋ชจ๋“  ์„ค์ •์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , root-context.xml์„ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ด๋ ‡๊ฒŒ ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ์š”? ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ทธ ์ด์œ ์™€ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ธก๋ฉด์—์„œ์˜ ์ด์ ์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง


๐Ÿ” web.xml์—์„œ ๋ชจ๋“  ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ๊ฐ€?

๋„ค, ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜ƒ web.xml์—์„œ ContextLoaderListener๋‚˜ DispatcherServlet์˜ ์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, root-context.xml ์—†์ด๋„ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, context-param์—์„œ ์ง์ ‘ ๋นˆ ์„ค์ •์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/app-servlet.xml</param-value>
</context-param>

ํ•˜์ง€๋งŒ ๋ชจ๋“  ์„ค์ •์„ web.xml์— ๋ชฐ์•„๋„ฃ๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โš ๏ธ


๐Ÿค” ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  root-context.xml์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

root-context.xml์„ ๋ณ„๋„๋กœ ๋‘๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐํ™”์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„ค์ •์„ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ”Ž

1๏ธโƒฃ ์—ญํ•  ๋ถ„๋ฆฌ

  • ์ „์—ญ ์„ค์ • vs ์„œ๋ธ”๋ฆฟ๋ณ„ ์„ค์ •

    • root-context.xml: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋นˆ(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์„œ๋น„์Šค ๊ณ„์ธต)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • [์ด๋ฆ„]-servlet.xml: ์„œ๋ธ”๋ฆฟ๋ณ„๋กœ ๊ตฌ์ฒด์ ์ธ ์„ค์ •(MVC ๊ตฌ์„ฑ ์š”์†Œ, ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๋“ฑ)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ : ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด, ์ „์—ญ ์„ค์ • ๋ณ€๊ฒฝ ์‹œ ๊ฐ ์„œ๋ธ”๋ฆฟ๋ณ„ ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š

2๏ธโƒฃ ํ™•์žฅ์„ฑ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ ํ™•๋Œ€ ์‹œ ์œ ๋ฆฌ

    • ์—ฌ๋Ÿฌ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ ์„œ๋ธ”๋ฆฟ๋งˆ๋‹ค ํ•„์š”ํ•œ ์„ค์ •์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณตํ†ต ์„ค์ •์€ root-context.xml์—, ์„œ๋ธ”๋ฆฟ๋ณ„ ์„ค์ •์€ ๊ฐ [์ด๋ฆ„]-servlet.xml์— ๋‘๋ฉด ์ค‘๋ณต๋œ ์„ค์ • ์—†์ด ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ

    • ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ์„œ๋ธ”๋ฆฟ๊ณผ ์ผ๋ฐ˜ ์ฝ˜ํ…์ธ  ํ‘œ์‹œ ์„œ๋ธ”๋ฆฟ์˜ ์„ค์ •์ด ๋‹ค๋ฅผ ๋•Œ, ๊ณตํ†ต ์„ค์ •์€ root-context.xml์—, ๊ฐœ๋ณ„ ์„ค์ •์€ ๊ฐ ์„œ๋ธ”๋ฆฟ ์„ค์ • ํŒŒ์ผ์— ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์œ ์ง€๋ณด์ˆ˜

  • ์œ ์ง€๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ

    • ๋ชจ๋“  ์„ค์ •์„ web.xml ํ•˜๋‚˜์— ๋ชฐ์•„๋„ฃ์œผ๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๐Ÿ˜ต
    • ์„ค์ •์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด, ํŠน์ • ์„ค์ •์„ ์ˆ˜์ •ํ•  ๋•Œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜‘์—… ์‹œ ์ด์ 

    • ์ „์—ญ ์„ค์ •๊ณผ ์„œ๋ธ”๋ฆฟ ๊ด€๋ จ ์„ค์ •์„ ๋ถ„๋ฆฌํ•ด๋‘๋ฉด, ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•  ๋•Œ ์„ค์ • ๊ตฌ์„ฑ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘ฅ

4๏ธโƒฃ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ ๊ฐ„์˜ ๋…๋ฆฝ์„ฑ

  • ๋…๋ฆฝ์ ์ธ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ

    • root-context.xml์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ Root ApplicationContext๋Š” ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ์„œ๋ธ”๋ฆฟ์˜ ApplicationContext๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ 

    • ๊ณตํ†ต๋œ ๋นˆ์€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋ฉฐ, ์„œ๋ธ”๋ฆฟ๋ณ„๋กœ ํ•„์š”ํ•œ ๋นˆ์€ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ’ก

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