Post

Spring[싱글톤 컨테이너]

싱글톤 컨테이너

싱글톤 컨테이너란?

싱글톤 패턴의 문제점을 해결하면서, 객체(빈)를 생성, 관리, 그리고 제공하는 환경을 가지고 있습니다.

스프링의 핵심 기능 중 하나인 제어의 역전(IoC, Inversion of Control)과 의존성 주입(DI, Dependency Injection)을 구현하고 있습니다.

그리고 싱글톤 패턴 적용 없이, 객체 인스턴스를 싱글톤으로 관리 합니다.

싱글톤 컨테이너 적용 후

Spring Container png
Spring Container덕에 각각의 Clinet가 요청을 보낼 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용이 가능합니다.

위의 사진만 보더라도, 각각의 클라이언트에게 새로 객체를 생성해서 반환하는게 아닌, 이미 만들어진 객체 하나만으로 모두에게 동일한 객체를 반환 시켜주고 있습니다.

하지만 무조껀 동일한 객체를 주는것이 아닌, 요청이 올때마다 새로운 객체를 생성해서 반환하는 기능도 있습니다.

주의점

  1. 무상태로 설계하기
    • 의도적인 필드 피하기: 특정 클라이언트에 의존적인 필드를 가지면 다른 클라이언트가 예상치 못한 동작을 유발할 수 있으므로 피해야 합니다.
    • 값 변경 가능한 필드 피하기: 여러 클라이언트가 객체를 공유할 때 값이 변경 가능한 필드는 예상치 못한 동작을 유발할 수 있으므로 피해야 합니다.
    • 읽기 전용으로 설계: 객체의 상태를 읽기만 가능하도록 설계하여 안전성을 확보합니다.
  2. 지역 변수, 파라미터, ThreadLocal 사용
    • 공유되지 않는 변수 사용: 여러 클라이언트 간에 값을 공유하지 않도록 하기 위해서는 객체 내부에서만 사용되는 변수를 활용해야 합니다.
  3. 스프링 빈의 필드 주의
    • 공유값을 스프링 빈의 필드에 설정하지 않기: 스프링 빈은 여러 클라이언트에게 서비스를 제공하는데, 필드에 상태를 저장하면 여러 클라이언트 간에 값이 공유되어 문제가 발생할 수 있습니다.

상태를 유지할 경우 발생하는 문제점 예시

1
2
3
4
5
6
7
8
9
10
public class StatefulService {
 private int price; //상태를 유지하는 필드
 public void order(String name, int price) {
 System.out.println("name = " + name + " price = " + price);
 this.price = price; //여기가 문제!
 }
 public int getPrice() {
 return price;
 }
}

결론

싱글톤 컨테이너는 싱글톤 패턴의 문제점을 해결하면서 객체를 생성, 관리하고 제공하는 환경을 제공하는데, 주의할 점이 있습니다.

객체를 싱글톤으로 사용하더라도 해당 객체를 무상태(stateless)로 설계해야 합니다.

특히, 스프링 빈의 필드에 공유 값을 설정하면 예상치 못한 문제가 발생할 수 있으므로, 의도적인 필드, 값 변경 가능한 필드를 피하고 읽기 전용으로 설계해야 합니다.

객체 내부에서만 사용되는 변수를 활용하고, 공유되지 않는 변수를 사용하여 객체의 상태를 유지하지 않도록 주의해야 합니다.

무상태로 설계된 싱글톤 객체를 사용하면, 여러 클라이언트 간에 효율적으로 객체를 공유할 수 있고, 예상치 못한 동작을 방지할 수 있습니다.

상태를 유지하면서 발생하는 문제점은 객체 간에 의도치 않은 상태 공유로 이어질 수 있으므로, 각별한 주의가 필요합니다.

This post is licensed under CC BY 4.0 by the author.