스프링 프레임워크를 이해하는 데 가장 중요한 개념이 바로 컨테이너이다. 컨테이너의 개념은 스프링에서 처음 사용된 것은 아니며, 기존의 서블릿이나 EJB 기술에서는 이미 사용해왔다. 그리고 대부분 컨테이너는 비슷한 구조와 동작 방식을 가지고 있으므로 서블릿 컨테이너를 통해 스프링 컨테이너의 동작 방식을 유추해볼 수 있다.
이클립스를 이용하여 서블릿 클래스를 개발한다면 작성된 Servlet 클래스는 web.xml 파일에 자동으로 등록된다.
브라우저에서 /hello.do 와 같은 URL 요청을 전송하면, hello 와 같은 이름으로 등록된 hello.HelloServlet 과 같은 클래스를 찾아 객체를 생성하고 실행한다는 설정이 web.xml에 저장되어 있다.
서블릿은 자바로 만들어진 클래스이다. 따라서 반드시 객체 생성을 해야 객체가 가지고 있는 메소드도 호출할 수 있다.
그런데 작성된 소스 어디를 살펴봐도 객체 생성 코드를 볼 수 없으며, doGet() 메소드 호출 역시 확인할 수 없다. 그렇다면 도대체 누가 서블릿 객체를 생성했으며, doGet() 메소드를 호출해줬을까?
정답은 바로 '서블릿 컨테이너' 이다.
다음은 서블릿 컨테이너가 Servlet 클래스 객체를 생성하고 운용하는 과정을 그림으로 표현했다.
서블릿 컨테이너는 다음 순서에 따라 동작한다.
1) WEB-INF/web.xml 파일을 로딩하여 구동
2) 브라우저로부터 /hello.do 요청 수신
3) hello.HelloServlet 클래스를 찾아 객체를 생성하고 doGet() 메소드 호출
4) doGet() 메소드 실행 결과를 클라이언트 브라우저로 전송
이렇듯 컨테이너는 자신이 관리할 클래스들이 등록된 xml 설정 파일을 로딩하여 구동한다.
그리고 클라이언트의 요청이 들어오는 순간 xml 설정 파일을 참조하여 객체를 생성하고, 객체의 생명주기를 관리한다. 스프링 컨테이너 역시 서블릿 컨테이너와 유사하게 동작하므로 위에서 살펴본 요소들과 비슷한 요소들이 존재한다.
제어의 역행(IoC)는 결합도와 관련된 개념으로 이해할 수 있다. 기존의 자바 기반으로 애플리케이션을 개발할 때, 객체를 생성하고 객체들 사이의 의존관계를 처리하는 것에 대한 책임은 전적으로 개발자에게 있었다. 즉 개발자가 어떤 객체를 생성할지 판단하고 객체 간의 의존관계 역시 소스코드로 표현해야 했다.
하지만 제어의 역행이라는 것은 이런 일련의 작업들을 소스코드로 처리하지 않고 컨테이너로 처리하는 것을 의미한다. 따라서 제어의 역행을 이용하면 소스에서 객체 생성과 의존관계에 대한 코드가 사라져 결과적으로 낮은 결합도의 컴포넌트를 구현할 수 있게 한다.
'Framework' 카테고리의 다른 글
DAY1.05 어노테이션 기반 설정 (0) | 2020.12.14 |
---|---|
스프링 컨테이너 및 설정 파일 (0) | 2020.12.14 |
결합도(Coupling)가 높은 프로그램 (0) | 2020.12.13 |
프레임워크 개념 (0) | 2020.12.12 |
스프링 프레임워크(Spring Framework)의 특징 (0) | 2020.12.12 |