새소식

반응형
Java/Spring

서블릿, 서블릿 컨테이너(WAS)와 스프링 컨테이너

  • -
반응형

출처 : https://12bme.tistory.com/555

출처 : https://roadofdevelopment.tistory.com/56

 

위 티스토리에 적어놓은 내용을 바탕으로 작성했으며, 좀 더 이해하기 위한 글을 작성합니다.

 

서블릿 컨테이너는 개발자가 웹서버와 통신하기 위한 복잡한 일들을 할 필요가 없게 해준다.

컨테이너는 Servlet의 생성부터 소멸까지의 일련의 과정을 관리한다.

서블릿 컨테이너는 요청이 들어올때 마다 자바 쓰레드를 생성하여 작업을 한다.

서블릿 컨테이너의 대표적인 예로는 흔히 사용하는 Tomcat 이 있다.

 

여기서 서블릿이란

동적인 웹페이지를 만들기 위해 사용되는 자바 기반의 웹 프로그래밍 기술이다.

클라이언트의 요청이 있고 요청에 대한 응답 결과를 반환해야 하는데 이러한 역할을

서블릿이 한다.

 

예를 들어 사용자가 로그인페이지에서 로그인 ID와 패스워드를 입력하고

로그인 시도 시 해당 ID와 패스워드를 검증하고 확인되면 요청 페이지로

이동시켜줘야 하는데 이러한 역할을 서블릿이 한다.

 

쉽게 말해 WAS에서 동작하는 JAVA 클래스라고 볼 수 있다.

아래의 예를 보자

출처 : https://greatlaboratory.dev/web/web-02/

위 이미지 밑 출처에서 잘 설명해놓으셨다.

이미지에서 보이는 파일은 web.xml 파일이다.

Client 의 Http Request 요청이 오면 url을 확인한 후 web.xml 파일을 참조하여 요청 url에 해당하는 

<servlet-mapping> 태그 안 <url-pattern> 태그에 url 데이터가 있는지 확인한다.

요청한 url 과 맞는 <servlet-mapping> 태그를 찾으면 <servlet-name> 태그 값과 같은 <servlet> 태그를 찾는다.

찾으면 <servlet-class>에 해당하는 패키지를 찾아 해당 아래 클래스들을 서블릿으로 생성한다.

 

1. 클라이언트의 Http Request 요청이 들어오면 web.xml을 확인한다.

2. <servlet-mapping> 태그 안 <url-pattern> 태그안에서 클라이언트 요청 URL에 해당하는걸 찾는다.

3. 해당하는 url을 찾은 <servlet-mapping> 태그안에서 <servlet-name> 태그 내용을 확인하고

    같은 내용의 <servlet> 태그를 찾는다.

4. mapping 된 <servlet> 태그를 찾으면 태그 안의 <servlet-class> 에 해당하는 패키지 아래의 클래스들을

    서블릿으로 생성한다.

 

서블릿 컨테이너

서블릿 생성, 실행, 소멸 등의 관리 하는 역할을 한다. 

특정 클라이언트로부터 요청이 왔을 때 서블릿이 실행 후 결과를 반환한다고 했다.

하지만 서블릿은 스스로 실행할 수 없으므로 특정 일을 하기 위한 임무를 주는 서블릿 컨테이너가

서블릿을 관리한다.

 

이렇게 서블릿 제어(생명주기)를 서블릿 컨테이너에게 넘어간것이 제어의 역전(IoC, Inversion of Control)이라고

할 수 있다.

 

아래는 서블릿 컨테이너(WAS) 의 동작 원리이다.

 

 

서블릿에 적어놨던 내용과 같다.

 

1. 클라이언트의 Http Request 요청이 들어오면 서블릿 컨테이너는 web.xml을 확인한다.

2. 컨테이너는 요청에 대한 HttpServletRequest 객체와 응답을 위한 HttpServletResponse 객체를 생성한다.

3. 참조한 web.xml 에 알맞는 Servlet 을 찾아 생성한다.

4. 컨테이너는 생성한 Servlet 의 service() 메서드를 호출하여 HTTP 요청을 처리한다.

    (요청이 GET 요청일 경우 doGet() 메서드 호출, POST 요청일 경우 doPost() 메서드 호출)

5. doGet(), doPost() 로 동적페이지를 생성하고 HttpServletResponse 에 응답을 보낸다.

 

 

스프링 컨테이너

스프링 컨테이너는 Spring Bean 생성 및 관리하는 역할을 한다. Spring Bean 은 쉽게 말해 Spring 객체를 의미한다.

이러한 컨테이너가 관리하는 스프링 객체를 Bean 이라고 한다.

 

아래는 Spring 구조이다.

위에서 공부했던 서블릿 컨테이너가 나오고 서블릿 컨테이너에 의해 어떻게 스프링 컨테이너가 이루어지는지

확인해보자

 

출처 : https://asfirstalways.tistory.com/m/334

1. 웹 어플리케이션이 실행되면 서블릿 컨테이너(WAS 등)는 web.xml 파일을 loading 한다.

2. web.xml 에 등록되어 있는 ContextLoaderListener가 생성된다. ContextLoaderListener 클래스는

    ServletContextLisntener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.

    (Spring Context 는 쉽게 말해 여러개의 Spring Bean 들을 포함하며 여러 기능을 가진 공간)

3. 생성된 ContextLoaderListener 는 root-context.xml(RootApplicationContext) 을 loading 한다.

4. root-context.xml에 등록되어 있는 Spring Container가 구동된다. 보통 root-context.xml 에는

    back-packages 태그가 설정되어 있어 패키지 하위 클래스들을 Bean 으로 등록한다.

    root-context.xml 파일에 의해 Spring Container(ROOT) 가 생성된걸 볼 수 있다.

5. 클라이언트로부터 Http Request 요청이 온다.

6. 서블릿 컨테이너에 의해 DispatcherServlet(Servlet)이 생성된다. DispatcherServlet은 FrontController 라고도

    불리우는데 클라이언트의 모든 요청을 앞쪽에서 받아 적절한 Controller 에게 전달하고 응답을 받아 클라이언트에게

    반환한다.

    (적절한 Controller 를 찾는 역할은 HandlerMapping이 하며 사용자가 요청한 알맞는

      View를 찾는 역할은 ViewResolver가 한다.)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.