컨테이너(Container)란?
꼭 스프링(Spring)뿐만이 아니더라도 소프트웨어 분야에서는 컨테이너(Container)라는 용어가 자주 등장한다.
물건을 해외로 보낼 때 항구에서 화물을 적재하기 위한 공간을 컨테이너라고 하듯이, 컨테이너라는 것은 결국 '무언가를 담는 공간'을 의미한다.(매번 그렇지만 다양한 맥락에서 사용되는 단어들은 무언가 되게 추상적으로 느껴진다😑)
그리고 서버에서 동작하는 거의 대부분의 기술은 컨테이너 위에서 오브젝트를 만들어 놓고 필요에 따라 그 오브젝트를 제공받아 사용하는 방식으로 유지된다. Spring에서 몇 가지 예를 들자면, DispatcherServlet 그리고 DB와의 Connection을 연결해 주는 DataSource 등이 있겠다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
위 코드는 스프링 개발자라면 한 번씩은 들어봤을 DispatcherServlet이라는 오브젝트를 XML Config로 등록하는 부분이다. Web과 관련된 기술을 사용할 때 톰캣(Tomcat)과 같은 서블릿(Servlet) 기술을 이용하는데, 외부에서 요청이 들어오면 서블릿 컨테이너(Servlet Container)는 내부적으로 클라이언트 요청을 처리하기 위해 미리 등록해둔 이 Servlet 오브젝트를 꺼내와서 사용하게 하는 방식으로 동작한다.
스프링 컨테이너(Spring Container)란?
서블릿(Servlet)이라는 이름의 오브젝트가 서블릿 컨테이너(Servlet Container)에서 관리되듯이, 빈(Bean)이라는 이름으로 불리는 오브젝트의 생명주기를 관리하는 것이 스프링 컨테이너(Spring Container)이다. Spring Container 란 스프링이라는 기술 자체와 스프링과 연관된 수많은 기술을 통틀어 가장 핵심에 있으면서 모든 것의 기반이 되는 스프링의 기능이다. 그래서 Spring Container를 Spring이라고도 부르는 것이다.
다시 말해, 이 컨테이너라는 것은 내부에서 오브젝트를 관리하기 위한 것이며, 따라서 Spring Container 또한 '구성 정보'를 필요로 한다. 이때 구성 정보라는 것은 "어떤 클래스의 오브젝트를 만들고 어떻게 연결할 것인가?"에 대한 정보를 의미한다.
즉, 우리는 크게 아래 2가지 정보를 Spring에게 알려줘야 한다.
1) 어떤 클래스를 런타임에 동작하는 오브젝트로 등록할 것인가?
2) 런타임에 각 빈들의 의존관계를 어떻게 맺을 것인가?
코드로 보는 스프링 컨테이너
공식 문서를 보면 BeanFactory 인터페이스가 모든 유형의 객체를 관리할 수 있는 Spring Framework의 IoC Container의 기초라고 설명돼있다. (ApplicationContext는 BeanFactory의 기능을 확장한 인터페이스로 더 많은 기능을 제공)
public static void main(String[] args) {
// 구성 정보를 담은 Config.class 내부에 Something 팩토리 매소드 존재
BeanFactory beanFactory = new AnnotationConfigApplicationContext(Config.class);
// 컨테이너로부터 Something 오브젝트를 제공받음
Something service = (Something) beanFactory.getBean(Something.class);
}
위 코드는 실제 컨테이너의 단순한 사용 예제이다. 즉, Spring Framework의 핵심인 Spring Container 또한 하나의 오브젝트로 존재한다는 것을 알 수 있다. 이 팩토리는 한번 오브젝트를 생성해서 리턴해주고 끝나는 게 아니라 계속 담아두는 공간이면서, 만들어진 오브젝트 사이에 관계 설정까지 해주는 Dependency Injection이 일어나는 컨테이너이다.
스프링에는 Web도 있고 Security도 있고 여러 가지 기술(최근에는 Spring AI까지 나옴..👀)이 많지만, 극단적으로 말하면 아주 많이 활용되는 대표적인 케이스들을 모아 스프링이 우리가 개발해야 될 클래스들을 미리 만들어서 제공해 준 것에 불과한 것이다. 이게 없다고 하더라도 스프링이 기본적으로 제공해 주는 이 빈팩토리(BeanFactory)를 이용하면 객체지향 설계 원칙이 잘 적용된 애플리케이션을 만들어낼 수 있게 되는 것이다. 스프링의 가장 핵심적인 정체성은 Spring Container이다.
'Spring' 카테고리의 다른 글
IoC/DI란? 그리고 Spring이 적용하는 OCP(개방 폐쇄 원칙) (1) | 2024.09.21 |
---|---|
Servlet Container란? 그리고 Spring과의 관계 (0) | 2024.09.17 |
Bean이란? 그리고 Spring의 싱글톤 활용(singleton registry) (2) | 2024.09.01 |
이클립스 Java Build Path와 Deployment Assembly 그리고 target (0) | 2023.05.24 |
EJB와 스프링 개론 (0) | 2021.02.23 |