1. 스프링 빈 설정 메타정보 : BeanDefinition
- XML 이던, 뭐든간에 결국 BeanDefinition을 만들어버리면 스프링컨테이너는 이거만 알면 된다.
- 즉, 스프링컨테이너는 BeanDefinition 에만 의존한다. (BeanDefinition 추상화에만 의존하도록 설계한거당)
- 직접 스프링컨테이너에 등록할 수도 있다. 하지만 실무에선 안씀
2. 웹앱과 Singleton
- 고객요청이 많은 웹앱에서 순수Java로된 DI컨테이너를 만들게되면 객체를 미친듯이 많이 생성하게 됨(메모리 낭비)
- 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. (싱글톤)
- 싱글톤은 클래스 인스턴스가 딱 1개만 생성되도록 보장하는 패턴이다.
- private 생성자를 이용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막는다.
- 이제 꺼내려면 getInstance() 밖에 방법이 없다. (항상 같은 인스턴스를 반환한다.)
- 사용하기
- 스프링컨테이너를 쓰면 객체를 모두 싱글톤으로 만들어서 관리해준다!
- 싱글톤 패턴의 단점 :
: 구현하는 코드 자체가 많이 들어감
: 클라이언트가 구체 클래스에 의존함 (DIP 위반)
: 구체클래스를 의존하므로 OCP 위반 가능성이 높아짐
: 내부 속성 변경/초기화가 어렵다
: 유연성이 떨어진다
: 안티패턴이다.
- 스프링컨테이너는 단점들을 모두 해결하고 싱글톤으로 관리해준다.
3. 싱글톤 컨테이너
- 스프링 빈은 싱글톤으로 관리되는 빈이다.
- 스프링컨테이너는 싱글톤 컨테이너 역할을 한다. 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.
- 요청할 때마다 새로운 객체를 생성해서 반환하는 기능도 있긴 하다. (라이프사이클 관련 빈스코프 특별한 기능 사용 시)
- 싱글톤 방식의 주의점
: 싱글톤방식은 여러 클라이언트가 같은 객체인스턴스를 공유하므로, 싱글톤 객체는 상태를 stateful(유지) 하게 설계하면 안된다.
: 무상태(stateless) 로 설계해야한다
- 특정 클라이언트에게 의존적이면 안됨
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안됨
- 가급적 읽기만 가능해야함
- 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal등을 사용해야 한다.
- 싱글톤 빈의 필드에 공유 값을 설정하면 큰 장애가 발생할 수 있다.
- 주의점 확인해보자
- 아래와 같이 그냥 지역변수 쓰셈
'Backend - Java Spring > Spring Core 핵심원리(완)' 카테고리의 다른 글
[SpringCore 핵심원리] 컴포넌트스캔 (0) | 2024.02.17 |
---|---|
[SpringCore 핵심원리] @Configuration (0) | 2024.02.17 |
[SpringCore 핵심원리] IoC, DI, Container (0) | 2024.02.17 |
[SpringCore 핵심원리] Config (0) | 2024.02.16 |
[SpringCore 핵심원리] 설계 (0) | 2024.02.16 |
댓글