본문 바로가기
강의 정리/스프링 핵심 원리 - 기본편

3. 싱글톤 컨테이너

by 이석준석이 2020. 12. 15.

싱글톤이란?

  • JVM 내부에 하나의 객체 인스턴스만 존재해야 한다.

1. 웹 어플리케이션에는 왜 싱글톤을 사용하는가?

  • 웹 어플리케이션은 보통 여러 고객이 동시에 요청을한다.
  • 싱글톤이 아니라면
    • 고객 3명이 요청하면 인스턴스 3개를 만들어버리는 문제
    • n명이 요청하면 n개를 만든다.
      • 메모리 낭비가 심하다.

 

해당 객체는 딱 하나만 생성하고, 공유되게 사용하자. (싱글톤)


2. 싱글톤 패턴

 

static 영역에 미리 생성한 뒤, 이를 getInstance로 하여 가져와 사용하는 방법

  • JVM ClassLoader 가 로딩하는 과정에서, static 영역을 static 영역에 집어넣을 때, new SingletonService() 를 수행하여 넣어놓는다.
    • static 로딩과정에 한번만 생성됐으며,
    • getInstance로 하여 가져오므로 싱글톤이다.
  • 생성자는 private 으로 만들어, 외부에서 객체 생성을 막는다.
public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance() {
        return instance;
    }

    private SingletonService() {
    }
}

 

싱글톤 패턴의 문제

  • 구현하는 코드가 필요하다.
  • 테스트하기가 어렵다.
    • 이미 설정이 다 끝나있음
  • 자식 클래스를 만들기 어렵다.
  • 유연성이 떨어진다.
  • 안티패턴으로 불리기도 한다.

3. 싱글톤 컨테이너

 

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

  • 이처럼, 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.

스프링 컨테이너는 싱글톤 패턴의 모든 단점을 해결하면서 싱글톤으로 유지할 수 있다.

  • 싱글톤 패턴 코드 필요 없음
  • DIP/OCP/테스트/private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.

4. 싱글톤 방식의 주의점

 

여러 클라이언트가 하나의 인스턴스를 공유하기 때문에, stateful 하게 설계해서는 안된다.

  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
  • 가급적으로 읽기만 가능해야한다.
  • 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.

5. @Configuration 과 바이트코드 조작

 

@Configuration 이 붙은 설정 클래스 파일은

  • 스프링이 CGLIB 을 사용하여 바이트코드 조작을 통해서
    • AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 다른 클래스를 스프링 빈으로 등록한다.

 

@Configuration 내부에 있는 @Bean으로 등록되는 빈들은

  • 바이트 코드 조작이 되어 객체를 반환하여 빈으로 등록하는 경우에는, 싱글톤으로 한번만 등록되도록 한다.


번외

  • 스프링 빈도 객체라면 GC의 대상이므로 삭제되지 않을까?
    • GC의 대상이 되려면 참조하는 포인터가 없어야 한다.
    • 싱글톤 빈은 스프링 컨테이너가 계속 참조하고 있음
    • 스프링 컨테이너는 우리 어플리케이션의 어디선가 계속 참조하고 있음
    • 종료될 때까지 사라지지 않는다.

'강의 정리 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글

7. 빈 스코프  (0) 2020.12.24
6. 빈 생명주기 콜백  (0) 2020.12.23
4. 컴포넌트 스캔  (0) 2020.12.17
2. 스프링 컨테이너와 스프링 빈  (0) 2020.12.13
1. 객체지향 설계와 스프링  (0) 2020.12.12