과정을 즐기자

싱글톤 컨테이너 (모각소 4주차) 본문

Spring

싱글톤 컨테이너 (모각소 4주차)

320Hwany 2022. 7. 24. 18:35

7/30 모각소 모임 전 개인 공부

 

웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.

스프링 없이 만든 순수한 DI 컨테이너는 AppConfig를 요청할 때마다 객체를 새로 생성한다. 따라서 메모리 낭비가 발생한다.

싱글톤 패턴은 이를 해결하기 위해 객체를 1개만 생성하고 이를 공유한다.

 

  • 싱글톤 패턴

클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴이다. private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다.

하지만 이렇게 싱글톤 패턴을 구현하면 코드가 길어지고 클라이언트가 구체 클래스에 의존해 DIP, OCP를 위반한다. 

 

따라서 이에 대한 해결책으로 스프링 빈을 활용한다. 

 

싱글톤 패턴을 활용하여 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.

 

※ 싱글톤 방식의 주의점 ※

 

객체 인스턴스를 하나만 생성하여 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 

//ThreadA : A사용자가 10000원 주문
int userAPrice = statefulService1.order("userA", 10000);
//ThreadB : B사용자가 20000원 주문
int userBPrice = statefulService2.order("userB", 20000);

다음과 같이 userAPrice는 B사용자가 20000원을 주문하더라도 10000원을 유지 해야한다.

 

  • @Configuration, @Bean

스프링 컨테이너는 싱글톤 레지스터리이다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다.

@Bean만 사용해도 스프링 빈으로 등록되지만 싱글톤을 보장하지는 못한다. 그러므로 스프링 설정 정보는 @Configuration을 사용해야한다.

 

'Spring' 카테고리의 다른 글

MVC 프레임워크 구현하기 - 2  (0) 2022.10.29
MVC 프레임워크 구현하기 - 1  (0) 2022.10.29
웹 MVC  (0) 2022.07.18
스프링 빈과 의존관계  (0) 2022.07.18
스프링 웹 개발 기초  (0) 2022.07.14