@Configuration 동작 방식 , @Bean의 사용, ProxyBeanMethods

코찔찔이💻·2024년 4월 2일
0

스프링

목록 보기
3/3

@Bean, @Configuration의 탄생 이유

프로젝트의 규모가 커짐에 따라 .xml 파일 내부에서 리소스들을 등록하는 것들이 복잡해짐으로 인해, 이를 보완하기 위해 어노테이션을 활용한 Bean 등록 방법이 탄생하였다.

1) 스프링 빈이란?

  • Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object) Bean.
  • Spring Ioc Container에 의해 관리되고 생성되며, Spring Application을 구성하는 핵심 객체이다.
  • 싱글톤 패턴에 의해 생성

2) 스프링 빈 등록 방식 @Configuration, @Bean, @Component

  • 자동으로 스프링 빈 등록 → @Configuration
  • @Configuration이 붙은 클래스 내부에서 수동으로 빈 등록 → @Bean
    • 싱글톤을 보장받기 위해 해당 애노테이션이 붙은 클래스 내부에서 생성되어져야 한다!
    • 개발자가 직접 제어가 불가능한 라이브러리를 활용 or 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때 사용 (ex Gson 라이브러리 등)
  • @Component 애노테이션이 붙은 클래스들은 스프링의 컴포넌트 스캔에 의해 자동으로 빈 등록이 된다.
    • @Controller, @Service, @Repository 등이 있으며 @Configuration 내부에도 존재한다( @Configuration 이 자동으로 빈 등록을 할 수 있는 이유)
    • 스프링은 기본적으로 컴포넌트 스캔에 의한 자동 등록 방식을 권장한다.

3) @Configuration의 작동원리


    @Test
    void proxyMyConfiguration(){
        MyConfigProxy myConfigProxy = new MyConfigProxy();
        
        Bean1 bean1 = myConfigProxy.bean1();
        Bean2 bean2 = myConfigProxy.bean2();
        
        Assertions.assertThat(bean1.item).isSameAs(bean2.item); //-> error!
    }
    
    static class MyConfigProxy extends MyConfig{
        private Item item;
        
        @Override
        Item item(){
            if(this.item == null) this.item = super.item();
            return this.item;
        }
    }

CGILB(Code Generator Library) : 코드 생성 라이브러리로 런타임에 동적으로 자바클래스의 프록시를 생성해주는 기능을 한다. 타겟에 대한 정보를 직접적으로 제공 받아서 바이트 코드로 조작하여 프록시를 생성

  • 한번 호출된 Item 오브젝트를 변수로 캐싱하여 가지고 있다가 호출 시에 기존에 생성된 Item Object 반환 → 싱글톤 유지
  • 하지만 @Bean 메서드 직접 호출로 빈 의존관계 주입을 하는 케이스가 없을 경우에는 프록시를 생성해주는 이유가 불분명하다 → proxyBeanMoethod == false 옵션이 나온 이유!

4) proxyBeanMethods 옵션

  • 스프링 5.2부터 지원 시작 → @Configuration 설정에 많이 사용되어짐.
  • false 옵션을 쓰는 이유?
    • 스프링 부트 3.x 기준으로 특정 클래스에서 해당 옵션을 false로 default 설정 중인데, 이러한 빈 등록 방식은 프록시 클래스를 생성하는 비용을 없애면서, @Bean 메서드를 호출 시 새로운 빈 오브젝트를 계속 생성할 수 있게 만드는 것이다.

    • 하지만 이러한 상황보다 싱글톤을 보장받는 경우가 대부분이기 때문에, default 는 true로 설정되어 있다.


      요약

      스프링에서 관리되어지는 빈 오브젝트를 생성하려면 @Configuration이 붙은 클래스 내부에서 @Bean 메서드를 직접 등록하자.

profile
버티면 다 되는거야.

0개의 댓글