Spring을 공부하다 보면 'Spring 컨테이너', 'Spring 컨텍스트', 'IoC 컨테이너' 등 다양한 용어들이 쏟아져 나와 헷갈릴 때가 많습니다. 오늘은 이 용어들의 개념을 명확히 잡고, 실제 코드에서 어떻게 작동하는지 알아보겠습니다.
한마디로 정의하자면, Spring 컨테이너는 Spring Bean(객체)들의 생명 주기를 관리하는 관리자입니다.
우리가 애플리케이션을 만들 때 작성하는 것들은 크게 두 가지입니다.
HelloWorldConfiguration)이 두 가지를 Spring 컨테이너라는 시스템에 '입력(Input)'으로 넣어주면, 컨테이너는 이를 바탕으로 '준비된 시스템(Ready System)'을 '출력(Output)'으로 만들어냅니다.
즉, JVM(자바 가상 머신) 내부에서 우리가 설정한 모든 Bean 객체들을 생성하고, 관리하고, 대기시키는 공간이 바로 Spring 컨텍스트(컨테이너)입니다.
Spring을 배우면서 가장 헷갈리는 부분이 용어입니다. 하지만 걱정하지 마세요. 다음 용어들은 문맥에 따라 거의 동일한 의미로 사용됩니다.
여기서 IoC는 '제어의 역전(Inversion of Control)'을 의미하는데, 자세한 내용은 나중에 다루겠지만, 핵심은 "개발자가 직접 객체를 생성하는 게 아니라, Spring(컨테이너)이 객체를 생성하고 관리해준다"는 뜻입니다.
Spring 컨테이너에 대해 이야기할 때, 크게 두 가지 유형의 컨테이너를 구분해서 알아둘 필요가 있습니다.
BeanFactory에 엔터프라이즈 전용 기능을 더한 고급 컨테이너입니다. 대규모 서비스(엔터프라이즈)를 운영할 때 반드시 필요한 수많은 편리한 기능이 포함되어 있습니다. 코드에서도 ApplicationContext를 사용하여 컨테이너를 실행합니다.
public static void main(String[] args) {
// 1: Spring 컨텍스트(컨테이너) 실행
// AnnotationConfigApplicationContext는 ApplicationContext의 구현체 중 하나입니다.
var context =
new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
// 2: 이후 Spring이 관리하는 객체(Bean)들을 가져와서 사용
// ...
}
위 코드의 AnnotationConfigApplicationContext가 바로 우리가 앞서 말한 Application Context(고급 컨테이너)입니다. 실무에서 웹 서비스나 REST API를 만들 때는 무조건 이 방식을 권장합니다.
Bean Factory(기본형)와 Application Context(고급형)가 있습니다.Application Context를 주로 사용합니다.