AppConfig 내에서 같은 클래스의 객체를 필요로 하는 메서드가 여러 개 있을 수 있다.

 

memberService(), orderService() 내부에서 MemberRepository 의 객체를 필요로 하여 memberRepository() 를 호출한다면? 

-> memberRepository() 는 두 번 호출되어 MemberRepository 의 객체는 두 번 생성될 것이다.

하지만 로그를 찍어보면 memberRepository() 는 딱 한 번만 호출되어 싱글톤이 유지되는 것을 알 수 있다.

 

스프링 컨테이너는 어떻게 이를 가능하게 하는가? 

 

->

 

스프링 컨테이너는 @Configuration 이 달린 클래스를 상속받는 클래스를 따로 만들어낸다.

(이 경우는 AppConfig@@@CGLIB)

 

이 자식클래스 내부에서 기존 AppConfig의 메서드들을 오버라이딩 한다.

오버라이딩 된 메서드의 대략적인 "예상" 로직은 아래와 같다.

@Override
@Bean 
public MemberRepository memberRepository() { 
    
    if (memoryMemberRepository가 이미 스프링 컨테이너에 등록되어 있으면?) { 
        return 스프링 컨테이너에서 찾아서 반환; 
    } else { //스프링 컨테이너에 없으면 
        기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록 
        return 반환 
    }
}

이런 식으로 싱글톤을 보장한다.

 

이때 AppConfig를 상속받은 AppConfig@@@CGLIB는 AppConfig의 자식 클래스이기 때문에 AppConfig 타입으로 조회가 가능하다.

 

 

 

만약 @Configuration 없이 @Bean만 사용한다면?

 

@Bean에 의해 스프링 컨테이너에 빈 등록이 되긴 하지만 싱글톤 패턴은 @Configuration에 의해서 보장받는 것이기 때문에 여러 개의 객체가 생성된다.

(심지어 의존관계에 따라 Bean 등록이 되지 않는 것들도 있다.)

 

 

 

 

 

출처 : 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/dashboard

+ Recent posts