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 만 메소드에 적용하면?
- 빈은 등록된다
- 하지만 그렇게 되면 순수 자바코드로 돌아가기 때문에 싱글톤이 보장되지 않는다