๐Ÿ“˜Spring MVC ( Bean ๊ฐ์ฒด์™€ ์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด )

MVC๋ž€

  • Model-View-Controller์˜ ์•ฝ์ž์ด๋ฉฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋ฅผ ์—ญํ• ์— ๋”ฐ๋ผ ์„ธ๊ฐ€์ง€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ๋ถ„ํ•œ ํŒจํ„ด์ด๋‹ค.

Model

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ๋ž€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•œ ์ž‘์€ ๊ธฐ๋Šฅ์  ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค

-์‚ฌ์šฉ์ž๊ฐ€ ์ด์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•˜๋ฉฐ, View๋˜๋Š” Controller์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ •๋ณด๋„ ์•Œ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค

View

  • ์‹œ๊ฐ์ ์ธ UI์š”์†Œ๋ฅผ ์ž์นญํ•˜๋Š” ์šฉ์–ด์ด๋‹ค
  • model์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์•ˆ๋œ๋‹ค
  • model์ด๋‚˜ controller์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ฉด ์•ˆ๋˜๋ฉฐ ๋‹จ์ˆœํžˆ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

Controller

  • Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• 
  • Model๋˜๋Š” View์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค

Spring MVC

  • ๊ฐœ๋ณ„ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋Š” ํ•ธ๋“ค๋Ÿฌ๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, DI๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•ด๋‘” Bean์„ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Model์— ๋‹ด์•„ ๋‹ค์‹œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ณด๋‚ธ๋‹ค. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฐ›์€ Model์„ ์•Œ๋งž์€ View ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฐ˜์˜์‹œํ‚ค๊ณ , ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ํ™”๋ฉด์„ ์‘๋‹ต ๊ฒฐ๊ณผ๋กœ ์ „์†กํ•œ๋‹ค

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ž€?

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

Bean ๊ฐ์ฒด

  • Spring์—์„œ๋Š” POJO(Plain old java Object)๋ฅผ beans๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค
  • Spring IoC์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋นˆ(Bean)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค

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

  • Spring์—์„œ๋Š” ์ง์ ‘ new๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, Spring์— ์˜ํ•˜์—ฌ ๊ด€๋ฆฌ๋‹นํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ Spring์— ์˜ํ•˜์—ฌ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • Spring Bean ์„ ์–ป๊ธฐ ์œ„ํ•˜์—ฌ ApplicationContext.getBean()์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

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

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ์žฅ์ 

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

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋‹จ์ 

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ฅผ ์•ˆํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ 2๊ฐœ๊ฐ€ ์ƒ์„ฑ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค

๊ฐœ๋ฐฉ ํ์‡„์˜ ์›์น™(OCP)์ด๋ž€ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•œ๋‹ค.

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

Reference

https://ss-o.tistory.com/160 https://steady-coding.tistory.com/594 https://melonicedlatte.com/2021/07/11/232800.html https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/ https://devmoony.tistory.com/43 https://gyoogle.dev/blog/design-pattern/Singleton%20Pattern.htmlx

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: