STS IoC컨테이너
IoC컨테이너
IoC는 Inversion of Control의 약자로 프레임워크의 핵심 요소입니다. IoC는 해석하면 제어의 역전 또는 제어의 반전이며 이것은 메소드나 객체의 호출작업이 개발자에 의해 결정되는 것이 아닌 외부(스프링)에서 결정되는 것을 의미합니다.
또한 스프링 프레임워크를 이해하는 데 가중 중요한 개념이 바로 컨테이너 입니다. 컨테이너의 개념은 스프링에서 처음 사용된 것은 아니며, 기존의 서블릿이나 EJB 기술에서 이미 사용해왔습니다.
그리고 대부분 컨테이너는 비슷한 구조와 동작 방식을 가지고 있으므로 서블릿 컨테이너를 통해 스프링 컨테이너의 동작 방식을 가지고 있으므로 서블릿 컨테이너를 통해 스프링 컨테이너의 동작 방식을 유추해볼 수 있습니다.
간단한 서블릿 클래스를 만들어보겠습니다.
package com.springbook.biz;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
public HelloServlet() {
System.out.println("===> HelloServlet 객체 생성");
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() 메서드 호출");
}
}
이클립스를 이용하여 서블릿 클래스를 개발한다면 작성된 Servlet 클래스는 web.xml 파일에 자동으로 등록됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>hello.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
</web-app>
이 설정은 브라우저에서 /hello.do라는 URL 요청을 전송하면, hello라는 이름으로 등록된 hello.HelloServlet 클래스를 찾아 객체를 생성하고 실행한다는 설정입니다. 이제 작성된 HelloServlet 프로그램을 실행하면 다음과 같은 메시지가 출력되며, web.xlm 설정대로 객체가 생성되고 실행되는 것을 확인 가능합니다.
서블릿은 자바로 만들어진 클래스입니다. 따라 반드시 객체 생성을 해야 객체가 가지고 있는 메서드도 호출할 수 있ㅅ브니다.
그런데 작성된 소스 어디를 봐도 객체 생성 코드를 볼 수 없으며, doGet() 메서드 호출 역시 확인할 수 없습니다. 그렇다면 도대체 누가 서블릿 객체를 생성했으며, doGet() 메서드를 호출해줬을까요
답은 서블릿 컨테이너입니다.
서블릿 컨테이너의 동작 순서
- WEB-INF/web.xml 파일을 로딩하여 구동
- 브라우저로부터 /hello.do 요청 수신
- hello.HelloServlet 클래스를 찾아 객체를 생성하고 doGet() 메서드 호출
- doGet() 메서드 실행 결과를 클라이언트 브라우저에 전송