Home 생성패턴 - 싱글톤 패턴
Post
Cancel

생성패턴 - 싱글톤 패턴

Singleton Pattern

디자인 패턴이란?

디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
  • 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.  

디자인 패턴을 목적과 범위로 나눌수 있다

구분유형설명
 생성객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행
목적구조더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
 행위클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위클래스클래스간 관련성(상속), 컴파일 시 정적으로 결정
 객체객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정

  

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인패턴
데이터베이스 연결 모듈에서 많이 쓰이는 패턴이다.

싱글톤 패턴이란?

전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에 서든지 참조 할 수있도록 하는 디자인 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SingletonService(){
    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance(){
        return instance;
    }

    private SingletonService(){
        
    }
    
    public void logic(){
        //로직
    }
}

// 다른 클래스
public static void main(String[] args){
   ...  = new SingletonService() // 생성자가 private이기에 막을 수 있다.
}

위의 코드처럼 client가 요청할 때마다 객체를 생성하는것이 아닌, 이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다.
다만 수많은 문제점들이 있다.

장점과 단점

장점

  • 객체보장
  • 객체공유

단점

  • 기본 셋팅 코드가 많이 들어간다. (1번부터 15번 라인까지)
  • DIP, OCP 위반한다. *의존 관계상 클라이언트가 구현 클래스를 의존함
  • 단위 테스트를 하기 어렵다. 각각의 테스트마다 독립적인 인스턴스를 만들기 어려움
  • 내부 속성을 변경하거나 초기화 하기 어렵다

아니 그럼 왜 이렇게 문제가 많은데 왜 쓰는거지? -> 의존성 주입 (feat. 싱글톤 컨테이너!!) 메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입(DI)을 통해 메인 모듈이 간접적으로 의존성을 주입하는 방식. `디커플링` 이라고도 한다. 의존성 주입의 장점: 모듈 간의 테스트를 쉽게하고 의존성 방향이 일관되고 관계가 명확해짐 단점: 클래스 수가 늘어나 복잡해지고 약간의 런타임 패널티가 생김 스프링 컨테이너는 위에 언급한 문제점을 해결하면서 싱글톤의 장점을 살린다. `스프링 빈을 싱글톤 패턴으로 관리`
김영한 강의 자료중 일부 발췌
위의 그림처럼 싱글톤의 장점을 볼 수 있다.   

 


결론

싱글톤 패턴은 안티패턴이라는 말이 있듯이 단독으로 사용되면 OOP설계를 위반하기 쉽다.
하지만 위에서 소개한 내용대로 스프링 컨테이너의 도움을 받으면 싱글톤 패턴의 단점을 보완하면서 사용할 수 있다.
*스프링 빈은 컨테이너의 도움을 받아 싱글톤 스콥으로 관리되고 있는걸 확인 할 수 있다.

참고자료

  • 인프런 김영한 스프링 기본 강의
This post is licensed under CC BY 4.0 by the author.