728x90
반응형
앞서 어플리케이션과 싱글톤의 관계를 스터디 하였다
그렇다면 어떻게 싱글톤이 유지 될까?
예제를 통해 알아보자
AppConfig 코드
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
System.out.println("Call: AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
System.out.println("Call: AppConfig.memberRepository");
return new MemberMemoryRepository();
}
@Bean
public OrderService orderService() {
System.out.println("Call: AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
위에서 호출 되는 것을 눈으로 보기 위해
출력 코드를 넣어 주었다.
예상 출력
호출 순서는 보장 하지 않지만 논리적으로 봤을때 다음과 같은 결과를 기대한다.
1. System.out.println("Call: AppConfig.memberService");
2. System.out.println("Call: AppConfig.memberRepository");
3. System.out.println("Call: AppConfig.memberRepository");
4. System.out.println("Call: AppConfig.orderService");
5. System.out.println("Call: AppConfig.memberRepository");
그렇다면 다음과 같은 결론이 나온다.
1. memberRepository가 여러번 불리면 그만큼 new MemberMemoryRepository 호출 된다.
2. 그렇다면 싱글톤이 유지가 안된다.
하지만 실제 출력을 예상과 다르다.
실제출력
Call: AppConfig.memberService
Call: AppConfig.memberRepository
Call: AppConfig.orderService
Configuration의 역할
스프링 컨테이너는 싱글톤을 유지시켜준다.
원래 코드라면 memberService가 3번 호출되어야 맞다.
하지만 스프링의 바이트코드를 조작하는 라이브러리를 사용한다.
힌트는 @Configuration 을 적용한 AppConfig에 힌트가 있다.
AppConfig 출력해보기
출력코드
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$$a5c98d0b
위의 예제에서 순수한 클래스면 bean = class hello.core.AppConfig 까지 나와야 맞다.
그럼 뒤에 출력된 EnhancerBySpringCGLIB은 무엇인가?
설명
스프링이 CGLIB라는 바이트코드 조작 라이버르리를 사용해서 AppConfig 클래스를
상속 받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한것이다.
Configuration 을 적용하지 않으면?
싱글톤이 보장 되지 않고 예상대로
memberService가 3번 호출이 된다.
728x90
반응형
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] ComponentScan2 - Annotation만들기 (0) | 2021.05.08 |
---|---|
[Spring] ComponentScan1 - 기초 (0) | 2021.05.08 |
[Spring] 웹 애플리케이션과 싱글톤2 (0) | 2021.05.05 |
[Spring] 웹 애플리케이션과 싱글톤1 (0) | 2021.05.05 |
[Spring] BeanFactory 와 ApplicationContext (0) | 2021.05.01 |
댓글