[Springboot] @Configuration

유아 Yooa·2023년 6월 6일
0

Spring

목록 보기
10/18
post-thumbnail

Springboot 개발을 하다보면 @Configuration을 사용하는 클래스들을 볼 수 있다. 빈 주입이라면 @Bean을 사용하면 되지 않나? 라는 생각에 이점을 알아보게 되었다.


@Configuration

  • Spring에서 Bean을 수동으로 등록하기 위해서 설정 class에 @Configuration을 추가하고, @Bean을 사용해 수동으로 bean을 등록할 수 있다.
  • 메서드 이름으로 bean의 이름이 결정된다.
  • 일반적으로 의존성 주입을 위해서 @Configuration을 사용한다.
@Configuration
public class ExampleConfig {

	@Bean
    public ExampleBean exam() {
    	return new ExampleBean();
    }
    
    @Bean
    public ExampleService exampleService() {
    	return new ExampleService(exam());
    }
}

@Configuration baen 등록 과정

  • Spring 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 bean으로 등록한다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
...
}
  • Configuration 내부를 보면 @Component가 추가되어 있다.
    • 그래서 @Configuration이 붙은 class 또한 bean으로 등록된다.
  • 이후 해당 클래스 본문을 파싱해서 @Bean이 붙어있는 메소드를 찾아 bean을 생성해준다.

그러면 @Configuration은 Bean을 수동 등록하기 위한 어노테이션인가?


@Configuration 역할

  • bean을 등록할 때 싱글톤(singleton)이 되도록 보장해준다.
@Configuration
public class ExampleConfig {

	@Bean
    public ExampleBean exam() {
    	return new ExampleBean();
    }
    
    @Bean
    public ExampleService exampleService() {
    	return new ExampleService(exam());
    }
    
    @Bean
    public Example2Service exampleService2() {
    	return new Example2Service(exam());
    }
}
  • exam() 메서드는 exampleService()와 exampleService2()에서 각각 new 키워드로 새로운 키워드를 생성하니까 싱글톤 패턴이 깨지는 것처럼 보인다.

@Configuration CGLIB

  • 스프링에서는 싱글톤 패턴을 보장하기 위해 @Configuration 설정 시 CGLIB라는 바이트코드 조작 라이브러리를 사용한다.
  • ExampleConfig 클래스를 스프링 빈에 등록하는 것이 아니라 해당 클래스를 상속받은 임의의 클래스(proxy ExampleConfig)를 만들고, 그 클래스를 스프링 빈으로 등록한다.
  • 쉽게 생각하여 @Bean이 붙은 메서드마다 스프링 컨테이너에 이미 존재하면 해당 스프링 빈을 반환하고, 없으면 새로 생성해 스프링 빈으로 등록하고 반환하는 방식으로 동작하기 때문이라는 것.
  • CGLIB의 내부 기술을 이용해 무분별한 Method Call을 막고 싱글톤을 보장해준다.
  • 만약 @Configuration 어노테이션을 제거한다면 exam() 호출마다 새로운 instance가 생성될 것이다.
    • @Bean만 사용해도 스프링 빈은 등록되지만 싱글톤은 유지되지 않는다.

싱글톤에 대하여 더 자세하게 알고싶다면?
[Spring] 싱글톤 패턴 (singleton pattern)


ref
싱글톤 패턴(Singleton Pattern)과 @Configuration 역할
[Spring] 핵심 원리 5 싱글톤 컨테이너
[Spring]@Configuration이란?

profile
기록이 주는 즐거움

0개의 댓글