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 등록이 되지 않는 것들도 있다.)
'김영한님 스프링 강의 정리 > 핵심원리 기본편' 카테고리의 다른 글
빈 이름 중복에 의한 충돌 (0) | 2021.01.10 |
---|---|
컴포넌트 스캔 - @Component, @Autowired, @Qualifier (0) | 2021.01.09 |
싱글톤 컨테이너 (0) | 2021.01.08 |
컨테이너에 등록된 Bean 모두 조회 (0) | 2021.01.07 |
AppConfig의 Spring 스타일 사용 (0) | 2021.01.07 |