> For the complete documentation index, see [llms.txt](https://byulseop-til.gitbook.io/sinheeseop_til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://byulseop-til.gitbook.io/sinheeseop_til/spring/core/container/singleton_container.md).

# SingletonContainer

## 싱글톤 패턴이란?

싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되도록 보장하는 디자인 패턴입니다.

### 싱글톤 패턴의 장점

* 메모리 효율성: 하나의 인스턴스만 생성하므로 메모리 사용량 감소
* 일관성: 모든 클라이언트가 동일한 인스턴스를 공유하므로 일관된 상태 유지
* 전역 접근: 어디서든 동일한 인스턴스에 접근 가능

### 싱글톤 패턴의 단점

* 테스트의 어려움: 전역 상태를 공유하므로 테스트 시 격리가 어려움
* 유연성 저하: 싱글톤 클래스는 상속이 어려움
* 동시성 문제: 멀티스레드 환경에서 동시성 처리가 필요

## 스프링의 싱글톤 컨테이너

스프링은 싱글톤 패턴을 컨테이너 레벨에서 제공합니다. 이를 통해 개발자가 직접 싱글톤 패턴을 구현할 필요 없이 스프링이 관리해줍니다.

### 스프링 싱글톤의 특징

1. **스프링 컨테이너가 싱글톤을 관리**
   * 스프링 컨테이너는 빈을 생성하고 관리하는 역할
   * 기본적으로 모든 빈은 싱글톤으로 생성됨
2. **스프링의 싱글톤은 스레드 안전**
   * 스프링은 빈의 생명주기를 관리하며 스레드 안전성 보장
   * 동시성 문제를 자동으로 처리
3. **설정 변경이 용이**
   * `@Scope("singleton")` 또는 `@Scope("prototype")`으로 스코프 변경 가능
   * 기본값은 singleton

### 예시 코드

```java
@Service
public class UserService {
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
```

위 코드에서 `UserService`는 스프링 컨테이너에 의해 싱글톤으로 관리됩니다.

## 스프링 싱글톤의 장점

1. **자동 관리**
   * 개발자가 직접 싱글톤 패턴을 구현할 필요 없음
   * 스프링이 자동으로 인스턴스 관리
2. **테스트 용이성**
   * 스프링의 DI를 통해 테스트 시 모의 객체 주입 가능
   * 테스트 격리가 용이
3. **유연한 설정**
   * 필요에 따라 스코프 변경 가능
   * 다양한 빈 설정 옵션 제공

## 주의사항

1. **상태 관리**
   * 싱글톤 빈은 상태를 가질 경우 주의 필요
   * 상태가 없는 무상태(stateless)로 설계하는 것이 좋음
2. **의존성 주입**
   * 생성자 주입을 권장
   * 순환 참조 주의
3. **리소스 관리**
   * 공유 리소스 사용 시 동시성 처리 필요
   * 적절한 락킹 메커니즘 사용
