인터넷강의로 spring 공부를 하다가 무상태성이라는 단어를 듣게 되었다.
스프링의 디자인 패턴은 디폴트가 싱글톤방식이다.
싱글톤이란, 메모리에 하나의 인스턴스만 존재하도록 생성하는 방식을 말한다.
이때 여러 쓰레드에서 같은 인스턴스의 전역변수에 접근을 하게된다면 같은 값을 공유하게 돼버린다.
생각만해도 정말 끔찍하다...
위와 같은 상황을 상태유지(Stateful)라고 하며
의도적으로 상태유지를 하는것이 아니라면, 스프링 빈은 항상 무상태(stateless)로 설계해야 한다.
무상태란 한번의 요청과 응답이 이루어지면 연결이 끊기는것을 의미한다.
상태유지와 무상태에 대해 알아보며 싱글톤에 대해도 다시한번 공부하게 되었고
정말 스프링을 잘 이해하고 코딩 해야한다고 생각했다.
통상적으로 서비스를 운영하다보면 위 그림과 같이 동일한 요청이 서로 다른 클라이언트로부터 동시에 들어올 수 있다.
요청이 들어오면 객체를 만들어서 메모리를 사용하게 되는데, 만약 동일한 요청들을 전부 상이한 메모리 공간에 할당시켜 각각 응답해주게되면 메모리 공간이 남아나질 않을 것이다.
아래 코드는 싱글톤 패턴을 적용하지 않은 DI컨테이너인데, 동일한 요청에 대해서 각각 서로 다른 객체들을 만들어서 응답해주고 있다.
그래서 이에 대한 해결방안으로 웹 어플리케이션을 구현할 때, 동일한 요청들에 대해서는 싱글톤 패턴을 적용시킨다.
싱글톤 패턴을 적용하면 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라,
이미 만들어진 객체를 공유에서 효율적인 사용이 가능해진다.
그러나 싱글톤 패턴도 몇 가지 문제점을 가진다.
싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
의존관계상 클라이언트가 구체 클래스에 의존한다.
DIP를 위반한다. 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
테스트하기 어렵다. 내부 속성을 변경하거나 초기화 하기 어렵다.
private 생성자로 자식 클래스를 만들기 어렵다.
결론적으로 유연성이 떨어진다. 안티패턴으로 불리기도 한다.
스프링 컨테이너를 쓰면, 스프링 컨테이너가 기본적으로 객체를 다 싱글톤으로 만들어서 관리해준다
스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라,
이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.
참고 블로그 https://hongchangsub.com/springcore5/
<Spring> 스프링 핵심원리 이해 5 - 싱글톤 컨테이너
웹 어플리케이션과 싱글톤의 관계여러 고객이 동시에 동일한 서비스를 요청하는 경우통상적으로 서비스를 운영하다보면 위 그림과 같이 동일한 요청이 서로 다른 클라이언트로부터 동시에 들
hongchangsub.com