@Configuration과 바이트코드 조작에 대해서 알아보았다.
스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야한다.
근데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 이전의 자바코드를 보면 분명 memberRepository가
3번 호출이 되어야하는것이 맞다.
이 비밀은 @Configuration에 있다.
@Test
void ConfigurationDeep(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
AppConfig bean = ac.getBean(AppConfig.class);
System.out.println("bean = " + bean.getClass());
}
테스트 코드를 하나 더 작성해보았다.
AppConfig자체도 빈에 등록되기때문에 이 빈의
클래스 타입을 보기위한 코드이다.
$$부터 이상한 출력이나온다 뭐지..?
순수한 클래스라면
class hello.core.AppConfig 라고 떠야한다.
그런데 예상과는 다르게 클래스 명에 xxxCGLIB가 붙으면서 복잡해진 모습이다.
이것은 내가 만든 클래스가 아니라 스프링이 CGLIB라는 바이트코드 조작 라이브러리를 사용해서
AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고 그 다른 클래스를 스프링 빈으로
등록한 것이다.
스프링이 AppConfig를 상속받는 다른 클래스를 만들고
그애를 스프링 빈으로 등록한 것!! 그 임의의 클래스가 바로
싱글톤이 보장되도록 해준다.
@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고,
스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다.
덕분에 싱글톤이 보장이된다.
@Configuration은 안붙여도 @Bean만 적용하면 어떻게될까?
@Configuration을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장하지만
만약 @Bean만 적용하면 어떻게 될까?
@Configuration 을 주석처리하고 이전의 테스트 코드를 돌려보았다.
그렇게 하니 아래와같이 memberRepository가 3번 호출되고
실제 빈에 AppConfig 자체가 등록되었다.
@Bean 만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.
크게 고민할 것없이 스프링 설정 정보는 항상 @Configuration을 사용하면 된다.
'웹프로그래밍 > Spring 핵심 원리' 카테고리의 다른 글
33. 탐색 위치와 기본 스캔 대상 (0) | 2021.08.05 |
---|---|
32. 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2021.08.03 |
30. @Configuration과 싱글톤 (0) | 2021.07.30 |
29. 싱글톤 방식의 주의점 (0) | 2021.07.30 |
28. 싱글톤 컨테이너 (0) | 2021.07.23 |