1. ApplicationContext란?
- Spring에서 Bean을 생성하고 관리하는 컨테이너
- 개발자가 직접 객체를 생성(new)하는 대신, Spring이 대신 생성하고 관리
역할
- Spring Bean(객체) 등록
- Spring Bean 사용 관리
- 의존성 주입(DI, Dependency Injection) 제공
2. Spring Bean이란?
- Spring이 관리하는 객체
- 개발자가 직접
new 키워드로 생성하는 게 아니라, Spring이 대신 객체를 생성하고 관리
Spring Bean의 특징
- Spring이 관리하는 객체(Bean)는 기본적으로 싱글톤(Singleton)으로 관리
- 싱글톤이란?
- 하나의 객체만 생성하여 애플리케이션 전역에서 공유하는 방식
- 동일한 Bean을 여러 번 요청해도, 같은 객체를 반환함
- 반복적인 객체 생성을 막아 성능을 향상시키는 효과
3. 싱글톤(Singleton) 패턴과 Spring Bean 관리
Spring에서 Bean을 싱글톤으로 관리하는 이유
-
대규모 시스템의 성능 최적화
- 서버는 초당 수십 ~ 수백 번의 요청을 처리해야 함
- 요청마다 객체를 새로 만들면 메모리 낭비 + 성능 저하
- 싱글톤 객체로 공유하면 메모리 사용량 절약 가능
-
Spring MVC 구조 특성상 계층 구조를 가짐
- 데이터 액세스, 서비스, 컨트롤러 등 다양한 계층에서 동일한 객체 사용
- 매 요청마다 객체를 새로 만들지 않고, 하나의 객체를 공유하면 성능 향상
-
Spring 컨테이너(ApplicationContext)가 싱글톤을 직접 관리
- 기존의 Java 싱글톤 패턴의 한계를 보완
- Spring이 직접 객체 생성을 관리하여 테스트 용이, 확장성 증가
4. Spring에서 싱글톤 관리 방식
Java 싱글톤 패턴의 문제점
- private 생성자로 인해 상속 불가능, 불편한 테스트
- 클래스 로더에 따라 싱글톤 유지가 어려움
- 예: 하나의 애플리케이션에 여러 개의 클래스 로더가 있을 경우, 싱글톤이 깨질 수 있음
Spring이 해결한 방식
- Spring 컨테이너(ApplicationContext)가 직접 싱글톤 관리
- DI(Dependency Injection)를 사용하여 싱글톤 객체를 주입
- 필요할 때 객체를 생성하고, 이후 같은 객체를 재사용
5. Spring Bean Scope (라이프사이클)
Scope란?
- Spring Bean이 생성되고 사용되는 범위를 설정하는 개념
- 기본적으로 Spring Bean은 싱글톤(Singleton)으로 관리됨
- 하지만 특정한 상황에서는 다른 Scope를 설정할 수도 있음
주요 스코프 5가지
| Scope | 설명 | 사용 예시 |
|---|
| Singleton (기본) | 애플리케이션 시작 시 한 번만 생성되어 모든 요청에서 공유 | @Service, @Repository 등의 기본 Bean |
| Prototype | 매번 새로운 객체 생성 | 특정 서비스 로직에서 Bean을 매번 새로 만들어야 할 때 |
| Request | HTTP 요청마다 새로운 객체 생성 (요청 끝나면 소멸) | 웹 요청마다 다른 객체를 유지할 때 |
| Session | HTTP 세션마다 하나의 객체 유지 | 사용자 로그인 세션 유지 |
| Application | 애플리케이션 전역에서 하나만 유지 | 설정 정보 저장 |
Spring Bean 주요 스코프 5가지 코드 예제
Singleton (기본값)
@Component
public class SingletonBean {
}
✔ Spring이 자동으로 싱글톤으로 관리
✔ 모든 요청에서 같은 객체 사용
Prototype (매번 새 객체 생성)
@Component
@Scope("prototype")
public class PrototypeBean {
}
Request (HTTP 요청마다 새로운 객체 생성)
@Component
@RequestScope
public class RequestBean {
}
- HTTP 요청이 들어오면 새 객체 생성, 응답이 끝나면 소멸
- 사용 예시: 사용자마다 다른 데이터를 유지해야 할 때
Session (사용자 세션마다 하나의 객체 유지)
@Component
@SessionScope
public class SessionBean {
}
- 같은 사용자 세션에서는 같은 객체 사용
- 사용 예시: 로그인한 사용자 정보 유지