DevBoi

[Spring] @Configuration 본문

Develop/[Spring]

[Spring] @Configuration

HiSmith 2022. 3. 3. 17:58
반응형

@Configuration 

스프링에서 설정 클래스를 선언하는 어노테이션이다.

우선 스프링 빈을 만드는 방법은 @Bean, @Configurtaion, @Component 3가지 어노테이션을 사용하면 된다.

Configuration을 클래스 파일에 달게 되면, 이 클래스는 빈등록하기 위한 파일이라는 것을 가시적으로 알려준다.

 

@Configuration을 붙인 class를 java config파일이라고 생각한다면

@Configuration에 대한 클래스 파일 하위에 객체에 대한 return을 해주는 메소드에 빈을 해주면,

ApplicationContext 중, AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어 IOC와 DI를 적용하게 된다.

쉽게말하면, Configuration에 대한 어노테이션은 빈 설정들을 위한 파일 임을 알리는 어노테이션이다.

@Bean으로 스프링 빈을 등록하면, 빈 등록은 된다.

하지만 스프링의 싱글턴에 대해서는 적용이 안된다.

이는 CGLIB라는 라이브러리가 @Configuration을 적용한 클래스를 상속받은 임의의 다른 클래스를 만들어 스프링 빈으로 등록하기 때문이다.

특정 빈을 호출할때 자바라면, 호출 하는 곳마다 new라는 연산자를 붙여서 호출을 하지만

스프링에서는 다 새로운 객체를 만들지 않는다.

새로운 빈을 만들기 전, 컨테이너를 확인할때 intercept된다.

다시 말하면 우리가 특정 빈을 3번 호출해도, 첫번째 호출에만 빈을 생성하는  것이다.(다른 호출때는, 컨테이너에 있는 기존 빈들만 가져온다.) 

=> 무튼 한개 이상의 @Bean을 제공하는 클래스라면, 해당 어노테이션을 명시한다.

 

해당 config를 불러와서, 프린트하면, CGLIB라는 객체로 된 것을 볼수있다.

이 CGLIB라는 객체는 좀더 다른 포스팅에서 상세히 살펴보기로 하고, 무튼 configuration을 활용하면 해당 프록시 객체로 config를 생성한다.

configuration에 대한 어노테이션을 주석 처리하면, CGLIB라이브러리 빈가 아닌 일반 빈이 생성이 된다.

그러면 이제, 해당 설정으로 진짜 싱글 톤이 되는지를 확인해보자

 

 

해당 과 같이 클래스들을 만들어봤다.

Member관련 된 내용과 order관련된 내용이라고 생각하면된다.

각 Service들은 생성자에서 MemberRepository를 주입받는다.

 

 

 

 

 

 

 

해당 config에서 각각 서비스에 대해서 생성을 하고, 해당 신규 객체를 return 해준다.

return에서는 각각의 다른 의존성을 주입하기 위해서 함수호출로 넘겨준다.(사실 그냥 다 new해도 되긴한다.)

이렇게 될 경우에, program에서 orderService,MemberService에 대한 걸 호출하게 되고

해당 빈이 생성되기 위해서는 각각의 신규 빈을 생성하여 return 되는 config 가 동작한다.

orderservice는 new MemoryMemberRepository와, new RateDiscountPolicy를 주입받고

memberService도 new MemoryMemberReopsitory를 주입받는다

 

자바같으면 new를 두번했기때문에 당연히 해당 두개의 객체의 주소는 다르다.

configuration을 지우고 확인한 결과 진짜 다르게 나온다.

configuartion을 붙이면 정상

 

또한 해당 config에서 생성될때, 생성된다는 sysout을 하면 이렇다.

1)configuaration아닐때

2) configuation일때

 

자 그러면 이해가된다.

bean으로 메소드에서 생성하는 것들에 대해서 configuration을 붙이면, 최초1회 호출시에 생성되고

프록시에 저장이되고, configuation을 붙이지 않으면 매 호출 때마다 빈 생성 메소드가 실행되는것을 볼수있다.

 

해당 프록시 관련은 아까 CGLIB라는 개념이 적용되기 떄문이다.

CGLIB 내용에 대한 자세한 포스팅은, 추후에 진행하도록 하자

반응형