[Spring] 빈 스코프
2025. 2. 21. 06:32ㆍ코딩 도구/백엔드 개발 (Backend Development)
반응형
스프링 빈 스코프
김영한님의 "스프링 핵심 원리 - 기본편"을 수강하고 정리했습니다.
1. 빈 스코프란?
스프링 빈은 기본적으로 싱글톤(Singleton) 스코프를 가진다. 하지만 특정 요구사항에 따라 다양한 스코프를 지정할 수 있으며, 이 기능을 활용하면 애플리케이션의 유연성이 증가한다.
2. 주요 빈 스코프 종류
1) 싱글톤(Singleton) 스코프 (기본값)
- 스프링 컨테이너가 시작될 때 생성되고, 컨테이너 종료 시까지 유지
- 모든 요청에서 동일한 인스턴스 공유
- 대부분의 스프링 빈이 기본적으로 싱글톤으로 동작
@Component
public class SingletonBean {
public SingletonBean() {
System.out.println("싱글톤 빈 생성됨");
}
}
2) 프로토타입(Prototype) 스코프
- 빈이 요청될 때마다 새로운 인스턴스가 생성됨
- 스프링 컨테이너가 관리하는 것이 아니라, 요청한 클라이언트가 직접 관리해야 함
- 자주 변경되는 데이터를 저장하는 객체에 적합
@Scope("prototype")
@Component
public class PrototypeBean {
public PrototypeBean() {
System.out.println("프로토타입 빈 생성됨");
}
}
사용 예:
@Autowired
private PrototypeBean prototypeBean1;
@Autowired
private PrototypeBean prototypeBean2;
System.out.println(prototypeBean1 == prototypeBean2); // false
3) 웹 관련 스코프
웹 애플리케이션에서 사용되는 스코프
- Request 스코프: HTTP 요청이 시작될 때 생성되고, 요청이 끝나면 소멸
- Session 스코프: HTTP 세션이 유지되는 동안 빈이 유지됨
Request 스코프 예제
@Scope("request")
@Component
public class RequestBean {
public RequestBean() {
System.out.println("Request 스코프 빈 생성됨");
}
}
Session 스코프 예제
@Scope("session")
@Component
public class SessionBean {
public SessionBean() {
System.out.println("Session 스코프 빈 생성됨");
}
}
3. 프로토타입 빈과 싱글톤 빈을 함께 사용할 때의 문제
싱글톤 빈이 프로토타입 빈을 의존성으로 가질 경우, 프로토타입 빈이 처음 한 번만 생성되어 계속 재사용되는 문제가 발생할 수 있다.
문제 발생 예제
@Component
@Scope("prototype")
public class PrototypeService {
public void doSomething() {
System.out.println("프로토타입 빈 동작");
}
}
@Component
public class SingletonService {
private final PrototypeService prototypeService;
@Autowired
public SingletonService(PrototypeService prototypeService) {
this.prototypeService = prototypeService;
}
}
위 코드에서는 SingletonService가 생성될 때 PrototypeService가 주입되므로, 이후에는 같은 인스턴스를 계속 사용하게 된다.
해결 방법: ObjectProvider 사용
@Component
public class SingletonService {
private final ObjectProvider<PrototypeService> prototypeServiceProvider;
@Autowired
public SingletonService(ObjectProvider<PrototypeService> prototypeServiceProvider) {
this.prototypeServiceProvider = prototypeServiceProvider;
}
public void execute() {
PrototypeService prototypeService = prototypeServiceProvider.getObject();
prototypeService.doSomething();
}
}
이렇게 하면 매번 새로운 프로토타입 빈이 생성되어 사용된다.
4. 실무에서 중요한 내용
1) 웹 애플리케이션에서 request 스코프 활용법 익히기
- 사용자마다 고유한 데이터를 저장할 때 유용함 (ex. 로그인 정보, 요청별 설정값)
- 요청이 끝나면 자동으로 소멸되므로 메모리 관리가 효율적
2) 프로토타입 빈과 싱글톤 빈을 함께 사용할 때의 문제 해결법 이해
- 싱글톤 빈이 프로토타입 빈을 의존할 경우 주의해야 함
- ObjectProvider, ProxyMode 등을 활용하여 매번 새로운 인스턴스를 주입할 수 있도록 설정
5. 결론
빈 스코프를 적절히 활용하면 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있다. 기본적으로는 싱글톤을 사용하지만, 필요에 따라 프로토타입, request, session 스코프를 적절히 적용하는 것이 중요하다.
반응형
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
[Spring] 빈 생명주기 콜백 (0) | 2025.02.19 |
---|---|
[Spring] 의존관계 자동 주입 (0) | 2025.02.18 |
[Spring] 컴포넌트 스캔(Component Scan) (0) | 2025.02.17 |
[Spring] 스프링 싱글톤 컨테이너 (0) | 2025.02.16 |
[Spring] 스프링 컨테이너와 스프링 빈 (0) | 2025.02.15 |