스프링 핵심원리 - 싱글톤패턴

lacblueeun·2020년 10월 19일
7

Spring

목록 보기
2/6
post-thumbnail

웹 애플리케이션과 싱글턴

1. 싱글턴 패턴(Singleton pattern)

소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

1-1 싱글턴 패턴을 사용하는 이유

만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 객체를 생성하게 되면 메모리 낭비가 심하기 때문이다.


2. 싱글턴 패턴 구현

2-1 순수한 DI 컨테이너

  1. 객체를 생성하면 매번 새로운 객체가 생성된다.
  2. 많은 객체를 생성해야 하는 서비스(ex 배달어플, 카카오택시)에서는 메모리 낭비가 많아진다.

2-2 싱글턴 패턴 구현

  1. static 객체를 통해서 해당 객체를 1개만 생성할 수 있도록 지정한다.
  2. static 메소드를 통해서 외부에서 생성할 수 있도록 제한한다.
  3. new 연산자를 통해서 객체를 만드는 것을 private 생성자를 통해서 제한한다.

영한님 : 싱글턴 패턴을 구현하는 방법은 여러가지가 있다. 이 방법은 객체를 미리 생성해두는 가장 단순하고 안전한 방법이다. 싱글턴 패턴을 이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다.

3. 싱글턴 패턴 문제점

  1. 싱글턴 패턴을 구현하는 코드 자체가 많다.
  2. 의존관계상 클라이언트가 구체 클래스에 의존한다.
  3. 테스트하기 어렵다.
  4. 내부 속성을 변경하거나 초기화 하기 어렵다.
  5. private 생성자로 자식 클래스를 만들기 어렵다.
  6. 싱글톤 컨테이너
  7. 스프링에서 위에 단점들을 모두 해결해준다.

즉, 싱글턴 패턴을 사용하게 되면 유연성이 떨어지게 된다는 것이다.

4. 스프링의 싱글턴 패턴

4-1 스프링 컨테이너

스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리한다. 이러한 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하고 객체를 싱글톤으로 유지할 수 있다.

  1. 스프링에서 싱글턴 관련 코드는 작성하지 않아도 스프링의 기능으로 빈에다가 객체를 1개 설정한다.
  2. 위와 마찬가지로 객체를 새롭게 생성했지만 같은 객체를 생성한 결과를 볼 수 있다.

4-2 싱글턴 방식의 주의점 ✨

싱글톤 패턴이든, 스프링에서 객체 인스턴스를 하나만 생성해서 공유하는 상황에서 객체 인스턴스를 공유하기 때문에 객체 상태를 유지(stateful)하게 설계하면 안된다.
1. price는 공유되는 필드이기 때문에 특정 클라이언트가 값을 변경한다.
2. 실무에서 이런 경우를 종종 보는데, 이로인해 정말 해결하기 어려운 큰 문제들이 터진다.(몇년에 한번씩 꼭 만난다.)

profile
Go for Frontend Developer 🧪

1개의 댓글

comment-user-thumbnail
2021년 4월 30일
  1. static 메소드를 통해서 외부에서 생성할 수 있도록 제한한다. 에서 'static'을 'private'으로 변경해야 할 것 같습니다.
답글 달기