You will be fine

<Spring> @Configuration과 @Component (feat. @Bean)

by BFine
반응형

가. Bean 생성을 위한 어노테이션

 a. @Component

  -  @Component는 클래스나 인터페이스에 대한 객체를 Bean으로 생성해서 스프링 컨테이너에서 관리해라! 선언하는 어노테이션이다.

  -  자매품으로 @Controller , @Service , @Repository 가 있고 각각 코드를 확인해보면 @Component가 달려있고 세부 내용은 동일 한 것을 볼수있다.

  -  ClassPathBeanDefinitionScanner 를 통해 basePackage를 기준으로 auto-scanning 하여 스프링 컨테이너에 Bean으로 등록한다.

 

 b. @Configuaration

  -  @Configuration도 마찬가지로 내부 코드가 위의 자매품들고 비슷하지만 다른점이 하나 있다. 바로 proxyBeanMethods가 있다. (proxy!)

  -  @Bean의 경우 Method나 어노테이션 위에서만 사용이 가능하다. 그래서 @Configuration 에 사용하는 것을 많이 볼수가 있다.

  -  코드들을 보다 보면 이런식으로 @Bean이 설정된 메서드를 호출해서 다른 Bean 설정시 주입해서 사용하는 경우도 많이 본적이 있을 것 이다.

  -  당연하게 '아 Bean을 주입하는구나' 생각하고 넘어가곤 했는데 이렇게 보니 메서드 호출했는데 왜 Bean이 나오는지 궁금해진다.

 

나. @Configuration과 Proxy

 a. @Component에 @Bean 설정해서 메서드 호출해보기

public class ExamA {
}
@Component
public class ExamComponent {
    @Bean
    public ExamA examA(){
        return new ExamA();
    }

}

  -  결과는 어떻게보면 예상대로 @Bean이 있어도 호출할때마다 새로운 객체가 생성되는 것을 볼 수 있다.

 

 b. @Configuration에 @Bean 설정해서 메서드 호출해보기

@Configuration
public class ExamConfiguration {
    
    @Bean
    public ExamA examA(){
        return new ExamA();
    }
    
}

  -  결과로 두 객체가 같다라는 것을 알 수 있다. 즉 @Configuration@Bean이 있는 메서드는 몇번을 호출해도 동일한 객체 Bean을 반환한다.

     => 물론 이렇게 @Configuration 설정한 Bean을 주입하여 사용하지 않는다. ( 포스팅을 위해... )

  -  당연하다 생각하고 써왔는데 보니까 어떻게 처리되는지가 궁금해진다. ExamConfiguarion 객체를 출력해보자

   -  로그 내용을 보니 실제 원본인 ExamConfiguration이 아니고 Proxy 객체인 것을 확인 할 수가 있다.

      =>  여기서 CGLIB는 바이트코드(.class)를 조작하여 원본 객체를 상속하여 프록시 객체를 만드는 라이브러리이다.

   -  즉 ExamConfiguration 상속한 Proxy 객체를 만들고 @Bean 이 있는 메서드들을 파악하여 각각에 실제 Bean이 반환하도록 주입 한 것이다.

 

 c.  proxyBeanMethods = false

  -  이부분을 사용하는 경우는 없겠지만 위의 내용이 맞는지 한번 더 테스트 해보자

@Configuration(proxyBeanMethods = false)
public class ExamConfiguration {

    @Bean
    public ExamA examA(){
        return new ExamA();
    }

}

  -  예상대로 Proxy 객체가 아닌 원본의 ExamConfiguration 객체를 사용했기 때문에 호출할때마다 새로운객체가 생성되는 것을 알 수 있다.

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기