tomcat을 이용한 Servlet에 대한 설명과 spring에서의 사용
by 키위먹고싶다서블릿이란?
Spring을 공부하다보면 HTTP통신과 Servlet에 대한 이해가 필수적이다. 지금부터 서블릿에 대해 알아보자.
정적페이지와 동적페이지에 대해 들어본적이 있을 것이다.
정적 페이지는 말 그대로 어떤 행위를 하던지 변하지 않는 고정적인 페이지이다.
동적 페이지는 소셜 네트워크처럼 사용자의 행위 하나에 민감하게 반응해서 상시로 바뀌는 페이지로 정적 페이지와는 확연히 대비된다.
서블릿이란
클라이언트 요청을 처리하고 처리 결과를 클라이언트에게 반환하는 기술이며,
웹 서버가 웹 페이지를 제공할때 동적인 페이지를 제공하는 서버측 프로그램이다. 그러니까
동적인 웹 서버 프로그래밍을 하기 위한 자바 코드라고 설명할 수 있다.
Servlet Container
흔히 우리가 말하는 서버는 WEB서버와 WAS(Web Application Server)로 나눠진다.
웹서버는 클라이언트 요청에 따라 정적인 페이지를 제공하고 WAS는 내부에 서블릿 컨테이너라고 불리는 웹 컨테이너에서 생성된 서블릿의 도움을 받아 연산결과인 동적 페이지를 사용자에게 제공한다. 서블릿 컨테이너는 말 그대로 서블릿을 관리해주는 컨테이너인데 대표적으로 톰켓(Tomcat)이 있다.
한 서버 안에 각각의 기능을 구현한 서블릿들이 있다. 예를 들어 한가지 웹어플리케이션 안에 게시판, 검색, 등록 등의 기능이 있는 것처럼 각 기능들을 역할을 서블릿이 맡고 있는것이다.
웹 컨테이너는 클라이언트가 요청하는 기능이 무엇인지에 따라 어떤 서블릿이 작동해야하는지 제어하는 중요한 역할을 하는 친구이다.
서블릿 동작 과정
1. 클라이언트 요청
클라이언트가 HTTP프로토콜을 통해 요청한 내용이 정적 페이지라면 웹서버에서 바로 처리하지만 동적페이지를 요청한다면 웹 컨테이너로 요청이 넘어간다.
2. HttpRequest와 HttpResponse객체
웹컨테이너에 요청이 들어오면 웹 컨테이너가 두 객체를 생성한다. HttpRequest는 클라이언트가 요청한 데이터 처리를 실행하고 데이터 처리가 완료되면 HttpResponse에 결과가 반환된다.
3. web.xml
WAS가 서블릿이 어떤 요청을 처리해야하는지 매핑시키려면 WAS에게 서블릿의 위치와 어떤 url로 접속해야 하는지에 대한 정보를 알려줘야 하는데 이때 사용하는 것이 web.xml이다. 사용자가 url로 어떤 서블릿에 접근하는지 알리기 위한 설정 정보라고 생각하자.
4. init()
서블릿에는 생명주기라는것이 있다. 요청하면 서블릿이 바로 실행되는게 아니라 서블릿 객체를 생성하고 초기화 작업을 거쳐서 요청을 처리한다. 웹 컨테이너는 서블릿 객체를 생성하고 단한번만 init()을 호출하여 초기화 시키는데 이것은 클라이언트가 한개의 서블릿을 처음 요청할 때 호출된다. 중요한 점은 서블릿을 요청시마다 초기화 시키는것이 아니라는 것이다.
5. service()
초기화 작업이 완료되면 요청의 내용을 실질적으로 처리하는 service()가 실행된다. 서비스 메서드에서 어떤 요청인지에 따라 doGet()을 실행시키던지 doPost()를 실행시킨다. service()는 컨테이너에 의해 만들어진 멀티 스레드에 의해서 실행되므로 여러개의 요청을 동시에 처리할 수 있다. doGet()과 doPost()는 처리 결과를 HttpResponse객체에 반환시킨다.
6. destory()
서버가 종료되거나 웹 컨테이너가 서블릿을 더이상 사용하지 않는다고 판단하면 destory()를 실행시켜 서블릿 객체를 제거한다.
그니까 서블릿객체가 초기화되면 이 객체는 destory()에 의해 소멸될때까지 컨테이너 안에 살아있다가 요청이 들어오면새로운 스레드를 만들어서 service메서드를 실행시킨다. 만들어진(초기화 완료) 서블릿객체를 스레드가 공유해서 다중요청을 처리한다. 이렇게 되면 자원을 아낄 수 있다. 최초 실행된 서블릿을 사용할때 보다 만들어진 서블릿을 사용할때 더 빠르다고 느낄 수 있다.
서블릿 클래스
스프링은 HttpServlet 을 상속받아 Servlet을 구현한다.
가장 위에 Servlet인터페이스가 있고 그 아래 GenericServlet 추상 클래스가 있는데 HTTP프로토콜 외에 다른 프로토콜 서블릿을 만들때 사용한다. HttpServlet까지는 톰켓에서 구현되고 그 아래 세가지는 스프링에서 쓰인다.
DispatcherServlet
매우매우 중요한 클래스이다. 이 클래스에서 경로찾기, 알맞은 처리기 찾기, 뷰 보여주기를 실행한다.
- 핸들러 매핑 : 클라이언트가 URL로 접근(요청)하면 DispatcherServlet이 가장 먼저 해당 요청을 매핑한 컨트롤러가 있는지 검색하고 컨트롤러에게 처리를 요청한다.
- 핸들러 어댑터 : 실제로 요청을 처리하고 반환하는 애인데 String으로 뷰의 위치를 반환하거나 ModelAndView로 객체를 직접 반환하거나 JSON객체를 반환한다.
- 뷰 리졸버 : 뷰를 담당하는 처리기. 처리 결과를 뷰에 넘김.
톰켓과 같은 웹 컨테이너가 요청을 받으면 디스패처 서블릿이 이 요청을 가장먼저 받고 컨트롤러에게 위임해준다.
spring을 사용하기 전에 나는 HttpServlet을 사용했는데 저렇게 일일이 서블릿을 web.xml에 등록해줬다. 그런데 DispatcherServlet은 컨트롤러의 매핑을 해줌으로 저렇게 서블릿을 등록하지 않아도 된다.
spring에서는 DispatcherServlet을 통해 가장먼저 요청을 받고 공통처리 작업을 처리한뒤, 세부 작업을 컨트롤러에게 위임한다. 이때 DispatcherServlet을 가장 앞에 있는 Front Controller라고 한다. 스프링 MVC에서의 핵심이다.
spring container
스프링 프레임워크는 빈을 생성하고 관리하는 BeanFactory와 ApplicationContext라는 스프링 컨테이너를 가지고 있다.
ApplicationContext
spring은 빈의 생성과 관계설정 제어(IoC/DI)를 담당하는 BeanFactory가 존재하는데 주로 BeanFactory를 확장한 애플리케이션 컨텍스트(Application context)를 사용한다.
클라이언트가 어떤 팩토리 클래스에 접근해야 하는지 일일이 알아야 하는 번거로움을 줄여주고 빈 목록을 관리하여, 빈의 이름이나 어노테이션으로 빈을 찾을 수 있다.
WebApplicationContext
Application의 구현체로는 GenericXmlApplicationContext와 AnnotationConfigApplicationContext등이 있는데 주로 WebApplicationContext를 사용한다.
WebApplicationContext는 부모/자식 관계를 가지는 두가지 종류가 있다. 하나는 Servlet에서 관리되는 Servlet WebApplicationContext(자식)와 스프링 웹 애플리케이션에서 관리하는 Root WebApplicationContext(부모)이다.
Servlet WebApplicationContext(자식)
- DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈들을 등록하는데 사용한다 (Controller, viewResolver, HandlerMapping...)
Root WebApplicationContext(부모)
- ContextLoaderListener에 의해서 만들어진다.
- 웹 환경에 독립적인 빈들을 등록해서 서로 다른 서블릿컨텍스트에서 공유해야 하는 빈들을 등록하고 사용할 수 있다. (service, Repository...)
결론은 독립적인 서블릿 컨텍스트들이 공통으로 사용하는 빈들을 웹 애플리케이션의 최상위인 루트에 담아 사용한다는 것이다.
'spring' 카테고리의 다른 글
Validation (0) | 2022.02.03 |
---|---|
메시지 국제화 (0) | 2022.02.01 |
타임리프 기본 문법 (0) | 2022.01.28 |
스프링 mvc 웹 페이지 만들기 (0) | 2022.01.26 |
서블릿부터 스프링 mvc까지의 변화 과정 (2) | 2022.01.22 |
블로그의 정보
kiwi
키위먹고싶다