๐ก Singleton Container๊ฐ ํ์ํ ์ด์ ?
์คํ๋ง ์๋ ์์ํ DI ์ปจํ ์ด๋ : ์์ฒญ์ ํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑ
- ๊ณ ๊ฐ ํธ๋ํฝ์ด ์ด๋น 100์ด ๋์ค๋ฉด ์ด๋น 100๊ฐ ๊ฐ์ฒด๊ฐ ์์ฑ / ์๋ฉธ : ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
๐๐ป ํด๊ฒฐ๋ฐฉ์ : ํด๋น ๊ฐ์ฒด๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๊ณ , ๊ณต์ ํ๋๋ก ์ค๊ณํ๊ธฐ : ์ฑ๊ธํค ํจํด
: ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด
private
์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์ธ๋ถ์์ ์์๋ก new
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํจ๊ทธ๋ฌ๋ฉด ์์ฑ์ ์ฐ๋ฉด Compile Error ํฐ์ง
์ธ์์์ ์ ์ผ ์ข์ ์ค๋ฅ = ์ปดํ์ผ์ค๋ฅ
๐ก ์ฐธ๊ณ
์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค. ์ฌ๊ธฐ์์๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๋, ๊ฐ์ฅ ๋จ์ํ๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
: ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ
๐ก ์ฐธ๊ณ
- ์คํ๋ง์ ๊ธฐ๋ณธ ๋น ๋ฑ๋ก ๋ฐฉ์ = ์ฑ๊ธํค
- ๋จ, ์ฑ๊ธํค ์ด์ธ์ ๋ฐฉ์๋ ์กด์ฌ!
์์ฒญ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณต
๐ก ์ ๋ฆฌ
- ์ค๋ฌด์์ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ข ์ข ๋ณด๋๋ฐ, ์ด๋ก์ธํด ์ ๋ง ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ํฐ ๋ฌธ์ ๋ค์ด ํฐ์ง๋ค.(๋ช๋ ์ ํ๋ฒ์ฉ ๊ผญ ๋ง๋๋ค.)
- ์ง์ง ๊ณต์ ํ๋๋ ์กฐ์ฌํด์ผ ํ๋ค! ์คํ๋ง ๋น์ ํญ์ ๋ฌด์ํ(stateless)๋ก ์ค๊ณํ์.
: ์ฑ๊ธํค์ ์ํด ์กด์ฌํจ!
์คํ๋ง์ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
AnnotationConfigApplicationContext
์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ๊ทธ๋์ AppConfig
๋ ์คํ๋ง ๋น์ด ๋๋ค.CGLIB
๋ผ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ AppConfig
ํด๋์ค๋ฅผ ์์๋ฐ์ ์์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.AppConfig@CGLIB ์์ ์ฝ๋
@Bean
public MemberRepository memberRepository() {
if (memoryMemberRepository๊ฐ ์ด๋ฏธ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋์ด ์์ผ๋ฉด?) {
return ์คํ๋ง ์ปจํ
์ด๋์์ ์ฐพ์์ ๋ฐํ;
} else { //์คํ๋ง ์ปจํ
์ด๋์ ์์ผ๋ฉด
๊ธฐ์กด ๋ก์ง์ ํธ์ถํด์ MemoryMemberRepository๋ฅผ ์์ฑํ๊ณ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก
return ๋ฐํ
}
}
๐ก ์ฐธ๊ณ
AppConfig@CGLIB๋ AppConfig์ ์์ ํ์ ์ด๋ฏ๋ก, AppConfig ํ์ ์ผ๋ก ์กฐํ ํ ์ ์๋ค.
๐๐ป ์ ๋ฆฌ
ํฌ๊ฒ ๊ณ ๋ฏผํ ๊ฒ์ด ์๋ค. ์คํ๋ง ์ค์ ์ ๋ณด๋ ํญ์@Configuration
์ ์ฌ์ฉํ์