자바 빈을 관리하는 @Configuration 어노테이션이 붙은 자바의 AppConfig class를 보면,
각 메소드의 return값은 새로운 객체이다.
그럼에도 싱글톤이 보장되기 때문에 AppConfig를 볼 때마다 의문이 들었다.
정답은 @Configuration어노테이션에 있었다.
config 파일 역시 스프링 컨테이너에 등록이 되는데, @Configuration 어노테이션이 붙은 config클래스는 사실 개발자가 직접 작성한 AppConfig 인스턴스를 그대로 등록하는 것이 아니라, Spring 내부에서 CGLIB라는 라이브러리를 사용해서 코드를 조작한 뒤 그 객체의 인스턴스를 컨테이너에 등록한다고 한다.
즉, config파일의 메소드를 그대로 호출하여 매번 new생성자를 실행시켜 새로운 객체를 반환하는 것이 아닌,
if(스프링 컨테이너에 등록이 되어있다면){
return 스프링 컨테이너에 등록된 instance
}else{
객체의 인스턴스를 새로 생성하여 스프링 컨테이너에 등록
return 인스턴스
}
와 같은 코드가 호출되는 것이다.
반대로 @Configuration 어노테이션이 붙지 않으면 컨테이너에는 개발자가 작성한 AppConfig class 그대로 등록되니 매번 새로운 객체가 return된다.
@Bean 어노테이션만 사용해도 spring 빈으로 등록되긴 하지만 @Configuration이 붙지 않으면 싱글톤이 보장되지 않으니 스프링 환경에서는 기본적으로 @Configuration이 붙어야 한다.