CS 정리/Spring

싱글톤 컨테이너

tose33 2023. 11. 16. 21:35

싱글톤 패턴 

객체가 메모리에 단 하나 유니크 하게 존재하도록 하는 디자인 패턴.

 

싱글톤 패턴의 문제점 (spring 사용하지 않을때) 

  • 싱글톤 패턴 구현하는 코드 자체가 많이 들어간다
  • 테스트하기 어렵다
  • 의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP 위반, OCP 위반 가능성 
  • 내부 속성 변경 초기화 어렵다
  • private 생성자를 쓰기 때문에 자식 클래스 만들기 어려움
  • 결국 유연성이 떨어진다 

 

Java 에서 객체를 싱글톤으로 만드는법

public class SingletonService {
    // static 영역에 유니크하게 존재
    private final static SingletonService instance = new SingletonService();
    // new 로 생성 못하도록 생성자 막아버림
    private SingletonService() {
    }
    public SingletonService getInstance() {
        return instance;
    }
}

 

 

 

 

 

@Configuration

@Configuration
public class AppConfig {

    @Bean
    public OrderServiceImpl orderServiceImpl() {
        return new OrderServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new JDBCMemberRepository();
    }
}
  • 스프링은 @Configuration 이 붙은 클래스를 CGLIB 라는 바이트코드 조작 라이브러리를 사용해서 해당 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한다.
  • @Bean 이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 없으면 생성해서 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다.
  • 만약 클래스에 @Configuration 을 적용하지 않고 @Bean 만 메소드에 적용하면?
    • 빈은 등록된다
    • 하지만 그렇게 되면 순수 자바코드로 돌아가기 때문에 싱글톤이 보장되지 않는다