본문 바로가기
프로그래밍/spring

Spring 컨테이너에 등록된 빈(Bean)은 싱글톤 스코프이다

by freeelifee 2025. 4. 9.
728x90

Spring 컨테이너에 빈(Bean)이 등록되면, 기본적으로 싱글톤(Singleton) 스코프로 동작합니다.
즉, 애플리케이션 컨텍스트에서 해당 빈의 인스턴스는 하나만 생성되고, 컨테이너 전체에서 재사용됩니다.


### 싱글톤 스코프란?
1. 기본 동작: 
   - `@Component`, `@Service`, `@Repository`, `@Controller` 또는 `@Bean`으로 등록된 모든 빈은 기본적으로 `singleton` 스코프를 따릅니다.
   - 싱글톤 스코프는 컨테이너 내에서 하나의 인스턴스만 생성하고, 해당 객체를 컨테이너에서 공유합니다.

2. 특징:
   - 동일한 빈을 여러 곳에서 의존성 주입(Dependency Injection)할 때, 동일한 인스턴스가 주입됩니다.
   - 메모리 사용 효율이 좋으며, 인스턴스가 하나이기 때문에 설정이나 초기화 로직을 한 번만 수행합니다.


### 싱글톤이 아닌 경우
Spring에서는 빈의 스코프를 변경할 수 있으며, 싱글톤이 아닌 빈을 생성하려면 다른 스코프를 명시적으로 설정해야 합니다.

#### 스코프 종류
- prototype: 요청할 때마다 새로운 객체 생성.
- request: HTTP 요청마다 새로운 객체 생성 (웹 애플리케이션에서만 사용 가능).
- session: HTTP 세션마다 하나의 객체 생성.
- application: ServletContext 별로 하나의 객체 생성.

#### 예제: 프로토타입 스코프 설정

@Component
@Scope("prototype") // 요청마다 새로운 인스턴스 생성
public class PrototypeBean {
    public PrototypeBean() {
        System.out.println("Prototype Bean 생성");
    }
}

### 싱글톤 스코프의 주의점
싱글톤 빈이 기본 동작이지만, 상태를 관리하는 데에는 주의가 필요합니다:
1. 상태 유지 문제:
   - 싱글톤 빈은 애플리케이션 전체에서 공유되기 때문에, 내부에 상태를 저장(예: 필드 값 변경)하면 동시성 문제가 발생할 수 있습니다.
   - 따라서 싱글톤 빈은 무상태(stateless)로 설계하는 것이 권장됩니다.

2. 동시성 문제 해결:
   - 상태가 필요하다면, 요청 스코프나 프로토타입 스코프를 사용하거나, 쓰레드 로컬(ThreadLocal) 등을 활용하여 각각의 요청마다 상태를 관리하는 방식이 필요합니다.


### 결론
- Spring에서 빈이 컨테이너에 등록되면 기본적으로 싱글톤 스코프로 동작합니다.
- 특정 상황에서 스코프를 변경해야 한다면, `@Scope`를 명시적으로 설정해야 합니다.

728x90