안녕하세요

이번 포스팅에서는 Spring Singleton에 대해 알아보겠습니다.

 

 

 

웹 어플리케이션과 싱글톤

 

현재 대부분의 스프링은 웹 어플리케이션입니다.

웹 어플리케이션은 보통 많은 고객이 동시에 요청을 하기 때문에 request마다 객체를 새로 생성하면 많은 메모리를 낭비하게 됩니다.

 

이에 해당 객체를 딱 1개만 생성하고 공유하도록 설계한 것이 스프링 싱글톤입니다.

 

 

 

Spring Singleton vs Singleton Pattern

 

싱글톤 패턴은 클래스 로더에 의해, 스프링 싱글톤은 스프링 컨테이너(ApplicationContext)에 의해 one instance가 보장됩니다.

컨테이너 내에 특정 클래스에 대한 Bean이 정의되면, 스프링 컨테이너가 그 클래스에 대한 one instance를 생성하는 것입니다.

 

싱글톤 패턴에서는

톰캣이 WAR 파일을 만들면 WAR 파일 하나 당 클래스 로더가 하나 배치되고

 

스프링 싱글톤에서는

web.xml 내에 각각의 context들이 scope가 되는 것입니다.

default scope이고, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.

 

* 스프링에서 scope를 singleton만 사용하는 것은 아닙니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="personSingleton" class="org.baeldung.scopes.Person" scope="singleton"/>    
</beans>

 

 

 

Spring Singleton Container

 

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리합니다.

 

instance는 설정 정보에 의하여 관리되며, Bean이 호출될 때마다 스프링은 생성 된 instance를 리턴 시키는 것입니다.

instance를 생성하는 주체가 스프링 컨테이너이므로 thread-safe 또한 자동으로 보장됩니다.

 

 

 

싱글톤 방식의 주의점

 

싱글톤 방식은 여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 상태를 유지(stateful)하게 설계하지 않아야합니다.

 

  • 무상태(stateless)로 설계할 것 
  1. 특정 클라이언트에 의존적인 필드가 없을 것
  2. 특정 클라이언트가 값을 변경할 수 있는 필드가 없을 것 ( 주문금액 등 )
  3. 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용할 것
  4. 스프링 빈의 필드에 공유 값을 설정하지 말 것

 

 

 

 

 

[ 참고하면 좋을 포스팅 ]

 

Context란?

velog.io/@seculoper235/Spring-Core-Context-1%ED%8E%B8

 

Spring Singleton vs Singleton Pattern

enterkey.tistory.com/300

 

Java Singleton Pattern

e-una.tistory.com/27

 

복사했습니다!