Spring뿌시기/3주차 - 스프링 핵심 원리 기본편 2

싱글톤 컨테이너 - 싱글톤 컨테이너

ykm1256 2022. 10. 24. 21:04

싱글톤 컨테이너

  • 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리
  • 스프링 빈이 바로 싱글톤으로 관리되는 빈

 

스프링 컨테이너의 싱글톤

  • 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리
  • 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.
  • 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.
  • 스프링 컨테이너 덕분에 싱글톤 패턴의 장점만을 이용할 수 있다.
    • 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
    • DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용

 

스프링 컨테이너 싱글톤 확인

ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

MemberService memberService1 = ac.getBean("memberService", MemberService.class);
MemberService memberService2 = ac.getBean("memberService", MemberService.class);

assertThat(memberService1).isSameAs(memberService2);
  • 변수를 두 개 선언하여 getBean 메서드로 스프링 컨테이너에서 객체를 받아옴
  • 다른 변수지만 확인해보면 같은 인스턴스를 참조한다.

따라서, 스프링 컨테이너(싱글톤 컨테이너)를 사용하면 여러 고객이 동시에 요청을 하는 상황에서도 하나의 객체를 공유하여 효율적으로 재사용할 수 있다.

 

싱글톤 방식의 주의점

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

 

상태를 유지한 싱글톤 방식

private int price; //상태를 유지하는 필드
public void order(String name, int price) { 
    System.out.println("name = " + name + " price = " + price);
    this.price = price; //여기가 문제!
}
public int getPrice() {
    return price;
}
statefulService1.order("userA", 10000);
statefulService2.order("userB", 20000);

int price = statefulService1.getPrice();

System.out.println("price = " + price);
  • 싱글톤 방식으로 구현하여 statefulService1(이하 1)과 statefulService2(이하 2)가 같은 인스턴스를 참조하고 있다고 하자.
  • 그럴 때 위의 코드를 보면 1에서 먼저 order메서드를 호출하여 해당 인스턴스의 price 값이 10000이 된다.
  • 그리고 2에서 order메서드를 호출하여 인스턴스의 price 값이 20000이 된다.
  • 그리고 1에서 getPrice() 메서드를 호출하여 price 변수를 출력하면
  • 1의 price 값이니까 처음에 설정한 10000이 출력되길 기대할 수 있지만
  • 2와 같은 인스턴스를 사용하기 때문에 나중에 설정한 20000이 출력된다.

간단한 예시였지만, 실제로 이런식으로 설계하게 되면 엄청난 문제가 발생할 수 있다.

스프링 빈은 항상 무상태(stateless)로 설계하자!!

 

 

 

 


출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com