์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฑ๊ธํค
- ์คํ๋ง์ ํ์์ด ๊ธฐ์ ์ฉ ์จ๋ผ์ธ ์๋น์ค ๊ธฐ์ ์ ์ง์ํ๊ธฐ ์ํด ํ์ํ๋ค.
- ๋๋ถ๋ถ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ค. ๋ฌผ๋ก ์น์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๋ ์ผ๋ง๋ ์ง ํ ์ ์๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ฌ๋ฌ ๊ณ ๊ฐ์ด ๋์์ ์์ฒญ์ ํ๋ค.
- ์คํ๋ง ์๋ ์์ํ DI ์ปจํ ์ด๋์ธ AppConfig ๋ ์์ฒญ์ ํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ค.
- ์ด๋น 100๊ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด 100๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค โ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
- ๋ฑ 1๊ฐ๋ง ์์ฑํด์ ๊ณต์ ํ๋๋ก ์ค๊ณํด์ ํด๊ฒฐ ๊ฐ๋ฅ โ ์ฑ๊ธํค ํจํด
์ฑ๊ธํค ํจํด
- ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ด๋ค.
- ๊ทธ๋์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ 2๊ฐ ์ด์ ์์ฑํ์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ค.
private
์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์ธ๋ถ์์ ์์๋กnew
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ค.
static
์์ญ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ํ๋ ์์ฑํด์ ์ฌ๋ ค๋๋ค.- ์ด ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ํ์ํ๋ฉด ์ค์ง
getInstance()
๋ฉ์๋๋ฅผ ํตํด์๋ง ์กฐํํ ์ ์๋ค. ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. - ๋ฑ 1๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ง ์กด์ฌํด์ผ ํ๋ฏ๋ก, ์์ฑ์๋ฅผ
private
์ผ๋ก ๋ง์์ ํน์๋ผ๋ ์ธ๋ถ์์new
ํค์๋๋ก ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ง๋๋ค.
์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์
- ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ์ฝ๋ ์์ฒด๊ฐ ๋ง์ด ๋ค์ด๊ฐ๋ค.
- ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ค. โ DIP ์๋ฐ
- ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํด์ OCP ์์น์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค.
- ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ด๊ธฐํ ํ๊ธฐ ์ด๋ ต๋ค.
private
์์ฑ์๋ก ์์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.- ๊ฒฐ๋ก ์ ์ผ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ํฐํจํด์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
์ฑ๊ธํค ์ปจํ ์ด๋
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ฉด์, ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ์ง ์์๋, ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ์ปจํ ์ด๋ ์ญํ ์ ํ๋ค. ์ด๋ ๊ฒ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ ๋ผ๊ณ ํ๋ค.
- ์คํ๋ง ์ปจํ
์ด๋์ ์ด๋ฐ ๊ธฐ๋ฅ ๋๋ถ์ ์ฑ๊ธํค ํจํด์ ๋ชจ๋ ๋จ์ ์ ํด๊ฒฐํ๋ฉด์ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ ์ ์๋ค.
- ์ฑ๊ธํค ํจํด์ ์ํ ์ง์ ๋ถํ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ง ์์๋ ๋๋ค.
- DIP, OCP, ํ ์คํธ, private ์์ฑ์๋ก ๋ถํฐ ์์ ๋กญ๊ฒ ์ฑ๊ธํค์ ์ฌ์ฉํ ์ ์๋ค.
์ฑ๊ธํค ๋ฐฉ์์ ์ฃผ์์
- ์ฑ๊ธํค ํจํด์ด๋ , ์คํ๋ง ๊ฐ์ ์ฑ๊ธํค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ , ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํด์ ๊ณต์ ํ๋ ์ฑ๊ธํค ๋ฐฉ์์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ๊ฐ์ฒด๋ ์ํ๋ฅผ ์ ์ง(stateful)ํ๊ฒ ์ค๊ณํ๋ฉด ์๋๋ค.
- ๋ฌด์ํ(stateless)๋ก ์ค๊ณํด์ผ ํ๋ค!
- ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
- ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค!
- ๊ฐ๊ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผ ํ๋ค.
- ํ๋ ๋์ ์ ์๋ฐ์์ ๊ณต์ ๋์ง ์๋, ์ง์ญ๋ณ์, ํ๋ผ๋ฏธํฐ, ThreadLocal ๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
@Configuration ๊ณผ ์ฑ๊ธํค
์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ฐ๊ฐ @Bean์ ํธ์ถํด์ ์คํ๋ง ๋น์ ์์ฑํ๋ค. ๊ทธ๋์ memberRepository() ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด 3๋ฒ์ด ํธ์ถ๋์ด์ผ ํ๋ ๊ฒ ์๋๊น?
- ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์คํ๋ง ๋น์ ๋ฑ๋กํ๊ธฐ ์ํด @Bean์ด ๋ถ์ด์๋ memberRepository() ํธ์ถ
- memberService() ๋ก์ง์์ memberRepository() ํธ์ถ
- orderService() ๋ก์ง์์ memberRepository() ํธ์ถ ํ์ง๋ง ๊ฒฐ๊ณผ๋ ํ ๋ฒ๋ง ํธ์ถ๋๋ค.
@Configuration ๊ณผ ๋ฐ์ดํธ์ฝ๋ ์กฐ์์ ๋ง๋ฒ
์คํ๋ง ์ปจํ
์ด๋๋ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ค. ๋ฐ๋ผ์ ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ด ๋๋๋ก ๋ณด์ฅํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์คํ๋ง์ด ์๋ฐ ์ฝ๋๊น์ง ์ด๋ป๊ฒ ํ๊ธฐ๋ ์ด๋ ต๋ค.
์ ์๋ฐ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ถ๋ช
3๋ฒ ํธ์ถ๋์ด์ผ ํ๋ ๊ฒ์ด ๋ง๋ค.
๊ทธ๋์ ์คํ๋ง์ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๋ชจ๋ ๋น๋ฐ์ @Configuration ์ ์ ์ฉํ AppConfig ์ ์๋ค.
- AppConfig ๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋๋ฐ, CGLIB ์ด๋ผ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ AppConfig ๋ฅผ ์์๋ฐ์ ํ๋ก์๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
- ์ด AppConfig@CGLIB ์ด ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋๋ก ํด์ค๋ค.
- @Bean ์ด ๋ถ์ ๋ฉ์๋๋ง๋ค ์ด๋ฏธ ์คํ๋ง ๋น์ด ์กด์ฌํ๋ฉด ์กด์ฌํ๋ ๋น์ ๋ฐํํ๊ณ , ์์ผ๋ฉด ์์ฑํด์ ๋น์ผ๋ก ๋ฑ๋ก ํ ๋ฐํํ๋ ์ฝ๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด์ง๋ค.
- ์ด๋ฅผ ํตํด ์ฑ๊ธํค์ ๋ณด์ฅํ๋ค.
@Configuration ์ ์ ์ฉํ์ง ์๊ณ @Bean ๋ง ์ ์ฉํ๋ค๋ฉด?
CGLIB ์์ด ์์ํ AppConfig ๋ก ์คํ๋ง ๋น์ด ๋ฑ๋ก๋๋ค. CGLIB ์ด ์ ์ฉ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋น๋ค์ด ์ฑ๊ธํค์ผ๋ก ๋ณด์ฅ๋์ง ์๊ณ ์ฌ๋ฌ ๋ฒ ์์ฑ๋๋ค.
- @Bean ๋ง ์ฌ์ฉํด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ง๋ง, ์ฑ๊ธํค ๋ณด์ฅํ์ง ์์
memberRepository()
์ฒ๋ผ ์์กด๊ด๊ณ ์ฃผ์ ์ด ํ์ํด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋ ์ฑ๊ธํค์ ๋ณด์ฅํ์ง ์๋๋ค.