[디자인패턴] Singleton Pattern

종현·2023년 12월 11일
0

디자인패턴

목록 보기
2/2

Singleton Pattern

  • Singleton Pattern(싱글톤 패턴)이란 객체를 단 한번만 생성을 하여 재사용 할 수 있도록 하는 디자인 패턴.

Singleton Pattern 구현

일반 객체생성

  • 객체 생성
public class Object {
    public Object() {
    }
}
  • 실행
public static void main(String[] args) {
    Object object = new Object();
    Object object1 = new Object();
    System.out.println(object == object1);
}
  • 결과
false

싱글톤 객체 생성

  • 싱글톤객체 생성
public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 실행
public static void main(String[] args) {
    Singleton object = getObject();
    Singleton object1 = getObject();
    System.out.println(object == object1);
}

public static Singleton getObject() {
    return Singleton.getInstance();
}
  • 결과
true
  • 일반 객체는 새로운 인스턴스가 생성되지만 싱글톤으로 생성한 객체는 같은 메모리를 참조하고 있다.

Spring 에서의 Singleton Pattern

  • Spring에서는 Web Application으로 서버를 구성한 경우가 많다.
  • 일반적인 상황에서 다량의 Request가 들어오면 매번 여러 객체들을 생성하고 소멸시키게 된다.
  • 매번 요청이 들어올 때 마다 이러는 것은 비효율적.
  • Singleton Pattern을 이용하여 하나의 객체에서 여러 요청을 처리하도록 Spring Container라는 개념을 지원.
  • Spring은 @Bean @Component 등과 같은 Annotation으로 간단하게 해당 객체를 Singleton 객체로 만들어 Spring Container에 등록할 수 있다.
  • 만들어진 Singleton 객체들은 DI와 같은 기술을 통해 주입받아서 사용할 수 있다.
  • @Autowired생성자 등을 통하여 만들어진 Singleton 객체를 사용할 수 있다.

장점

  1. 인스턴스를 공유하기 때문에 메모리 측면에서 효율적이다.

단점

  1. 하나의 인스턴스를 공유하기 때문에 상태를 가진 전역 변수는 동시성 이슈가 발생할 수 있다.

Singleton Bean 생성 및 주입

  • @Bean : Singleton 객체를 Spring Container에 등록 (등록한 하나의 인스턴스를 사용)
@Configuration
public class AppConfig {
	@Bean
    public Singleton singleton() {
    	return new Singleton();
    }
}
  • @Component : SingletonService 객체를 Spring Container에 등록.
  • 생성자주입 : Spring Container에 등록된 Singleton 인스턴스를 @RequiredArgsConstructor를 통해 생성자 주입.
@Component
@RequiredArgsConstructor
public class SingletonService {
	private final Singleton singleton; // Spring Container에 등록된 Singleton Bean을 주입받는다.
}

이상

0개의 댓글