본문 바로가기

Development/Spring Boot

[Spring Boot] 싱글톤 패턴

1- 싱글톤 패턴

  • 클래스의 인스턴스가 딱 한 개만 생성되는 것을 보장하는 디자인 패턴임
  • 그래서 객체 인스턴스가 두 개 이상 생성하지 못하도록 막아야함
    private 생성자를 사용해 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야함

  • 생성 방법
    (1) static 영역에 객체 instance를 미리 하나 생성해 올림
    (2) 해당 객체 인스턴스가 필요하면 오직 getInstance( )  메서드를 통해서만 조회 가능. 해당 메서드를 호출하면 항상 같은 인스턴스 반환
    (3) 딱 한 개의 객체 인스턴스만 존재해야 하믐로, 생성자를 private로 막아 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생서되는 것을 막음

  • 그렇다면 일일히 AppConfig에 있는 것들을 싱글톤으로 만들어줘야하는가?
    놉! 스프링 컨테이너를 사용하면 기가막히게 객체를 다 싱글턴으로 만들어줘서 관리할 수 있음.

 

2- 코드 테스트 후

  • 호출할 때 마다 같은 객체 인스턴스를 반환하는 것을 확인할 수 있음
  • 참고로, 싱글톤 패턴 구현 방법은 여러가지가 존재하며, 여기서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택한 것임.
    지연 처리 방법이 있는데 사실 객체 인스턴스가 많은 메모리를 먹는게 아니면 이 방법이 가장 간단함.
  • 이미 만들어진 객체를 공유해 효율적 사용 가능

3- 싱글톤 패턴 문제점

  • 시글톤 패턴 구현 코드 자체가 많이 들어감
  • 의존관계상 클라이언트가 구체 클래스에 의존함 -> DIP 위반
  • 클라이언트가 구체 클래스에 의존해 OCP 위반 가능성이 높음
  • 미리 생성되어 유연한 테스트가 어려움
  • 내부 속성을 변경하거나 초기화하기 어려움
  • private 생성자로 자식 클래스를 만들기 어려움
  • 유연성이 떨어짐
  • 위와 같은 사유로 안티패턴으로 불리기도 함

 

4- 그러나, 스프링 프레임워크는 이 싱글톤 패턴의 문제점을 전부 해결하고 객체를 싱글톤으로 관리해줌