thumbnail thumbnail

2024-03-31 IoC 컨테이너 (토비의 스프링)

포스트

글을 열며..

 

이전의 글에서는 spring application 의 IoC & DI 가 어떠한 일이며 bean 등록과 과정, scope 에 대해 학습하였다. 이제 Spring FrameWork 의 중요한 부분 중 하나인 Spring 컨테이너 에 대해 학습하고자 한다.

다시 한번 spring 이 무엇인지 되새겨 보자.

  • Spring 이란 ?? : 자바 엔터프라이즈 Application 개발에 사용 하는 프레임 워크이다.

  • 목적 : Application 개발의 생산성을 증가 시키고, 빠르게 빌드 할 수 있게 해주며, 코드 구성을 효율적으로 이끌어주는데 목적을 가진다.

 

Spring 컨테이너 ??

 

spring 컨테이너란 applicationContext 라고 도 불리며 spring runtime 엔진을 제공하는 인터페이스이다. 독자적으로 구동이 가능하며 일반적으로 사용되는 모듈이 존재하는데 web module service 와 서블릿 이다.

 


공통 프로그래밍 모델

 

어떠한 방식으로 프로그래밍을 작성해야 하는지 제시해주는 지표이다. 보통 IoC/DI ,추상화, AOP 등 3가지의 방법이 존재하며 이에 관해서 하나하나 설명토록 하겠다.

  1. 1

    IoC/DI : 오브젝트 생명주기와 의존관계에 대한 프로그래밍 모델이다. 유연함과 확장성 있는 코드를 작성하도록 도움을 주는데 사용되는 프로그래밍 모델이자 spring 의 핵심 모델이다.

  1. 2

    추상화 : 서비스를 추상화 함으로서 환경, 서버, 종속성으로 부터 자유로워지고 코드 이식성에 뛰어나다.

  1. 3

    AOP : 코드 안의 기능을 독립적으로 모듈화 하는 프로그래밍 모델로서 코드 가독성을 증가 시키는 장점을 가지나 동시에 불안정성 또한 부여되는 리스크를 지고 있어 세밀한 컨트롤과 지식이 요구되는 프로그래밍 모델이다.

 


IoC 컨테이너와 DI

 

스프링에서는 IoC 를 담당하는 컨테이너를 BeanFactory 또는 ApplicationContext 라고 한다. 다만 다른 점이라고 한다면 DI 를 위한 BeanFactory 에 엔터프라이즈 어플리케이션을 개발하는데 필요한 여러가지 컨테이너 기능을 추가 한 것이 “ApplicationContext” 이다. ApplicationContext 는 그 자체로 IoC/DI 를 위한 BeanFactory 이면서 그 이상의 기능을 수행한다고 보면 될 것이다.

 

IoC 컨테이너의 종류

 

총 4개의 컨테이너 구성으로 갖추어진 IoC 컨테이너는 4 가지 이다.

  1. 1

    StaticApplicationContext

  1. 2

    GenericApplicationContext

  1. 3

    GenericXmlApplicationContext

  1. 4

    WebApplicationContext

 

<StaticApplicationContext>

StaticApplicationContext 는 코드를 통해 Bean 메타 정보를 등록하기 위해 사용된다. Spring 의 기능에 대한 학습 테스트 외에 실제로 사용되는 경우는 적다. 하지만 포맷, 리소스의 종류 등 순수한 메타정보를 사용한다는 것을 보여주기에 학습에는 유용한 ApplicationContext 이다.

 

<GenericApplicationContext>

GenericApplicationContext 는 StaticApplicationContext 와 달리 XML 파일과 같은 외부의 리소스에 있는 Bean 설정 메타 정보를 리더를 통해 읽어 들여 사용한다. 특정 포맷의 Bean 설정 메타 정보를 읽어낸 후 ApplicationContext 가 사용할 수 있는 BeanDefinition 정보로 구현하는 BeanDefinitionReader 인터페이스를 구현하고 사용한다. XMLBeanDefinitionReader 로 읽어내고 컨테이너에 전달한다.

Xml
<?xml version="1.0" , encoding="utf-8"> <beans> <bean class="ddd" id="1111" property="aaa"/> <bean class="fff" id="2222" property="bbb"/> </beans>

 

<GenericXmlApplicationContext>

코드에서 GenericApplicationContext 에서 XmlBeanDefinitionReader 를 만드는 것은 조금 귀찮게 느껴질 수도 있다. 이것의 해소법이 위의 두개를 합친 GenericXmlApplicationContext 이다. reader 로 XML 파일을 읽어 들이고 refresh() 를 통해 초기화 하는 움직임 까지 한 줄의 코드로 컨트롤 할 수 있다.

Java
GenericApplicationContext ac = new GenericXmlApplicationContext( "springbook/learningtest/spring/ioc/genericApplicationContext.xml" );

 

<WebApplicationContext>

가장 많이 사용되는 ApplicationContext 는 WebApplicationContext 이다. ApplicationContext 를 확장한 인터페이스 이므로 WebApplicationContext 를 구현한 Class 를 사용하게 되는 셈이다. 이름으로 부터 예상할 수 있듯 웹 환경에서 사용 할 때 필요한 기능이 추가된 것으로 , 스프링 app 의 대부분이 서블릿 기반의 War 로 만들어지기 때문이다. 물론 그 중에서도 가장 중요한 기능은 Xml 파일을 사용하도록 만든 XmlWebApplicationContext 이다. 위의 컨텍스트를 이용하려면 스프링의 IoC 컨테이너의 기동 방법에 대해 알아보아야 한다. 만약 app 을 실행 시킬 시 컨테이너는 Bean 을 검색 할 수 있지만 특정 Bean 의 오브젝트의 메소드를 적어도 한번 호출해주어야 App 이 해당 기능을 동작하여 준다.

Java
ApplicationContext ac = new ApplicationContext(); Command command = ac.getBean("AddCommandTask", Command.class); command.print();

 

위의 코드 처럼 getBean() 으로 컨테이너에 가져올 경우 이 후 부터는 getBean() 메소드를 사용해 Bean 을 가져올 필요가 없다. 즉 IoC 컨테이너의 역할은 초기에 Bean Object를 생성, DI 한 후 최초로 App 을 기동할 Bean 한가지를 제공해 주는 것 까지 이다. 다만 위의 상황은 독립형 App 에서 일어나는 일이지만 Web App 에서는 동작 방식이 완전히 달라진다.

 

Web 과 독립 App

 

독립 java 프로그램은 java VM (JVM) 에게 main() 메소드를 가진 클래스를 시작해 달라고 요청할 수 있으나 Web 애서는 main() 메소드를 호출 할 수 있는 방법이 없다. 이용하는 유저도 다수이며 동시에 App 를 이용하는 유저가 다발적으로 발생하는 환경에 노출 된다. 그래서 Web 의 환경에서는 main() 메소드 대신 서블릿 컨테이너가 브라우저로 부터 오는 HTTP 요청을 받아서 해당 요청에 매핑된 서블릿을 실행 시켜 주는 방식으로 동작한다.

 

Web 환경에서 SpringApp 를 기동하는 방법

 

우선 main() 메소드 역할을 하는 서블릿을 만들어 주고 , 미리 ApplicationContext 를 생성해둔 다음, 요청이 서블릿으로 들어올 때 마다 getBean() 으로 필요한 Bean 을 가져와 메소드를 실행 시켜주면 된다.

스프링은 위의 서블릿을 DispatcherServlet 이라는 것으로 제공한다. 스프링이 제공해준 Web.xml 에 등록해주기만 한다면 Web 의 환경에서 스프링 컨테이너가 만들어진다.