[요약] 03. 싱글톤

Dami·2025년 4월 29일

Singleton

프로그램 실행 내내 오직 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴.

즉, 객체를 딱 하나만 만들어서

모든 곳에서 똑같은 객체를 공유해서 사용하는 것

Singleton 패턴 예시

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {}  // 외부에서 new 막기

    public static Singleton getInstance() {
        return instance;
    }
}
  • Singleton.getInstance()를 호출하면 항상 같은 객체가 나온다.

Singleton을 사용하는 이유

  1. 메모리 절약 (필요 이상 객체를 안 만듦)
  2. 공유 리소스 관리 (예: 커넥션 풀, 설정 클래스 등)
  3. 일관성 유지 (항상 같은 객체를 쓰니까)

스프링에서의 Singleton

스프링 컨테이너에 등록하는 모든 @Bean은 싱글톤임.

📦 싱글톤 적용 대상

대상예시
@Component, @Service, @Repository, @Controller일반적인 빈들 (서비스, 컨트롤러 등)
@Bean 메서드로 등록된 객체Java Config 파일의 빈
@Configuration 클래스 내부 객체Config 클래스가 프록시로 변환됨
Spring Boot AutoConfiguration으로 등록된 빈들(ex) DataSource, Tomcat, DispatcherServlet
  • 스프링은 모든 @Component, @Service, @Repository 같은 빈을 기본적으로 싱글톤으로 만든다.
  • 그래서 스프링에서는 굳이 직접 싱글톤 패턴 코드를 작성할 필요가 없다.
  • 단, 스프링은 고전 싱글톤처럼 static 접근하는 게 아니라, 의존성 주입(DI) 로 관리한다.
@Service
public class MyService {
}

→ 스프링이 하나만 만들어서 계속 주입해준다.


싱글톤은 상태유지가 될까?

No.

  • 싱글톤 객체는 하나만 존재하기 때문에.
  • 모든 사용자, 모든 요청이 같은 객체를 공유한다.
  • 그런데 객체 안에 '변하는 값(상태)'이 있으면, 여러 사용자가 같은 필드를 엉켜서 쓰임.

→ "동시성 문제"가 발생한다.

싱글톤 객체는 "공유 객체"이기 때문에,

개인별로 달라지는 상태를 멤버 변수로 가지면 안 된다.
ex) DTO는 빈으로 선언하지 않았음.

0개의 댓글