새발블로그

[Spring] Spring Container 스프링 컨테이너 본문

Server/Spring

[Spring] Spring Container 스프링 컨테이너

EUG 2025. 7. 6. 16:44

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