새발블로그
[Spring] Spring Container 스프링 컨테이너 본문
1. Spring Container란?
Spring Container는 스프링 프레임워크의 핵심 구성 요소이다.
- 객체(Bean)의 생성 및 관리
- 객체 간의 의존성 주입(DI)
- 객체의 생명주기 관리
- 설정 및 구성 정보 로딩
이러한 기능을 통해 애플리케이션 전반의 객체를 스프링이 대신 관리하므로, 개발자는 비즈니스 로직에 집중할 수 있다.
2. Spring Container가 없을 때 발생하는 문제
| 문제점 | 설명 |
| 직접 객체 생성 | new로 객체 생성 → 클래스 간 강한 결합 발생 |
| 수정 어려움 | 구현체 바꾸려면 코드 수정 + 재컴파일 |
| 싱글톤 보장 어려움 | 객체가 매번 새로 생성되어 상태 공유 안 됨 |
| 의존성 주입 어려움 | 수동 DI나 Reflection 사용은 번거롭고 에러 유발 |
예시 코드 (Spring 없이 직접 DI) (비권장..)
class Service {
private DAO dao = new DAOMySQL(); // 강한 결합
}
개선 시도 (Reflection 기반)
Properties prop = new Properties();
prop.load(Controller.class.getResourceAsStream("/command.properties"));
for (String key : prop.stringPropertyNames()) {
String className = prop.getProperty(key);
Class<?> clazz = Class.forName(className);
Command command = (Command) clazz.getDeclaredConstructor().newInstance();
// service 등을 어떻게 주입할 것인가?...
commandMap.put(key, command);
}
복잡한 작업을 스프링 컨테이너가 자동으로 해결해줌.
3. Spring Container 기능
| 기능 | 설명 |
| Bean 관리 | 객체를 생성하고 등록된 이름으로 관리 |
| 의존성 주입(DI) | 필요한 객체를 자동 주입 |
| 스코프 관리 | singleton, prototype 등 범위 제어 |
| 생명주기 관리 | 초기화/소멸 콜백 지원 (@PostConstruct, @PreDestroy) |
| 설정 지원 | @Configuration, application.properties, @Profile 등 |
| AOP 지원 | 트랜잭션, 로깅 등 공통 로직 분리 |
| 리소스 로딩 | 파일 시스템, 클래스패스 등에서 자원 로딩 |
| 이벤트 & 국제화 | 메시지 처리 및 ApplicationEvent 지원 |
4. 주요 컨테이너 구현체
| 컨테이너 종류 | 설명 |
| BeanFactory | 가장 단순한 컨테이너, 지연 로딩, 실무에서는 거의 사용 안 함 |
| ApplicationContext | 가장 일반적인 IoC 컨테이너, 국제화, AOP, 이벤트, DI 지원 |
| WebApplicationContext | 웹 환경(Spring MVC)용, request, session 스코프 추가 지원 |
5. 컨테이너 생성 예시
XML 기반 설정
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Java Config 기반 설정
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);
6. Spring Container의 핵심 철학: IoC (제어의 역전)
객체의 생성과 의존성 연결을 개발자가 하지 않고,컨테이너(스프링)가 대신 제어한다는 개념
전통 방식:
A a = new A(); // 개발자가 생성
스프링 방식:
@Autowired
A a; // 스프링이 생성해서 주입
'Server > Spring' 카테고리의 다른 글
| [Spring] Component Scan (컴포넌트 스캔) (0) | 2025.07.08 |
|---|---|
| [Spring] Bean 등록 방식 (수동 vs 자동) (0) | 2025.07.08 |
| [Spring] FrontController (0) | 2025.07.06 |
| [Spring] 요청 포워딩 (1) | 2025.07.06 |
| [Spring] 필터 (0) | 2025.07.06 |