Spring MVC
๐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