지난 포스트에서는 스프링이 IoC로 제공하는 싱글톤 패턴과 싱글톤 등록에 대해 알아보았습니다. 이 게시물에서는 Spring이 확장으로 싱글톤을 보장하는 방법에 대해 조금 알아봅니다.

@configuration 및 싱글톤
Java로 작성된 종속성 주입 코드의 싱글톤
Spring은 IoC 기능 중 하나로 싱글톤 등록을 제공합니다. 간단히 말해서 싱글톤 기능을 제공하는 레지스트리입니다. 싱글톤은 주어진 객체의 인스턴스가 JVM 내에 하나만 존재하도록 하는 디자인 패턴입니다.
빈으로 등록된 객체의 싱글톤은 스프링의 싱글톤 레지스트리에서 관리한다고 하는데, 빈을 관리하는 자바 코드에서는 싱글톤을 어떻게 관리할까?
@Configuration
public Class AppConfig {
@Bean
public Fedal fedal() {
return new Fedal();
}
@Bean
public Accelator accelator(){
return new Accelator(fedal());
}
@Bean
public Breaker breaker(){
return new Breaker(fedal());
}
}
빈을 관리하는 Java 클래스를 간단히 구현했습니다. Fedal이라는 빈이 생성되면 new Fedal()이라는 인스턴스가 생성됩니다. 또한 Accelator라는 이름의 Bean이 생성되면 new Accelator의 생성자로 fedal()이 호출되고 fedal 함수 내부에 또 다른 인스턴스가 new Fedal()으로 생성됩니다. 마찬가지로 차단기가 생성되면 fedal()이 새 차단기의 생성자로 호출되고 new Fedal()이 다시 실행되어 인스턴스가 생성됩니다.
위의 코드는 Spring에서 생성된 코드가 아니라 개발자가 작성한 코드입니다. 개발자가 작성한 Java 코드를 Spring Framework에서 임의로 수정하지 않는 한 Fedal 객체의 인스턴스를 3개 생성해야 합니다.
그런데 실제로 위의 Java 코드에서 System.out.print를 실행하고 객체가 생성되기 전에 출력 로그를 사용하면 놀랍게도 fedal() 함수는 한 번만 호출됩니다. 이는 Fedal의 싱글톤이 Spring 프레임워크에 의해 보장됨을 의미합니다. 어떻게 가능합니까?
@구성 및 CGLIB
비밀은 구성 주석에 있습니다. Spring Framework를 빌드할 때 @Configuration Java 파일은 일반 Java 파일과 약간 다르게 빌드됩니다.
CGLIB라는 바이트코드 조작 라이브러리를 사용하면 @Configuration이 있는 클래스에서 상속된 임의의 클래스가 생성됩니다. 클래스를 빈으로 등록합니다. 등록된 @Configuration Bean 내부의 객체를 호출하면 Spring Bean으로 등록되어 있는지 확인하고 Bean으로 등록되어 있으면 해당 Bean을 반환하거나 Bean으로 재등록 처리한다.
어려운 이야기지만 간단하게 말씀드리면 다음과 같습니다. “@Configuration을 사용하여 CGLIB라는 라이브러리에 Java 파일을 넣고 새 클래스를 만들고 이를 Spring 빈으로 등록하면 내부 함수의 싱글톤이 보장됩니다.”너는 추측 할 수있다.
@Configuration 없이 실행하면 위 예제의 fedal() 함수가 3번 호출되어 Fedal 인스턴스가 3개 생성되는 것을 확인할 수 있다.
오늘 우리는 Spring Framework가 구성 주석으로 싱글톤을 보장하는 방법을 살펴보았습니다. @Configuration 없이 생성된 Java 코드에서 내부 종속성이 있는 개체는 Spring Bean이 아니며 Spring에서 관리하지 않습니다.
따라서 종속성을 주입하거나 종속성을 정의하고 이를 Spring Bean으로 관리하는 클래스에 @Configuration을 첨부하는 것이 안전합니다.
핵심 내용은 단순했지만 속은 복잡해 보였다. 읽어 주셔서 감사합니다!
이전 게시물: 싱글톤 레지스트리 및 스프링 프레임워크
(스프링 프레임워크) 싱글톤 레지스트리와 스프링 프레임워크
이전에는 Spring Framework의 IoC 기능 중 종속성 주입에 대해 살펴보았습니다. 종속성 주입은 Spring Framework의 주요 IoC 기능 중 하나입니다. 오늘
belklog.tistory.com
