์์ ์คํ๋ง ์ปจํ ์ด๋์ ๋ํด์ ์ดํด๋ณด์๋ค. ๊ทธ๋ฐ๋ฐ AppConfig๋ฅผ ๋ณด๋ฉด ์ด์ํ ์ ์ด ์๋ค...๐ค
@Configuration
public class AppConfig {
@Bean //spring container ์ ๋ฑ๋ก๋จ
public MemberService memberService(){
return new MemberServiceImpl(memberRepository()); // DI ์ฃผ์
(์์กด๊ด๊ณ ์ฃผ์
)
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
...
}
์ ์ฝ๋์์ memberService ๋น์ ๋ง๋๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด memberRepository()๋ฅผ ํธ์ถํ๋ฉด ๋ฐ์ new MemoryMemberRepostiory()๋ฅผ ํธ์ถํ๊ณ , orderService๋น์ ๋ง๋๋ ๋ถ๋ถ์์๋ memberRepository()๋ฅผ ํธ์ถํ๋ฉด ๋ฐ์ new MemoryMemberRepostiory()๋ฅผ ํธ์ถํ๋ค.
์ฆ ๊ฐ๊ฐ ๋ค๋ฅธ ๋๊ฐ์ MemoryMemberRepository๊ฐ ์์ฑ๋๋ ๊ฒ ๊ฐ๊ณ ์ด๋ ์ฑ๊ธํค ํจํด์ด ๊นจ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
๊ณผ์ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ธ์ง ์์๋ณด์!!
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
//ํ
์คํธ ์ฉ๋
public MemberRepository getMemberRepository(){
return memberRepository;
}
}
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
//ํ
์คํธ ์ฉ๋
public MemberRepository getMemberRepository() {
return memberRepository;
}
}
public class ConfigurationSingletonTest {
@Test
void configurationTest(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class);
MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
MemberRepository memberRepository1 = memberService.getMemberRepository();
MemberRepository memberRepository2 = orderService.getMemberRepository();
//๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
System.out.println("memberService -> memberRepository = " + memberRepository1);
System.out.println("orderService -> memberRepository = " + memberRepository2);
System.out.println("memberRepository = " + memberRepository);
assertThat(memberService.getMemberRepository()).isSameAs(memberRepository);
assertThat(orderService.getMemberRepository()).isSameAs(memberRepository);
}
์์์ ์ฐ๋ คํ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ณ ์๋ ๊ฒ์ด๋ค...๐ฒ
ํธ์ถ์ด ๋ช๋ฒ ๋๋์ง ์ข ๋ ๋ํ
์ผ ํ๊ฒ ํ
์คํธํด๋ณด์๋ค.
@Configuration
public class AppConfig {
@Bean //spring container ์ ๋ฑ๋ก๋จ
public MemberService memberService(){ //๋ฆฌํฉํ ๋ง์ ํตํด ์ญํ ์ ๋ช
ํํ๊ฒ ๋ณด์ฌ์ค, ์ค๋ณต์ ๊ฑฐ
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository()); // DI ์ฃผ์
(์์กด๊ด๊ณ ์ฃผ์
)
}
@Bean
public MemberRepository memberRepository() {
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
์๋๋๋ก๋ผ๋ฉด memberRepository()๋ 3๋ฒ ํธ์ถ๋์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ 1๋ฒ๋ง ํธ์ถ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฌํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ ๊ฒ์ @Configuration ๋๋ถ์ด๋ค.
์์ ์ฝ๋์์๋ ํ์ธํ ์ ์๋ฏ์ด AppConfig ํด๋์ค ์๋จ์๋ @Configuration์ด ๋ถ์ด ์๋ค.
public class ConfigurationSingletonTest {
@Test
void configurationDeep(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
AppConfig bean = ac.getBean(AppConfig.class);
System.out.println("bean = " + bean.getClass()); //bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$5b1c10ee
}
}
์ฌ๊ธฐ์ AnnotationConfigApplicationContext()์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ๊ทธ๋์ AppConfig๋ ์คํ๋ง ๋น์ธ ๊ฒ์ด๋ค!
AppConfig ํด๋์ค๋ ์์ํ ํด๋์ค๋ผ๋ฉด class hello.core.AppConfig๋ก ์ถ๋ ฅ๋์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ๋ค์ ์ด์ํ ๊ฒ๋ค์ด ๋ถ์ด์๋ค....๐ง
์ด๋ ์คํ๋ง์ด CGLIB์ด๋ผ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ AppConfig ํด๋์ค๋ฅผ ์์๋ฐ์ ์์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ . ๊ทธ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ๊ฒ์ด๋ค.
๊ทธ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ฑ๊ธํค์ ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์์์์ ๊ฐ์ด memberRepositroy()๊ฐ 3๋ฒ์ด ์๋ 1๋ฒ๋ง ํธ์ถ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ AppConfigํด๋์ค์์ @Configuration์ ์์ค๋ค๋ฉด memberRepository()๋ 3๋ฒ ํธ์ถ๋๊ณ ์ฑ๊ธํค์ ๊นจ์ ธ ๋ฒ๋ฆฌ๊ฒ ๋๋ค...๐ญ