싱글톤 컨테이너

qkrrnjswo·2023년 4월 17일
0

Inflearn Spring

목록 보기
9/13

싱글톤 패턴

1. Java 싱글톤 패턴

  • 객체 인스턴스를 한정되게 생성하도록하여 불필요한 자원의 소모를 막는다.
  • 싱글톤 패턴은 인스턴스가 한개만 생성되도록 하는 설계 패턴
public class SingletonService {
	// static 영역에 객체를 딱 1개만 생성해둔다.
	private static final SingletonService instance = new SingletonService();
	// public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
	public static SingletonService getInstance() {
		return instance;
	}
	// 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
	private SingletonService() { }
    
	public void logic() {
		System.out.println("싱글톤 객체 로직 호출");
	}
}

2. Java 싱글톤 패턴의 문제점

  • 코드 자체가 많아진다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP위반(getInstance())
  • 구체 클래스에 의존하기 때문에 OCP 원칙을 위반할 가능성도 높다.
  • 내부 속성을 변경하거나 초기화 하기 어렵다.
  • 테스트하기 어렵다.
  • 유연성이 떨어진다.
    spring컨테이너(싱글톤 컨테이너)는 단점을 제거하고 장점만 사용했다!!

싱글톤 컨테이너(spring 컨테이너)

1. Java 싱글톤 패턴

  • 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리!!
  • 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.

2. 싱글톤 방식의 주의점 ⚠⚠ 중요!!!!!!!

싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야 한다?

  • 특정 클라이언트에 의존적인 필드가 있으면 안됨!
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안됨!
  • 가급적 읽기만 가능
  • 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용

즉, 여러 클라이언트가 접근할 수 있는 공유 값을 설정하면 동기화 문제가 발생!!!!!
스트링 빈을 항상 무상태(stateless)로 설계해야 한다!!

3. @Configuration

자바 코드를 어떻게 할수 없기 때문에 스프링에서는 싱글톤을 유지를 보장하기위해 바이트 코드를 조작한다.

  • AppConfig를 상속받아 AppConfig@CGLIB가 동적으로 생성된다.
  • AppConfig@CGLIB는 스프링 빈이 존재하면 존재하는 빈을 반환, 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환

0개의 댓글