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`를 명시적으로 설정해야 합니다.
'프로그래밍 > spring' 카테고리의 다른 글
JPA 정리 (0) | 2025.03.27 |
---|---|
SpringBoot 프로젝트 생성하기 (0) | 2023.07.21 |
Springboot에서 jsp 설정하기 (0) | 2023.07.04 |
프로세스 중단 방법 (0) | 2023.05.17 |
[ 스프링부트 ] @Alias 어노테이션(type-aliases-package 설정) 사용해서 xml파일에 패키지명을 명시하지 않고 bean 사용하기 (0) | 2023.02.18 |