우주먼지
article thumbnail

💡 Singleton Container

스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.
지금까지 우리가 학습한 스프링 빈이 바로 싱글톤으로 관리되는 빈이다.

 

  • 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.
    • 이전에 설명한 컨테이너 생성 과정을 자세히 보자. 컨테이너는 객체를 하나만 생성해서 관리한다.
  • 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.
  • 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
  • 스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
    • 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
    • DIP & OCP 위반, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.

Spring Container가 자동으로 객체를 Singleton을 적용해주는 예시

 

Singleton 방식의 문제점

  • 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는
    싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에
    싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다.
  • 무상태(stateless)로 설계해야 한다!
    • 특정 클라이언트에 의존적인 필드가 있으면 안된다.
    • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다!
    • 가급적 읽기만 가능해야 한다.
    • 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
  • 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!!

 

상태를 유지 할 경우 발생하는 문제 예시

  • Thread A가 사용자 A 코드를 호출하고 Thread B가 사용자 B 코드를 호출한다고 가정
  • StatefulService 의 price 필드는 공유되는 필드인데, 특정 클라이언트가 값을 변경
  • 사용자A의 주문금액은 10000원이 되어야 하는데, 20000원이라는 결과가 나옴
  • 스프링 빈은 항상 무상태(stateless)로 설계해야함

 

Service 생성
테스트 출력

 

무상태(stateless) 설계로 변경

  • stateful 하게 설계된 코드들을 주석처리하고 무상태(stateless)로 설계 후 테스트

Service의 코드 변경

'Inflearn 강의 > Spring 핵심원리 기본' 카테고리의 다른 글

7 - Component Scan  (0) 2022.10.18
6 - @Confituration과 Singleton / 바이트코드 조작  (0) 2022.10.17
4 - Singleton Pattern  (0) 2022.10.17
3 - Bean 조회  (0) 2022.10.17
2 - Spring 사용하여 개발  (1) 2022.10.15
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그