[Spring] 김영한 스프링 핵심원리 기본_chap05 싱글톤 컨테이너

HMS·2023년 4월 2일

해당 내용은 김영한 스프링 핵심원리 기본 강의를 들으며 강의 자료를 참고하여 정리한 내용입니다.

김영한 스프링 핵심원리 기본


chap05 웹 애플리케이션과 싱글톤

스프링은 기업용 온라인 서비스 지원을 목적으로 개발되었으며, 대부분의 스프링 애플리케이션은 웹 애플리케이션으로 구현된다. 웹 애플리케이션은 여러 고객의 동시 요청을 처리한다. 이는 고객 요청마다 객체를 새로 생성하게 되어 메모리 사용량이 증가하는 문제를 야기한다. 예를 들어, 초당 5만 건의 트랜잭션이 발생한다면, 그만큼의 객체가 생성되어 메모리에 쌓이고, 이는 가비지 컬렉션(GC)에 의한 성능 저하를 초래할 수 있다.

싱글톤 패턴

싱글톤 패턴은 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 디자인 패턴이다. 이를 위해 private 생성자를 사용하여 외부에서의 객체 생성을 차단한다.

싱글톤 구현 방법

  • static 영역에 객체 인스턴스 생성: 클래스 로딩 시 객체 인스턴스를 미리 생성하고, getInstance() 메서드를 통해서만 인스턴스에 접근 가능.
  • private 생성자: 외부에서의 객체 생성 방지.
  • 코드 구조: static으로 선언된 객체는 클래스 로딩 시 한 번만 생성되므로 단 하나의 인스턴스만 존재하게 된다.

싱글톤의 문제점

  • 싱글톤 패턴 구현에 많은 코드가 필요하며, 이는 DIP(Dependency Inversion Principle)와 OCP(Open-Closed Principle) 위반 가능성이 있다.
  • 테스트가 어렵고, 유연성이 떨어짐.
  • 상태 관리가 어려워질 수 있으며, 멀티스레드 환경에서 문제를 일으킬 수 있음.

스프링의 싱글톤 컨테이너

스프링 컨테이너는 싱글톤 패턴의 단점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리한다. 이를 위해 @Configuration@Bean 어노테이션을 사용하여 싱글톤을 유지한다.

싱글톤 방식의 주의점

  • 무상태(stateless) 설계: 싱글톤 객체는 상태를 유지하지 않도록 설계해야 한다. 공유 필드는 주의 깊게 관리해야 하며, 가능하면 지역 변수, 파라미터, ThreadLocal 등을 사용해야 한다.
  • ThreadLocal 사용: 멀티스레드 환경에서의 안전한 상태 관리를 위해 ThreadLocal을 사용할 수 있다.

@Configuration과 CGLIB

  • @Configuration 어노테이션을 사용하지 않을 경우, 싱글톤 보장이 되지 않는다.
  • 스프링은 CGLIB 라이브러리를 사용하여 @Configuration 클래스를 상속받은 프록시 객체를 생성하고, 이를 통해 싱글톤을 보장한다.

싱글톤 보장의 예외 상황

  • @Bean 메서드가 static으로

    선언되었을 때 싱글톤이 보장되지 않을 수 있다. 이 경우 스프링은 빈 인스턴스를 생성하기 위해 static 메서드를 먼저 호출한다.

profile
안녕하세요

0개의 댓글