🍃 Spring

스프링 컨테이너의 구조

보배 진 2026. 1. 15. 10:30

🐌 스프링 컨테이너

객체(Bean)를 대신 생성/관리/주입해주는 관리자

기존 자바 BoardService service = new BoardServiceImpl();
스프링 BoardService = context.getBean("bs");

객체 생성 책임을 개발자 ➡ 스프링에게 넘김

이것을 IoC (제어의 역전) 라고 함

 


스프링 컨테이너의 전체 구조 

[ ApplicationContext ]
        |
        ├─ BeanFactory
        ├─ BeanDefinition
        ├─ Bean Registry
        ├─ DI Engine
        └─ LifeCycle Manager

 

🐌 BeanFactory (최상위 컨테이너)

역할 : Bean 생성. Bean 조회(getBean())

특징 : 최소 기능만 제공, 지연 로딩

실무에서는 거의 직접 사용 안하고 ApplicationContext가 이를 확장함

 

 

🐌 ApplicationContext (실제 사용하는 컨테이너)

역할 : BeanFactory 기능, 이벤트 처리, 메시지 처리, AOP 지원, 국제화(i18n)

클래스 설명
GenericXmlApplicationContext XML 기반
AnnotationConfigApplicationContext 애노테이션 기반
WebApplicationContext 웹 환경

구현체 예시 🔼

 

 

🐌 BeanDefinition (설계도)

Bean 하나의 메타정보

포함 정보 : 클래스 이름, Bean 이름(id), scope, 의존성 정보

XML / 어노테이션을 읽어서 생성됨

 

 

🐌 Bean Registry (보관소)

BeanDefinition & Bean 저장소

Map<String, Object> beans

key : Bean 이름

value : Bean 객체



 

🐌 DI 엔진 (의존성 주입 과정)

@Service
public class BoardServiceImpl {
	@Autowired
	private BoardDAO dao;
}

1) @Service 발견
스프링이 클래스 스캔 중 @Service를 발견
→ Bean 등록 대상임을 인식

2) BoardServiceImpl 객체 생성
스프링 컨테이너가 new BoardServiceImpl() 수행
(개발자가 new 하지 않음)

3) @Autowired 발견
생성된 객체의 필드를 검사하다 @Autowired 발견
→ 의존성 주입 대상 필드로 판단

4) 타입(BoardDAO) 탐색
컨테이너에서 BoardDAO 타입의 Bean 검색
(@Repository, @Component 등으로 등록된 Bean)

5) Bean 주입
찾은 BoardDAO Bean을 dao 필드에 주입
(리플렉션을 사용하여 private 필드에도 주입)

📌 이 모든 과정은 스프링 컨테이너가 자동으로 처리함

 

🐌 Bean 생명주기 (LifeCycle)

생성 ➡ 의존성 주입 ➡ 초기화 ➡ 사용 ➡ 소멸

관련 메서드 : @PostConstruct, @PreDestroy

 

 

정리 : 스프링 컨테이너는 Bean의 생성, 연결, 생명주기를 관리하는 객체 공장이다

  • IoC: 객체 생성 제어를 스프링이 담당
  • DI: 필요한 객체를 자동으로 주입
  • Bean: 컨테이너가 관리하는 객체
  • ApplicationContext: 스프링 컨테이너의 실체