자바 스프링 싱글톤 패턴

BackEnd_Ash.log·2023년 7월 15일
0

자바스터디

목록 보기
10/19

Spring 프레임워크에서 가장 핵심적인 개념 중 하나가 바로 "Bean"이며, Spring에서 Bean은 기본적으로 Singleton 패턴을 따릅니다. Singleton 패턴이란, 해당 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다.

Spring에서 Singleton 패턴을 사용하는 주된 이유는, 리소스를 효율적으로 관리하기 위함입니다.
애플리케이션 내에서 동일한 Bean에 대해 수천 번이나 수만 번의 요청이 있을 수 있는데, 이러한 각 요청에 대해 새로운 객체를 생성하면 많은 리소스가 낭비될 수 있습니다.
이에 반해 Singleton 패턴을 사용하면, Bean은 처음 생성 시 한 번만 인스턴스화되고, 이후의 모든 요청에 대해 동일한 인스턴스가 재사용됩니다.

Spring에서 Singleton 패턴을 적용하려면, Bean 정의에서 scope를 'singleton'으로 설정하면 됩니다. 이것이 Spring에서 Bean의 기본 scope이기도 합니다. 이렇게 설정하면, Spring IoC(Inversion of Control) 컨테이너는 각 Bean 정의당 하나의 객체 인스턴스만을 생성하고 관리하게 됩니다.

아래는 Spring에서 Singleton scope로 Bean을 정의하는 예입니다:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton") // 이 부분은 사실 생략 가능합니다. 왜냐하면 Singleton이 Spring에서 기본 scope이기 때문입니다.
public class MySingletonBean {
    // ...
}

이렇게 설정하면, MySingletonBean 클래스의 객체는 Spring 애플리케이션 컨텍스트 내에서 오직 하나만 존재하게 됩니다.

다만, Singleton 패턴을 사용할 때는 thread safety를 고려해야 합니다. 여러 스레드에서 동일한 Singleton Bean 인스턴스에 동시에 접근할 수 있기 때문에, 상태 변경 작업(state mutation) 등은 동기화(synchronization)를 통해 적절히 관리해야 합니다.

싱글톤 패턴 적용방법

Spring 프레임워크에서는 기본적으로 모든 Bean을 싱글톤으로 관리합니다. Spring에서 싱글톤 패턴을 적용하는 코드는 다음과 같습니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

위의 코드에서, AppConfig 클래스는 @Configuration 어노테이션을 통해 Spring의 설정 클래스임을 나타냅니다. myBean 메서드는 @Bean 어노테이션을 통해 Spring 컨테이너에 의해 관리되는 Bean임을 나타냅니다.

Spring 컨테이너는 @Bean 어노테이션이 붙은 메서드를 호출하여 반환된 객체를 컨테이너에 등록하고 관리합니다.
기본적으로 이러한 Bean은 싱글톤으로 관리되므로, 같은 Bean을 요청하면 항상 같은 인스턴스를 반환합니다.
이는 Spring에서 싱글톤 패턴이 기본적으로 적용되는 방식입니다.

다음은 MyBean 클래스를 사용하는 예제입니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    private final MyBean myBean;

    @Autowired
    public MyComponent(MyBean myBean) {
        this.myBean = myBean;
    }

    // myBean을 사용하는 메서드...
}

위의 코드에서, MyComponent 클래스는 생성자를 통해 MyBean 인스턴스를 주입받습니다.
여기서 MyBean 인스턴스는 AppConfig에서 정의한 Bean으로, 동일한 MyBean 인스턴스가 주입되는 것을 보장받습니다.
이는 Spring에서 싱글톤 패턴이 적용되는 방식을 잘 보여줍니다.

@Configuration 에 대해서 알려줘

Spring 프레임워크의 @Configuration 어노테이션은 해당 클래스가 Bean 정의를 제공하는 구성 클래스임을 나타냅니다.
Spring 컨테이너는 @Configuration 어노테이션이 붙은 클래스를 구성 클래스로 취급하고, 그 클래스의 @Bean 어노테이션이 붙은 메소드로부터 Bean 정의를 얻습니다.

Bean은 Spring IoC(Inversion of Control) 컨테이너에서 관리되는 객체를 말하며, 이들은 필요에 따라 의존성 주입이 이루어집니다.
@Configuration 어노테이션이 붙은 클래스 내부의 @Bean 어노테이션이 붙은 메소드는 각각 하나의 Bean을 생성하고, 이를 Spring 컨테이너가 관리하도록 합니다.

다음은 @Configuration@Bean 어노테이션을 사용한 간단한 예제입니다.

@Configuration
public class AppConfig {
  
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

위의 코드에서, AppConfig 클래스는 @Configuration 어노테이션을 통해 Spring에게 구성 클래스임을 알립니다.
이 클래스 내부의 myBean 메소드는 @Bean 어노테이션이 붙어 있어, 이 메소드가 반환하는 MyBean 객체가 Spring 컨테이너에서 관리되는 Bean이 됩니다.

@Configuration 어노테이션은 애플리케이션의 주요 구성 및 부트스트랩 클래스에 주로 사용됩니다.
이를 사용하여 애플리케이션 컨텍스트의 Bean 정의를 선언하고, 의존성 주입 설정 등을 할 수 있습니다.

@Bean 에 대해서 알려줘

Spring 프레임워크의 @Bean 어노테이션은 메서드에 사용되며, 해당 메서드가 Spring 컨테이너에서 관리하는 bean을 생성한다는 것을 나타냅니다. 이런 메서드는 보통 @Configuration 어노테이션이 붙은 클래스 내부에 정의됩니다.

@Bean 어노테이션이 붙은 메서드가 반환하는 객체는 Spring IoC(Inversion of Control) 컨테이너에 의해 관리되며, 의존성 주입, 생명주기 관리 등의 기능을 제공받게 됩니다.

아래는 @Bean 어노테이션을 사용하는 기본적인 예시입니다:

@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

위 예제에서 AppConfig 클래스는 Spring의 설정 클래스로 사용되며, myBean 메서드는 MyBean 타입의 객체를 생성하고 반환합니다. 이 메서드에 @Bean 어노테이션이 붙어 있기 때문에, myBean 메서드가 반환하는 MyBean 객체는 Spring 컨테이너에서 관리되게 됩니다. 이렇게 생성된 MyBean 객체는 다른 bean이나 컴포넌트에서 의존성 주입을 통해 사용될 수 있습니다.

profile
꾸준함이란 ... ?

0개의 댓글