ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING] Reqeust 흐름과 WAS
    study/spring 2020. 7. 26. 22:36

    Client(Browser) - WebServer(Apache) - WAS(Tomcat) - Servlet(ServletDispatcher) - DI Container - Controller

     

    Web Server ( Apache, nginx )

    흔히 웹 서버라고 하면 웹 애플리케이션이 설치되어 웹 서비스를 제공하는 서버라고 생각한다.

    큰 의미로는 맞는 말이지만, 좁은 의미로 사용한다면 정적 컨텐츠를 제공하는 것이 웹 서버이다.

     

    사용자가 웹 서버로 요청을 보내면 먼저 웹 서버가 요청을 보고 동적 컨텐츠를 제공해야한다면 WAS로 보내고, 정적 컨텐츠(.html, .css 등 변화가 없는 파일)로 제공해야한다면 웹 서버에서 직접 응답한다.

    웹 서버가 필요한 이유는 웹 서버에서 정적인 콘텐츠만을 처리하도록 기능을 분배하여 서버의 부담을 줄여주기 때문이다.

     

    CGI ( Common Gateway Interface )

    웹 서버는 이미 저장되어 있는 정적인 컨텐츠를 응답한다.

    과거에는 만약 사용자가 직접 정보를 찾거나 기록하려면 웹 서버의 문서를 직접 고치는 작업이 필요했기 때문에 사용자의 입력과 요청 url에 따라 동적으로 변하는 페이지가 필요하게 되었고, 웹 서버에서 동적인 처리를 담당할 표준인 CGI가 등장하게 되었다.

    CGI는 서버와 응용 프로그램간에 데이터를 주고받기 위한 방법이나 규약을 뜻한다.

    1. 웹 브라우저의 HTML의 폼을 통해 요청이 웹 서버로 전달

    2. 웹 서버는 요청에 들어 있는 주소가 CGI 프로그램에 대응되는지 확인

    3. 대응될 경우 그 프로그램을 실행, 환경 변수와 표준 입력의 형태로 요청을 전달한다.

    4. 웹 서버는 CGI 프로그램이 표준 출력으로 돌려 보낸 내용을 그대로 응답으로 돌려 준다.

    CGI의 가장 큰 단점은 멀티프로세스 방식이라는 것이다.

    멀티프로세스 방식은 요청이 올 때마다 프로세스를 생성한다. 프로세스는 자원을 상당히 많이 차지하므로 이를 해결하기 위해 요청에 대응하여 프로세스가 아닌 스레드를 생성하는 자바의 Servlet이 등장하였다.

     

    Servlet

    서블릿은 자바에서 만든 확장된 CGI이다. CGI와는 다르게 멀티스레드 방식으로 동작한다.

    서버가 시작되고 서블릿을 만들게 되면 메모리에 저장해두고 같은 서블릿을 사용하여 요청을 처리한다.

     

    WAS ( Apache Tomcat, jetty )

    WAS와 웹 서버의 차이는 동적 처리를 하냐 안하냐이다.

    쉽게 말하면 사용자가 입력폼을 이용하여 값을 넣으면 그 값에 따라 응답하는 내용이 변하는 것이다.

    이런 역할을 하는 것이 Servlet이고 그 Servlet을 관리하는 것이 WAS ( 서블릿 컨테이너 )이다.

    WAS는 동적 컨텐츠뿐만 아니라 정적 컨텐츠도 처리할 수 있도 DB를 조회하는 역할도 담당한다.

    Java의 대표적인 Servlet Container (WAS)는 Apache Tomcat으로 각 서블릿을 실행하고 관리하는 역할을 해준다.

    요청마다 스레드를 만들고 통신을 위한 소켓을 연결하고 서블릿의 생성과 소멸 주기 관리는 모두 컨테이너 (WAS)가 담당한다.

    WAS가 필요한 이유는 DB 조회 등의 다양한 로직을 처리하는데 집중시키기 위함이다.

    따라서 웹 서버를 앞에 두고 필요한 WAS들을 웹 서버 플러그인 형태로 설정하면 효율적으로 분산하여 처리가 가능하다.

     

    Spring MVC

    서블릿도 인터페이스이므로 구현체가 따로 존재한다.

    Spring MVC는 웹 애플리케이션을 만드는데 특화된 서블릿 구현체이다.

     

    결국 사용자가 스프링 애플리케이션이 있는 내 웹 서버에 요청을 보내게 되면 Web Server -> WAS (Tomcat) -> DispatcherServlet 순으로 요청을 전달 받게 된다.

    Spring MVC는 DispatcherServlet라는 Servlet으로 요청이 오면 녀석이 요청의 url을 분석하여 해당 요청을 수행할 수 있는 Spring Bean ( Controller )에 요청을 보내준다.

    Spring MVC에도 서블릿 내에서 객체의 생명주기를 관리하고 실행해줄 역할을 할 Spring Container가 존재한다.

    톰캣이 실행되면 DispatcherServlet를 생성하고 등록한다. DispatcherServlet이 초기화 될 때 DI Container도 생성되고 초기화된다.

     

     

     

     

     

     

    참고

    https://sehun-kim.github.io/sehun/spring-short-story/

     

    [Spring] Request 흐름과 WAS에 대한 아주 짧은 이야기

    Spring은 Servlet이다? Tomcat은 WAS다?, JDBC와 ORM은?

    sehun-kim.github.io

     

    'study > spring' 카테고리의 다른 글

    [SPRING] Spring Batch Chunk 지향처리  (0) 2020.08.21
    [SPRING] DispatcherServlet  (0) 2020.08.04
    [SPRING] Spring vs. Spring boot  (0) 2020.07.23
    [SPRING] 스프링의 정의 / 특징 / 동작 원리  (0) 2020.07.21
    [SPRING] JPA의 이해-3(ORM)  (0) 2019.12.27
Designed by Tistory.