[Spring] @Configuration๊ณผ ๋ฐ์ดํธ์ฝ๋ ์กฐ์
๐ @Configuration๊ณผ ๋ฐ์ดํธ์ฝ๋ ์กฐ์
์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ค. ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ด ๋๋๋ก ๋ณด์ฅํด์ฃผ๋ ๊ตฌ์กฐ๋ค. ๊ทธ๋ฐ๋ฐ ์คํ๋ง ์์์ ์๋ฐ ์ฝ๋๋ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋ ๊น. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์คํ๋ง์ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. @Configuration์ ์ ์ฉํ AppConfig์์ ๋ ํ์คํ ์ ์ ์๋ค.
- ์ฌ์ค AnnotationConfigApplicationContext์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ๊ทธ๋์ AppConfig๋ ์คํ๋ง ๋น์ด ๋๋ค. AppConfig ์คํ๋ง ๋น์ ์กฐํํด์ ํด๋์ค ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
bean = class com.company.shop.AppConfig$$EnhancerBySpringCGLIB$$d397f221
- ํ์ง๋ง, ์์ํ ํด๋์ค ๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋์ด์ผ ํ๋ ๊ฒ ๋ง๋ค.
class com.company.shop.AppConfig
๊ทธ๋ฐ๋ฐ ์์๊ณผ๋ ๋ค๋ฅด๊ฒ ํด๋์ค๋ช ์ xxxCGLIB๊ฐ ๋ถ์ผ๋ฉด์ ์ถ๋ ฅ๊ฒฐ๊ณผ๊ฐ ๋ณต์กํด์ง ๊ฒ์ ์ ์ ์๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ด๊ฐ ๋ง๋ ํด๋์ค๊ฐ ์๋๋ผ ์คํ๋ง์ด CGLIB๋ผ๋ ๋ฐ์ดํธ ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ AppConfig ํด๋์ค๋ฅผ ์์๋ฐ์ ์์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ๊ฒ์ด๋ค.
์คํ๋ง์ด ๋ง๋ ์์์ ๋ค๋ฅธ ํด๋์ค๊ฐ ๋ฐ๋ก ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋๋ก ํด์ค๋ค.
์๋ง๋ ์๋์ ๊ฐ์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํด์ ์์ฑ๋์ด ์์ ๊ฒ์ด๋ค. (์ค์ ๋ก๋ ๋ ๋ณต์กํ๋ค)
AppConfig@CGLIB ์์ ์ฝ๋
@Bean
public MemberRepository memberRepository(){
if (memoryMemberRepository ๊ฐ ์ด๋ฏธ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋์ด ์์ผ๋ฉด?) {
return ์คํ๋ง ์ปจํ
์ด๋์ ์ฐพ์์ ๋ฐํ;
} else { //์คํ๋ง ์ปจํ
์ด๋์ ์์ผ๋ฉด
๊ธฐ์กด ๋ก์ง์ ํธ์ถํด์ MemoryMemberRepository๋ฅผ ์์ฑํ๊ณ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก
return ๋ฐํ;
}
}
- @Bean ์ด ๋ถ์ ๋ฉ์๋๋ง๋ค ์ด๋ฏธ ์คํ๋ง ๋น์ด ์กด์ฌํ๋ฉด ์กด์ฌํ๋ ๋น์ ๋ฐํํ๊ณ , ์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์ฑํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ๋ฐํํ๋ ์ฝ๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด์ง๋ค.
- ๋๋ถ์ ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋ ๊ฒ์ด๋ค.
- AppConfig@CGLIB๋ AppConfig์ ์์ํ์ ์ด๋ฏ๋ก, AppConfig ํ์ ์ผ๋ก ์กฐํํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด!!
@Configuration์ ์ ์ฉํ์ง ์๊ณ @Bean๋ง ์ ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
@Configuration์ญ์ ์ฝ๋
//@Configuration ์ญ์
public class AppConfig{
}
bean = class com.company.shop.AppConfig
- ์ด ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํตํด์ AppConfig๊ฐ CGLIB ๊ธฐ์ ์์ด ์์ํ AppConfig๋ก ์คํ๋ง ๋น์ ๋ฑ๋ก๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
call AppConfig.memberRepository
call AppConfig.memberRepository
- ์ด ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํตํด์ MemberRepository๊ฐ ์ด 3๋ฒ ํธ์ถ๋ ๊ฒ์ ์ ์ ์๋ค. 1๋ฒ์ @Bean์ ์ํด ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ธฐ ์ํด์์ด๊ณ , ๋๋จธ์ง๋ ๊ฐ๊ฐ memberRepository()๋ฅผ ํธ์ถํ๋ฉด์ ๋ฐ์ํ ์ฝ๋๋ค.
์ธ์คํด์ค๊ฐ ๊ฐ์์ง ํ ์คํธ ๊ฒฐ๊ณผ
memberService -> memberRepository =
hello.core.member.MemoryMemberRepository@5236acv3
orderService -> memberRepository =
hello.core.member.MemoryMemberRepository@3e5103fc
memberRepository = hello.core.member.MemoryMemberRepository@12359a03
- ๋น์ฐํ ์ธ์คํด์ค๊ฐ ๊ฐ์์ง ํ ์คํธ ํ๋ ์ฝ๋๋ ์คํจํ๊ณ , ๊ฐ๊ฐ ๋ค ๋ค๋ฅธ MemoryMemberRepository ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ ๋ฆฌ
- @Bean๋ง ์ฌ์ฉํด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ง๋ง, ์ฑ๊ธํค์ ๋ณด์ฅํ์ง ์๋๋ค.
- memberRepository() ์ฒ๋ผ ์์กด๊ด๊ณ ์ฃผ์ ์ด ํ์ํด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋ ์ฑ๊ธํค์ด ๋ณด์ฅํ์ง ์๋๋ค.
- ์คํ๋ง ์ค์ ์ ๋ณด๋ ํญ์ @Configuration์ ์ฌ์ฉํ์.