[스프링(spring)]스프링 싱글톤 컨테이너

allnight5·2023년 2월 2일
0

스프링

목록 보기
45/62

싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야한다.

  • private 생성자를 사용하여 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야한다.

싱글톤 컨테이너는 싱글톤 패턴의 단점을 해결하면서 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.

스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.

싱글톤 방식의 주의점
싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이널ㄹ 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체를 상태를 유지(stateful)하게 설계하면 안된다.

무상태(stateless)로 설계해야한다.

  • 특정 클라이언트에 의존적인 필드가 있으면 안된다.
  • 특정 클라이언트가 값을 변경할수 있는 필드가 있으면 안된다.
  • 가급적 읽기만 가능해야한다.
  • 필드 대신에 자바에서 공유 되지 않는, 지역변수, 파라미터, ThreadLocal등을 사용해야 한다.
  • 스프링 빈의 필드에 공유값을 설정하면 정말 큰 장애가 발생할수있다.

싱글톤 컨테이너의 그냥 변수의 문제는. 내용이 계속 바뀌는것이 문제가 된다.

private int price;// 이렇게 쓰지마라 전역변수

public void order(int price){
	this.price 
} 

이런 형식으로 지역변수나 참조형으로 써라

public int statusService(Price price){
	return price;
}

항상 공유필드는 조심해야하며

무상태(stateless)로 설계하자

여러번 new로 config에서 생성해도 싱글톤이 유지될까?

@Configuration이 붙은 클래스에 @bean메소드로 의존성을 new로 생성하여 주입해줄때 스프링 컨테이너에 빈 생성하여 컨테이너에 등록해주는데 만약 있다면 스프링 컨테이너에서 찾아서 반환해주고 없다면 if문을 넘어가서 else문에서 기존로직을 호출해서 생성하고 스프링 컨테이너에 등록하고 생성한것을 반환해준다. 그렇기때문에 여러번 new해도 호출되지 않고 최초 한번의 new만 생성되는것이다.

GGLIB기술을 사용해서 싱글톤을 보장한다.

@Configuration를 클래스에서 없앤다면 스프링 컨테이너가 아닌 그냥 스프링 빈으로 들어가게된다. 싱글톤이 적용되지 않는다는것이다.

그러니 스프링 설정 정보는 항상 @Configuration을 사용하자!

profile
공부기록하기

0개의 댓글