스프링

Configuration과 싱글톤

salmon16 2023. 7. 14. 20:30

스프링 컨테이너를 등록할 때 사용하는 Appconfig.class를 보자

@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("casll AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy() {
        System.out.println("call AppConfig.discountPolicy");
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

이 코드를 보면 memberService의 memberRepository(), orderService의 memberRepository()

 memberRepository() 함수가 2번 호출된다  memberRepository() 함수 안에서는 new MemoryMemberRepository()를 return 하는데 이러면 MemoryMemberRepository()가 2개의 인스턴스가 생겨 싱글톤이 깨지는 거처럼 보인다. 

 

하지만 getBean함수를 통해 memberService, orderService에서 memberRepository를 꺼내보면 같은 인스턴스라는 것을 확인할 수 있다.

 

각 Bean이 호출될 때마다 print함수를 사용해서 로그를 남겨보면  memberRepository()는 1번만 호출되는 걸 알 수 있다.

 

Configuration과 바이트코드 조작

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

AnnotationConfigApplicationContext함수의 인자인 AppConfig도 스프링 빈으로 등록된다.

이 빈을 조회해 보면

hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d79 이렇게 뒤에 CGLIB가 붙으면서 나오게 된다

이것의 뜻은 내가 만든 클래스가 아니라 CGLIB라는 바이트조작 라이브러리를 사용해서 AppConfig클래스를 상속받은 다른 클래스를 스프링 빈으로 등록한 것이다.

이렇게 생성된 클래스가 싱글톤이 보장되도록 해준다.

 

CGLIB의 예상코드

@Bean
public MemberRepository memberRepository() {

	if(memoryMemberRepository가 스프링에 등록되어있으면) {
    	return 스프링 컨테이너에서 찾아서 리턴;
    }
    else {
    	new MemoryMemberRepository를 생성해서 스프링 컨테이너에 등록
        return 반환
   }
}

간단하게 예상해 보면 위와 같은 코드로 되어있을 것이다.

즉 @Configuraion을 적용하지 않고 @Bean만 한다면 CGLIB코드를 적용하지 못하기 때문에 싱글톤이 보장 안될 수 있다.

출처 : 인프런 스프링 핵심 원리 - 기본 편  김영한

'스프링' 카테고리의 다른 글

컴포넌트 스캔 탐색 위치  (0) 2023.07.18
컴포넌트 스캔  (0) 2023.07.17
싱글톤 방식의 주의점  (0) 2023.07.11
싱글톤 패턴, 싱글톤 컨테이너  (0) 2023.07.11
XML로 스프링 컨테이너 설정 정보 사용하기  (0) 2023.07.10