TIL

스프링 컨테이너, 빈, 싱글톤

suyeoneee 2024. 12. 11. 23:36

스프링 숙련 2주차를 듣기 전, 1주차에서 나온 개념들에 대해 간단히 정리해보았다.

 

Spring Container 스프링 컨테이너

  • 객체(Bean)를 생성, 관리, 소멸하는 역할을 담당한다. 애플리케이션 시작 시, 설정 파일이나 Annotation을 읽어 Bean을 생성하고 주입하는 모든 과정을 제어한다.
  • 객체를 직접 생성하는 경우에는 객체 간의 의존성 및 결합도가 높아지는 반면에, Spring Container를 사용하면 인터페이스에만 의존하는 설계가 가능해진다. (OCP, DIP 준수)
  • 종류
    • BeanFactory : Spring Container의 최상위 인터페이스
    • ApplicationContext: BeanFactory의 확장된 형태

Spring Bean 스프링 빈

  • Spring Container가 생성하고 관리하는 Java 객체
  • 기본적으로 Singleton으로 설정된다.
  • 의존성 주입(Dependency Injection)을 통해 다른 객체들과 의존 관계를 맺을 수 있다.
  • 생성, 초기화, 사용, 소멸의 생명주기를 가진다.
  • XML, Java Annotaion, Java 설정파일 등을 통해 Bean으로 등록할 수 있다.
  • 항상 무상태(stateless)로 설계를 해야함!!

Spring Container를 사용하는 이유?

객체 생성, 의존성 주입 등을 자동화하여 개발자는 로직 구현에 더 집중할 수 있다. 개발자는 모듈 간에 의존 및 결합으로 인해 발생되는 문제에 대해  자유로워질 수 있다.

 

Singleton 싱글톤

  • Spring의 기본 객체 관리 방식
  • 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴이다.
  • 구현 클래스에 의존해야 하므로 DIP, OCP 위반에 해당된다.
  • 객체가 한 번만 생성되어 리소스를 절약할 수 있지만, 싱글톤 패턴을 구현하기 위한 코드의 양이 많아진다. 
  • 예시 code
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // private 생성자 : 외부에서 객체를 직접 생성하지 못하게 한다.
    }

    public static Singleton getInstance() { // static 메서드: 해당 클래스의 유일한 객체를 반환
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • Spring에서 @Scope 애노테이션을 사용하여 빈의 스코프를 설정할 수 있다.
@Bean
@Scope("singleton") // 기본값
public MyService myService() {
    return new MyService();
}
// -------------------------
// 프로토타입 스코프 : 빈이 요청될 때마다 새로운 객체를 생성
@Bean
@Scope("prototype")
public MyService myService() {
    return new MyService();
}
  • 멀티스레드 환경에서 동시에 접근하면 동기화 문제가 생길 수 있으므로 무상태 설계가 중요하다.