본문 바로가기

컴퓨터공학/Java

WAS에 요청이 올 경우 작동 원리

Servlet

웹페이지 동적 생성 서버 프로그램 

웹 서버 프로그래밍을 하기 위해 사양을 갖춘 자바 코드

Servlet은 Servlet Container에 의해 관리되고 실행된다. 

HTTP Server + Servlet Container가 웹서버 역할에 필요한 것이 대부분 구현해놨음

개발자는 Servlet을 만들어 HTTP 요청을 받아 처리하는 부분을 구현하는 것

 

Tomcat

WAS 중 하나로 Servlet Container, Servlet Engine 이라고 표현

개발자가 만든 Servlet을 관리

Servlet을 관리한다는 뜻은 클라이언트 요청이 들어오면 어떤 Servlet을 실행할 지 제어한다.

 

web.xml

웹프로젝트 배치 기술서(deploy descriptor, 웹프로젝트 환경설정파일)

WAS는 요청이 오면 어떤 Servlet을 담당할 건지(mapping) 어떤 요청이 인증과정을 거칠 건지 제어기능을 지원한다. 

WAS에게 Servlet의 정보를 알려줘야 한다.

이 때 web.xml이 쓰인다. 

servlet3.0부터는 web.xml에서만 Servlet에 대해 정의하지 않고, 자바 소스 설정(java config)으로도 가능

WAS 구동 시 /WEB-INF 디렉토리에 존재하는 web.xml을 읽어 웹 애플리케이션의 설정을 구성하기 위해 존재

 

DispatcherServlet

Servlet Container로 부터 오는 요청을 관리하는 컨트롤러

Servlet을 다루는 방법은 두 가지가 있다.

1. Servlet Container에 여러 매핑 정보를 가진 Servlet을 생성하고 관리하는 방법

2. Serlvet Container에 DispatcherServlet만 등록하고 DispatcherServlet이 HandlerMapping을 통해 적절한 Controller에 매핑하는 방법

 

Servlet Filter

Servlet 실행 전에 어떤 작업을 하고 싶을 때 Servlet Filter를 사용한다.

Interceptor를 사용할 수 있지만 차이점은 실행시점(handler전, 후) 차이
Filter 는 Servlet Container에 등록, Interceptor는 스프링 컨테이너에 등록

 

Servlet Context 

ServletContext 클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext 객체 생성

 

서블렛이 여러 개로 구성되어 있는 Servlet Context가 있고 

Context는 여러 서블렛과 Servlet Context 하나를 모두 묶어서 의미한다. 

컨테이너 안에는 여러 개의 Context가 있다.

서블릿과 컨테이너 간의 연동을 위해 Servlet Context가 있다.

서블릿끼리 자원을 공유하기 위해 Servlet Context가 사용된다. 

톰캣 컨테이너가 실행 시 생성되고 종료되면 Servlet Context 역시 종료

 

서블릿에서 파일 접근 가능

자원 바인딩 가능

로그 파일 가능

 

Servlet Container에 DispatcherServlet과 같은 Servlet 을 등록하면 해당 Servlet이 하나의 작은 컨테이너 역할

스프링을 이용하는 경우, 스프링 컨테이너(Application Context)를 부모 Context로 사용

Application Context와 Servlet Context에 같은 id로 된 Bean이 있으면 ServletContext에 있는 Bean을 우선 사용

Bean을 찾는 순서가 Servlet에서 ServletContext를 확인한 후에 부모인 ApplicationContext를 확인

 

 

Web Application context

 

Application Context
Web Application 최상단에 위치하는 context
Spring에서 ApplicationContext란 BeanFactory를 상속받고 있는 Context
root-context.xml, applicationContext.xml 파일은 ApplicationContext 생성 시 필요한 설정정보를 담은 파일
특정 Servlet설정과 관계 없는 설정 (@Service, @Repository, @Configuration, @Component)
Spring에서 생성되는 Bean의 IoC Container (또는 Bean Container)
여러 Servlet에서 공유해서 사용할 수 있는 Bean 선언
Application Context에 정의된 Bean은 Servlet Context에 정의 된 Bean을 사용할 수 없다.

root-context.xml은 스프링의 환경설정 파일

 

servlet context 

servlet 단위로 생성되는 context

web.xml에서 DispatcherServlet (스프링에 내장된 컨트롤러)로 이동하고 servlet-context.xml을 참조한다.
spring 에서 servlet context.xml 은 dispatcherServlet 생성할 때 필요한 설정 정보가 있는 파일(Interceptor, Bean 생성, View Resolver 등)
URL 설정이 있는 bean 생성 (@Controller, Interceptor)
Application Context를 자신 부모 Context로 이용
Application Context와 Servlet Context 에 같은 id bean이 등록되어 있는 경우 Servlet Context 선언된 Bean을 사용한다. 
Bean 찾는 순서 
Servlet Context를 먼저 찾는다. 
Servlet Context에서 bean을 못 찾으면 Application Context에 정의된 bean을 찾는다.
Servlet Context에 정의된 bean은 Application Context의 Bean을 사용할 수 있다.

 

정리하자면

Application Context 

공통 기능을 할 수 있는 Bean 설정(Datasource, Service 등등)

각 Servlet에서 공유할 수 있는 Bean

root-context.xml

 

Servlet Context

Servlet 구성에 필요한 Bean 설정(Controller, Interceptor, MappingHandler 등)

servlet-context.xml

web.xml, root-context.xml, servlet-context.xml 순서대로 이동한다. 

(WAS, 스프링, 스프링 내장된 컨트롤러 순서이다. )

 

 

흐름

1. 클라이언트 요청이 온다.

2. WAS 설정 파일인 web.xml을 점검한다. 요청이 오면 어떻게할 지 씌여있다. dispatcherServlet가 요청을 핸들링한다.

3. dispatcherServlet 설정 정보가 있는 servlet-context.xml를 확인한다. 씌여진 방식대로 따라서 Controller를 검색한다.

4. 해당 Controller가 요청을 처리하고 리턴 

5. view에 출력