[Spring] 스프링 핵심 원리 - 기본편 (5) 싱글톤 컨테이너
2024, Feb 04
목차
섹션 5. 싱글톤 컨테이너
강의 내용 : 지난 강의에서 구현한 주문 도메인에 스프링 적용
웹 애플리케이션과 싱글톤
스프링이 없는 순수한 DI -> 요청할때마다 생성하여야 함
- 메모리 낭비가 심하다
- 해결방안 : 객체를 1개만 생성하고 공유하도록 설계 ==>
싱글톤 패턴
싱글톤 패턴
클래스의 인스턴스가 딱 1개만 생성하는 것을 보장하는 디자인 패턴
코드
public class SingletonService {
private static final SingletonService instance = new SingletonService();
// 인스턴스를 이 메소드를 통해서만 조회할 수 있다.
public static SingletonService getInstance() {
return instance;
}
// 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
private SingletonService() {
}
public void logic() {
System.out.println("싱글톤 객체 로직 호출");
}
}
싱글톤 패턴의 문제점
- 싱글톤 패턴을 구현하는 코드를 넣어야함
- 의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP 위반 (추상화에 의존해야함)
- 구체클래스.getInstance() « 이 부분
- private 생성자로 만들어서 자식 클래스를 만들기 어려움
싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 싱글톤 패턴을 적용하지 않아도 객체 인스턴스를 싱글톤으로 관리함.
- 스프링 빈
- 고객의 요청이 올 때마다 객체를 생성하는 것이 아니라, 만들어진 객체를 공유해서 효율적으로 재사용
- (참고 : 요청할 때마다 새로운 객체를 생성하는 기능도 제공함)
싱글톤 방식의 주의점
- 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유함 => 상태를 유지하게 설계하면 안된다.
- 무상태(stateless) 설계
- 특정 클라이언트에 의존적인 필드가 있으면 안됨
- 값을 변경할 수 있는 필드가 있으면 안됨
- 가급적 읽기만!
@Configuration과 바이트코드 조작의 마법
- AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그걸 스프링빈으로 등록해서 싱글톤이 보장되도록 해준다.
- @Configuration 어노테이션을 사용한 클래스가 이렇게 적용되는 것
만약 @Configuration을 쓰지않고, AppConfig를 사용한다면?
-> 스프링빈 등록은 가능하나, 싱글톤을 보장하지 않음