DevCastleOne

더보기

1. @Configuration 이란?

 

: @Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.

 

 

더보기

2. @Configuration을 사용하면 뭐가 좋은데?

 

: @Configuration 애노테이션을 사용하면 가시적으로 설정파일이야 ~ , Bean 등록할꺼야 ~ 라는건 알수있다.

  그런데 ApplicationContext ac = new AnnotationConfigApplicationContext(xxx.class); 와 같은 코드를 본 사람들은 

  이런 질문을 할수있다.

 

AnnotationConfigApplicationContext() 안의 매개변수에 적어주는것만으로도 충분히 알수있을텐데 굳이 사용해야해?

더보기

당연히 단순히 Bean을 등록하기 위한 애노테이션이 아니다.

 

 

 

더보기

3. 어떤 역할을 해주는가? 코드를 통해 알아보자.

<역할>

- Bean을 등록할때 싱글톤(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을 만들때 싱글톤으로 만들기 때문에

만들어진 객체는 다시 생성하지 않는다.

 

@Configuration 애노테이션을 빼면 AppConfig,calculate , AppConfig,calculator , AppConfig,calculate 3개가 출력된다.

=> @Bean만 사용해도 스프링 빈으로 등록은 되지만 싱글톤이 유지되지는 않는다. 또한 순수한 AppConfig 파일을 사용 해서 만들게 된다.

 

               

또 출력결과를 보면 이상한게 하나 더 있다.

 

appConfig 출력결과를 보면

@Configuration이 있다면 Test.sample.AppConfig$$EnhancerBySpringCGLIB$$780402cc@6179e425

@Configuration이 없다면 Test.sample.AppConfig@2796aeae 의 결과를 가지게 된다. 

 

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

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

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

'Spring' 카테고리의 다른 글

JAVA] Interface 인터페이스 모든것!  (0) 2021.01.09

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band