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)로 설계하자!!
출처
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com