싱글톤 패턴

이시우·2021년 1월 8일
0

컴퓨터 지식

목록 보기
3/17
post-thumbnail

싱글톤 패턴이란 ?

  • 어플리케이션이 시작될 때 어떤 클래스가 최초에 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴이다.
  • 인스턴스가 필요할 때 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용하는 것이다.
  • 생성자가 여러번 호출되어도 실제 객체는 하나이며 최초 생성된 객체를 계속 반환한다.
    java에서는 생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메소드를 통해 받아서 사용하도록 구현한다
  • 공통된 객체를 여러개 생성해서 사용해야하는 상황에 쓰인다.

장점

  • 객체를 한 번만 생성하고 반환하기 때문에 메모리 영역을 한 번만 할당받으면된다.
    -> 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 구현한 인스턴스는 '전역'이므로 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.

단점

  • 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나 공유시키면 다른 클래스와 결합도가 높아지게된다.
    -> 유지보수가 힘들고 테스트가 원활하게 진행되지 않는다.
  • 멀티 스레드 환경에서 동기화 처리를 하지 않으면 인스턴스가 2개 생성된다.
  • 반드시 싱글톤이 필요한 상황이 아니면 지양하는 것이 좋다고 한다.
    ( 잘 사용한다면 문제없음 ! )

Java와 Spring에서 싱글톤 패턴



java에서 싱글톤 패턴 구현하기

public class JavaSingleton { 
  
  private JavaSingleton()
  
  private static class LazyHolder  { 
        private static final JavaSingleton instance = new JavaSingleton(); 
  } 
  
  public static JavaSingleton getInstance()  { 
        return LazyHolder.instance; 
  } 
} 
  • 가장 보편적으로 사용되는 싱글톤 구현법이다. Thread Safety와 성능면에서 좋은 효율을 보여주기 때문이다.
  • static 키워드로 선언된 객체는 메모리 할당이 한 번만 이루어지고 final로 선언되면 덮어쓸 수 없는 것을 이용한 것이다.
  • getInstance()가 LazyHolder클래스의 instance를 호출한 순가 해당 클래스는 최초 인스턴스를 생성한다.
  • 그 후로부터 호출될 때마다 해당 인스턴스를 리턴한다.


Spring에서 싱글톤 패턴 구현하기

  • Spring에서는 스프링 컨테이너에 의해 구현된다.
  • 컨테이너 내에서 특정 클래스에 대해 @bean이 정의되면 컨테이너가 그 클래스에 대해 딱 한 개의 인스턴스를 만든다.
  • 이후에 bean이 호출될 때 마다 생성된 공유 인스턴스를 리턴시킨다.
  • bean 관리의 주체인 스프링 컨테이너는 그 어떤 호출에도 단일 공유 인스턴스를 리턴시키므로 thread safety도 자동으로 보장된다.


차이점

  • 자바 싱글톤패턴은 개발자에 의해 구현되고, 스프링 싱글톤패턴은 스프링 컨테이너에 의해 구현된다.
  • 자바 싱글톤패턴의 scope는 코드 전체이고, 스프링 싱글톤패턴의 scope는 해당 컨테이너 내부이다.
  • 자바 싱글톤패턴은 개발자의 로직에 따라 thread safety를 보장할수도, 보장하지 않을수도 있다.
    스프링 싱글톤패턴은 Thread safety를 자동으로 보장한다.

0개의 댓글