그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야한다.
싱글톤 컨테이너는 싱글톤 패턴의 단점을 해결하면서 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.
스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.
싱글톤 방식의 주의점
싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이널ㄹ 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체를 상태를 유지(stateful)하게 설계하면 안된다.
- 특정 클라이언트에 의존적인 필드가 있으면 안된다.
- 특정 클라이언트가 값을 변경할수 있는 필드가 있으면 안된다.
- 가급적 읽기만 가능해야한다.
- 필드 대신에 자바에서 공유 되지 않는, 지역변수, 파라미터, ThreadLocal등을 사용해야 한다.
싱글톤 컨테이너의 그냥 변수의 문제는. 내용이 계속 바뀌는것이 문제가 된다.
private int price;// 이렇게 쓰지마라 전역변수
public void order(int price){
this.price
}
이런 형식으로 지역변수나 참조형으로 써라
public int statusService(Price price){
return price;
}
무상태(stateless)로 설계하자
@Configuration이 붙은 클래스에 @bean메소드로 의존성을 new로 생성하여 주입해줄때 스프링 컨테이너에 빈 생성하여 컨테이너에 등록해주는데 만약 있다면 스프링 컨테이너에서 찾아서 반환해주고 없다면 if문을 넘어가서 else문에서 기존로직을 호출해서 생성하고 스프링 컨테이너에 등록하고 생성한것을 반환해준다. 그렇기때문에 여러번 new해도 호출되지 않고 최초 한번의 new만 생성되는것이다.
GGLIB기술을 사용해서 싱글톤을 보장한다.
@Configuration를 클래스에서 없앤다면 스프링 컨테이너가 아닌 그냥 스프링 빈으로 들어가게된다. 싱글톤이 적용되지 않는다는것이다.