대부분의 스프링 어플리케이션은 웹이다.
웹 어플리케이션은 보통 여러 고객이 동시에 요청을 한다.
현재 실습 어플리케이션은
한 유저가 요청 시 마다 새롭게 객체를 만들어준다.
생성되는 객체의 참조값은 전부 다르다 (전부 다른 객체임)
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
따라서 2개 이상 만들어지지 않도록 막아놔야함
static 영역으로 객체를 생성하여 멤버로 설정함
생성자를 private로 설정
내부에서 추가적인 객체 생성 x
구현 코드를 추가해야댐
클라이언트가 구체 클래스를 의존해야함 → DIP 위반
객체 지향의 이점을 살리기 어려움
참고
equal은 대상의 내용을 비교
same(==)은 대상의 참조값을 비교
스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도 객체를 싱글톤으로 관리함.
여러 클라이언트가 하나의 객체를 사용하므로 클라이언트 의존적인 stateful한 설계가 아닌 stateless한 설계가 필요하다.
특정 클라이언트 의존적인 필드가 있으면 안된다.
가급적 읽기만 가능해야 한다.
필드 대신 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 이용해야한다.
config 파일 내에서 상속 관계에 의해 new를 남발하면 싱글톤이 깨지는 것처럼 보인다.
그러나 어노테이션과 함께 스프링 컨테이너로 실행하면 알아서 싱글톤으로 처리한다
주의: static으로 설정하면 싱글톤 패턴이 깨진다.
자바코드를 보면 분명히 싱글톤이 깨지는 것이 맞다.
스프링은 CGLIB라는 바이트코드 조작 라이브러리를 사용하여 자바 코드가 빌드된 클래스가 아닌 임의의 다른 클래스를 스프링 빈으로 등록한다.
이미 스프링 컨테이너에 등록되어 있다면 해당 컨테이너를, 등록되어 있지 않다면 등록한 후 해당 컨테이너를 반환하는 방식으로 동작한다.
CGLIB를 거치지 않고 자바 코드대로 동작함
싱글톤 패턴을 보장하지 못함