웹 APP과 싱글톤
스프링없는 순수한 DI 컨테이너 AppConfig는 요청할 때 마다 객체를 새로 생성
생성된 객체는 모두 jvm 메모리에 쌓이게 되는데 고객요청이 많은 웹 app 특성상 효율적이지 X
ex. 고객 트래픽 초당 100일 경우 초당 100개 객체 생성되고 소멸 ⇒ 메모리 낭비
싱글톤 컨테이너
<aside> 📗 스프링 컨테이너는 싱글톤 컨테이너 역할
⇒ 싱글톤 객체 생성/관리하는 기능 싱글톤 레지스트리
스프링 컨테이너는 싱글톤 패턴의 모든 단점 해결하면서
객체를 싱글톤으로 유지/관리
- 싱글톤 패턴을 위한 지저분한 코드 미사용
- DIP, OCP, TEST, private 생성자로부터 자유롭게 싱글톤 사용
ex. 지금까지 학습한 스프링 빈 = 싱글톤으로 관리되는 빈
고객요청 올 때 마다 객체 생성이 아닌, 이미 만들어진 객체를 공유해 효율적으로 재사용
</aside>
싱글톤 방식 주의점
싱글톤 객체는 상태를 유지(stateful)하게 설계 X, 무상태(stateless)로 설계 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문
⇒ 특정 클라이언트에 의존적인 필드 있으면 X
⇒ 특정 클라이언트가 변경할 수 있는 필드 값이 존재해서는 X
⇒ 가급적 읽기만 가능하게
⇒ 필드 대신 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 함
스프링 빈 필드에 공유 값 설정시 큰 장애 발생
@Configuration과 Byte Code조작의 마법