Published 2022. 6. 1. 17:48

1. @Configuration

  • 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.
  • @Configuration 애노테이션을 사용하면 가시적으로 '설정파일이야', 'Bean 등록할꺼야' 라는 것을 알 수 있다.
  • 하지만 단순히 Bean을 등록하기 위한 애노테이션이 아니다.

2. 역할

  • Baen을 등록할 때 싱글톤(Singleton이 되도록 보장해 준다.
  • 스프링 컨테이너에서 Bean을 관리할 수 있게 된다.
package Test.sample;

import Test.sample.calculate.Calculate;
import Test.sample.calculate.Calculator;
import Test.sample.calculate.Minus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public Calculate calculate(){
        System.out.println("AppConfig.calculate");
        return new Minus();
    }

    @Bean
    public Calculator calculator(){
        System.out.println("AppConfig.calculator");
        return new Calculator(calculate());
    }

}
package Test.sample.configuration;

import Test.sample.AppConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

class AppConfigTest {

    /*
     @Configuration 사용했을경우
     */
    @Test
    void configurationTest(){
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        AppConfig appConfig = ac.getBean(AppConfig.class);

        System.out.println(appConfig);
    }

}
  • 위의 Test를 실행하게 되면 AppConfig.class에는  두 개의 @Bean이 존재하게 된다.
  • 그러면  calculate(), calculator() 두 개의 메소드를 호출하게 되면서 AppConfig.calculate, AppConfig.calculator, AppConfig.calculate 3개가 출력될까 생각하지만 AppConfig.calculate, AppConfig.calculator 2개만 출력이 되는 것을 볼 수 있다.
  • 이유는 Bean을 만들 때 싱글톤으로 만들기 때문에 만들어진 객체는 다시 생성하지 않는다.
  • @Bean만 사용해도 스프링 빈으로 등록은 되지만 싱글톤이 유지되지는 않는다. AppConfig 파일을 사용해서 만들게 된다. 

3. @Configuration 애노테이션을 빼면

@Configuration이 붙었을때의 결과를 보면 CGLIB라는게 붙은걸 볼 수 있다.

사실 이것은 내가 만든 클래스가 아닌 스프링에서 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig를 상속받은 임의의 클래스를 만들고 그것을 스프링 빈으로 등록했기 때문에 이런결과가 나오게 된다.

이때 임의의 클래스를 통해서 싱글톤이 되는것을 유지해준다.

'Spring > Annotation' 카테고리의 다른 글

@EqualsAndHashCode  (0) 2022.06.03
@Component  (0) 2022.06.01
@RequestParam  (0) 2022.05.30
@Controller, @RestController 비교  (0) 2022.05.30
@Pathvariable  (0) 2022.05.27
복사했습니다!