클라우드 낚시꾼

[Spring] @Configuration과 CGLIB 본문

BE Framework/SpringBasic

[Spring] @Configuration과 CGLIB

KanuBang 2024. 3. 14. 12:28
728x90

1. @Configuration과 싱글톤이 깨지는 것처럼 보이지만...

스프링 컨테이너

 

AppConfig 클래스에 @Configuration 어노테이션을 사용했다. @Configuration이 붙은 클래스는 Spring의 설정 클래스로서 스프링 컨테이너에 Bean을 등록할 수 있게 해준다. 설정 클래스 AppConfig에는 @Bean 어노테이션이 붙은 3개의 메서드가 있다. 그래서 총 3개의 Bean이 싱글톤 객체로 컨테이너에 등록될 것이다.

왼쪽 그림은 등록된 Bean들 사이의 의존관계이다. 오른쪽 코드를 보면, memberService, orderService, memberRepository를 Bean으로 등록할 때 memberRepository 메서드가 3번 호출되어 싱글톤이 깨지는 것처럼 보인다. 하지만, 실상 memberRepository는 싱글톤 객체로 등록되며 공유되어 사용된다. 어떻게 이것이 가능할까?


2. @CGLIB와 바이트코드 조작

@CGLIB

new AnnotationApplicationContext로 스프링 컨테이너를 생성할 때, AppConfig.class라는 설정 클래스를 파라미터로 넘겨주었다. 이때, AnnotationApplicationContext에 파라미터로 넘어간 값(설정 클래스)도 스프링 컨테이너에 Bean으로 등록된다. 위의 그림을 보니 AppConfig 설정 클래스가 컨테이너 Bean으로 잘 등록되어 있다. 그런데 예상과는 다르게 클래스 명에 xxxCGLIB가 붙어있다. 이것은 내가 만든 클래스가 아니라 스프링이 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한 것이다. 그 임의의 다른 클래스가 바로 싱글톤이 보장되도록 해준다. 아마도 아래와 같이 바이트 코드를 조작해서 작성되어 있을 것이다.

 

AppConfig@CGLIB 예상 코드

 

@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다. 덕분에 싱글톤이 보장되는 것이다. 참고로, @Configuration을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장하지만, @Bean은 스프링 빈으로 등록만할 뿐 싱글톤을 보장하지 않는다.


3. 세줄 요약( +출처 )

  1. @Configuration은 CGLIB 기술이 적용되어 Bean의 싱글톤을 보장한다.
  2. @Bean은 CGLIB 기술이 적용되지 않아 Bean으로는 등록되나 싱글톤을 보장하지 못한다.
  3. 스프링은 CGLIB 바이트 코드 조작 라이브러리를 사용해 Bean으로 등록될 객체의 클래스를 상속받아 다른 객체를 만들고 그 객체를 컨테이너에 Bean으로 등록한다. 이 기술 덕분에 Bean이 싱글톤 객체로 등록된다.
 

스프링 핵심 원리 - 기본편 강의 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

728x90