본문 바로가기
  • Seizure But Okay Developer
BackEnd/Spring

싱글톤 컨테이너

by Sky_Developer 2023. 4. 29.

개요

스프링에 대한 이해를 위해 글을 씁니다.

 

내용

스프링의 기본 토대 중 하나인 싱글톤 컨테이너 개념에 대해서 알아보겠습니다.

 

싱글톤 사용 이유

스프링은 기업용 온라인 기술을 지원하기 위해 탄생했습니다. 이때 대부분의 스프링 애플리케이션은 웹 용입니다.

웹 애플리케이션은 여러 고객으로부터 동시에 요청을 받는데요. 만약 스프링을 적용하지 않은 순수 자바 프로그램이라면 3명의 고객이 요청을 하면 각기 다른 3개의 객체가 DI 컨테이너에 생성이 됩니다. 이 경우 메모리 낭비가 심합니다.

 

문제상황 - 각 고객의 요청에 반응해 객체 생성

 

이를 해결하기 위해 객체 1개만 생성하고 이를 공유하도록 설계하는데 이때 사용하는 것이 싱글톤 패턴입니다.

 

싱글톤 패턴의 개념에 대해선 간단하게 설명하고 넘어가겠습니다.

 

싱글톤 패턴 개념

클래스 인스턴스가 딱 하나만 생성되도록 보장

 

스프링 컨테이너를 쓰면 기본적으로 객체를 전부 싱글톤으로 관리해줍니다. 하지만 싱글톤으로 관리했을 때 문제도 있습니다.

 

문제점

  • 싱글톤 패턴을 적용하기 위해 코드가 많이 들어감
  • 클라이언트가 의존관계상 구현클래스에 의존, DIP 위반
  • 위 문제에 따라 OCP 위반 가능성이 높아짐
  • 테스트 하기 어려움
  • 내부 속성을 변경하거나 초기화하기 어려움
  • private 생성자로 자식클래스 만들기가 어려움
    • private 접근제어자 사용시 해당 클래스(자기 자신)에서만 사용가능한데, 상속을 하면 부모 생성자가 자동으로 생성이 될것이고 이때 private 으로 부모 생성자를 선언했으면 private 접근제어자로 인해 사용을 못함
  • 결론적으로 유연성이 떨어짐

스프링은 이러한 문제점을 다 해결후 싱글톤으로 사용하는데 스프링 컨테이너를 싱글톤 컨테이너라고도 부릅니다.

싱글톤 컨테이너에 대해 정리하자면 아래와 같습니다.

 

싱글톤 컨테이너 정리

  • 스프링 빈은 싱글톤으로 관리된다
  • 이전 글에서 본 것과 같이 스프링 컨테이너는 객체를 하나만 생성해서 관리한다 (2. 스프링 빈 등록 참고)
  • 스프링 컨테이너는 싱글톤 컨테이너 역할을 하며 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리 라고 한다


싱글톤 컨테이너를 사용했을 때의 장점은 아래와 같습니다.

싱글톤 컨테이너 장점

  • 싱글톤 패턴 구현을 위한 코드를 사용할 필요가 없음
  • DIP, OCP, 테스트, private 생성자 관련 문제로부터 벗어나 자유롭게 싱글톤 사용 가능

 

싱글톤 컨테이너 적용 후

 

결론적으로 싱글톤 컨테이너 사용 시 요청이 올때마다 객체를 생성하지 않고 이미 만들어진 객체를 공유하여 재사용하게 됩니다.

 

싱글톤 방식의 주의점

싱글톤 패턴은 같은 객체 인스턴스를 공유하기 때문에, 싱글톤 객체는 상태를 유지하게 설계하면 안됩니다.

즉, 무상태로 설계해야 하는데요, 무상태로 설계할 때의 주의점을 정리하면 아래와 같습니다.

  • 특정 클라이언트에 의존적인 필드 있으면 X
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 X
  • 읽기만 가능해야 함 (수정할 수 있으면 X)
  • 필드대신 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 함

 

 

참고

https://m.blog.naver.com/heartflow89/220954420688

https://chanhuiseok.github.io/posts/java-1/

http://www.tcpschool.com/java/java_modifier_accessModifier

http://www.tcpschool.com/java/java_inheritance_super

스프링 핵심 원리 - 기본편 (김영한)

댓글