
스프링 컨테이너
스프링 컨테이너는 IoC를 실현하는 실제 주체라고 생각하면 된다. 쉽게 말해, 프로그램 시작 시 필요한 객체들을 대신 만들어 보관하고, 필요할 때 꺼내서 의존성까지 연결해주는 공장이자 보관소라고 생각하면 된다.
✅ 스프링 컨테이너의 종류
스프링 컨테이너는 크게 2가지로 `BeanFactory`와 `ApplicationContext`가 있다.
1) BeanFactory
기본적인 의존성 주입을 지원하는 가장 간단한 형태의 컨테이너이다.
주요 기능
- BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할
- 기본적인 의존성 주입 지원
특징 : 필요할 때만 빈을 생성하는 지연 로딩 (lazy loading) 전략을 사용한다.
2) ApplicationContext

BeanFactory의 모든 기능을 포함하는 상위 개념
추가 제공 기능
- 국제화
- 애플리케이션 이벤트 발행/구독
- 환경 변수 관리
- AOP, 트랜잭션 등 스프링 핵심 기능과 연계
- 웹 애플리케이션과의 통합
특징 : BeanFactory와 다르게 애플리케이션 시작 시 대부분의 빈을 미리 생성하는 즉시 로딩(eager loading) 전략을 사용한다.
-> 우리가 일반적으로 사용하는 것은 `ApplicationContext` 이다.
빈 (Bean)
빈은 스프링 컨테이너가 관리하는 객체이다. 일반 자바 객체를 new로 만들면 그냥 객체이지만, 스프링 컨테이너에 의해 관리되면 빈이라고 부른다.
✅ 등록 방법
자동 등록 (컴포넌트 스캔)
@Component
public class ProductService { ... }
이렇게 클래스 선언 위에 `@Component` 어노테이션을 붙여 설정하면 스프링 서버가 뜰 때 객체가 생성되고 Spring IoC Bean으로 저장된다. @Service, @Repository, @Controller 어노테이션은 `@Component` 어노테이션을 포함하고 있다.
수동 등록 : `@Configuration` 클래스 안에서 `@Bean` 메서드로 직접 등록한다.
✅ 빈의 생명주기 (Lifecycle)
스프링 컨테이너에서는 단순히 빈을 만들어 주는 것이 아니라, 빈의 전체 생명주기를 컨테이너 차원에서 관리한다.
생명주기 단계
- 생성 (Instantiation) : 컨테이너가 빈 인스턴스를 생성한다.
- 의존성 주입 : 필요한 의존성을 컨테이너가 주입한다.
- 초기화 (Initialization) : 의존성 주입까지 끝난 후, 추가적인 초기화 로직이 실행된다.
- `@PostConstruct` : 빈의 초기화 작업을 수행할 때 사용하는 어노테이션으로 이 어노테이션이 붙은 메서드는 해당 빈이 생성되고 모든 의존성이 주입이 완료된 후 자동으로 호출된다. 이를 통해 빈의 초기화 과정에서 추가적인 설정이나 초기화 작업을 수행할 수 있다.
- 대표적인 예시가 key 값이다. `@Value` 어노테이션을 통해 처음부터 설정해도 괜찮지만, 해당 key값이 db 나 외부 api 호출을 통해 동적으로 결정되거나 실시간으로 바뀔 수 있는 값이라면 `@Value`만으로는 해결하기 어려워 이럴 경우에는 빈이 완전히 초기화된 직후에 해당 key값을 읽어오도록 하면 안전하다.
- 사용 : 애플리케이션 로직에서 빈이 실제로 사용된다.
- 소멸 (Desctruction) : 컨테이너가 종료될 때 빈도 소멸된다.
- `@PreDestroy` : 빈이 소멸되기 직전에 호출되는 메서드를 지정하는 어노테이션이다. 주로 리소스를 정리하거나, 연결을 종료하거나, 애플리케이션 종료 전에 꼭 처리해야하는 작업을 수행할 때 사용한다. 예를 들어, 애플리케이션 종료되기 전에 캐시에 저장된 데이터를 파일이나 데이터베이스에 저장하는 등의 작업을 수행할 수 있다.
✅ 빈의 스코프 (Scope)
스코프는 이름 그대로 범위라는 뜻으로 빈 스코프는 빈이 존재할 수 있는 범위를 의미한다.
기본적으로 스프링 컨테이너에서는 빈이 싱글톤으로 생성되고 관리되고 스프링 컨테이너와 생명주기를 같이하기 때문에 신경 쓸 필요가 없다. 그러나, 빈 스코프를 어떻게 설정하느냐에 따라 스프링 빈의 생성과 소멸을 클라이언트에서 관리해줘야하는 경우가 생길 수 있고 다양한 요구사항에 맞는 스코프를 지정해서 사용할 수 있다.
싱글톤 스코프 (Singleton Scope)

스프링 컨테이너는 기본적으로 싱글톤 스코프를 사용한다. 스프링 컨테이너가 생성될 때 싱글톤 빈을 생성하여 스프링 컨테이너에서 관리를 한다. 빈으로 등록된 객체를 사용하기 위해 스프링 컨테이너에 요청하면, 스프링 컨테이너가 싱글톤으로 관리하는 빈을 반환한다. 싱글톤으로 관리하기 때문에 같은 요청이 여러번 와도 같은 스프링 빈 객체 인스턴스를 반환한다.
프로토타입 스코프 (Prototype Scope)

프로토타입 스코프로 설정된 빈은 스프링 컨테이너가 빈을 생성하고 의존성 주입까지만 관여하고 더 이상 관리하지 않는다. 따라서 빈 반환 후에 @PreDestory 가 호출되지 않고, 필요 시에 클라이언트가 직접 빈을 종료시켜줘야 한다. 프로토타입 스코프로 설정된 빈을 스프링 컨테이너에 요청하면, 이 시점에서 스프링 컨테이너가 빈을 생성하고 의존성을 주입하여 클라이언트에 반환한다. 이후에는 스프링 컨테이너가 관리하지 않고, 같은 요청이 여러 번 올 경우 그때마다 새로운 객체 인스턴스를 생성하여 반환한다.
✅ 빈 스코프 설정 방법
Bean을 등록하는 부분에서 `@Scope` 어노테이션을 사용하여 설정해줄 수 있다. 싱글톤의 경우 `@Scope`를 생략하면 디폴트 싱글톤으로 설정된다.
@Scope("prototype")
@Component
public class PrototypeBean{
//...
}
@Configuration
public class AppConfig{
@Scope("prototype")
@Bean
public PrototypeBean prototypeBean(){
return new PrototypeBean();
}
}
'Spring' 카테고리의 다른 글
| [Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC (0) | 2025.08.05 |
|---|---|
| [Spring] DispatcherServlet과 스프링부트 동작 구조 (3) | 2025.07.26 |
| [Spring] Spring Security의 구조와 흐름 (0) | 2025.07.17 |
| [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰 (0) | 2025.07.16 |
| [Spring] 서블릿(Servlet)과 서블릿 컨테이너 (0) | 2025.07.16 |