@Configuration

초보개발·2021년 12월 13일
0

Spring

목록 보기
14/37

@Configuration

스프링 컨테이너는 싱글톤 레지스트리이다. 따라서 스프링 빈이 싱글톤이 될 수 있도록 보장해야 한다. 스프링은 클래스의 바이트 코드를 조작하는 라이브러리를 사용하기 때문에 한 번의 호출로 끝이 날 수 있는 것이다.

  • AnnotationConfigApplicationContext에 파라미터로 넘긴 값은 스프링 빈으로 등록이 된다. 따라서 AppConfig도 스프링 빈이 될 수 있다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
  • AppConfig 스프링 빈을 가져와 클래스 정보를 출력해보면, 아래와 같이 나온다.
bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$d7558075

클래스 명 뒤에 EnhancerBySpringCGLIB이 붙어 있는데, 스프링이 CGLIB라는 바이트 코드 조작 라이브러리를 이용해 AppConfig 클래스를 상속받은 임의의 다른 클래스를 생성해서 그 다른 클래스를 스프링 빈으로 등록한 것이다.

  • 이 임의로 생성된 클래스가 싱글톤이 보장되도록 해준다.
  • @Bean이 붙은 메서드마다 이미 스프링이 존재하면 존재하는 빈을 반환, 없다면 빈을 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 생성된다.
  • 생성된 클래스가 AppConfig의 자식 클래스므로 조회가 가능하다.

@Configuration없이 @Bean만 사용할 경우

bean = class hello.core.AppConfig

바이트 코드에서 조작되어 생성된 자식 클래스가 아닌 순수한 AppConfig 클래스가 출력되었다. 또한, memberRepository의 출력문이 3번 호출되었다. 이와 같은 결과를 보면 싱글톤 패턴이 깨졌다는 것을 알 수 있다.

  • 같은 인스턴스인지 확인을 위해 테스트 코드를 돌렸을 때, 서로 다른 주소값을 갖고 있는 것을 알 수 있다.

0개의 댓글