Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] Configuration과 Singleton

by skahn1215 2021. 5. 5.
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번 호출이 된다. 

 

 

 

 

 

참고: www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55366?tab=note

 

스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

 

728x90
반응형

댓글