WebServer vs Web Application Server(WAS) feat. Servlet

이수빈·2023년 8월 25일
0

Spring

목록 보기
2/4

Web Server

  • 요청을 받아서 정적 컨텐츠를 제공함(HTML,CSS,이미지,파일등등)

  • 웹 서버가 동적컨텐츠를 요청받는다면 ? => WAS에게 해당 요청을 넘겨주고 처리한 요청을 클라이언트에게 전달하는 역할을 함.

  • 프론트엔드에서 build한 정적파일을 웹서버에 배포하는 형태임

ex) 대표적 웹서버 : apache, ngnix, MS lls 등등

Web Application Server

  • 웹 서버의 확장, 어플리케이션 실행, 데이터베이스 연결, 보안, 트랜잭션 관리 등의 기능 제공함.

  • 동적 콘텐츠 생성을 위한 비지니스 로직 실행하며, JSP, Servletdlm 의 구동환경을 제공해준다

  • 서블릿 컨테이너 혹은 웹 컨테이너로 불림.

  • 대표적 WAS : Tomcat, Jposs. 등등 => Spring 자체가 WAS환경에서 구동됨 + 다양한 WAS에서 실행 될 수 있음.

WAS와 WebServer의 필요성

Web Server의 필요성

  • 정적컨텐츠를 빠르게 앞단에서 처리가능하다.

  • 클라이언트(웹 브라우저)에 이미지 파일(정적 컨텐츠)을 보내는 과정을 생각해보자.
    이미지 파일과 같은 정적인 파일들은 웹 문서(HTML 문서)가 클라이언트로 보내질 때 함께 가는 것이 아니다.

  • 클라이언트는 HTML 문서를 먼저 받고 그에 맞게 필요한 이미지 파일들을 다시 서버로 요청하면 그때서야 이미지 파일을 받아온다.
    Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보내줄 수 있다.

  • 따라서 Web Server에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있다.

WAS의 필요성

  • 동적 컨텐츠 처리를 위해 필요 : 만약 WAS가 웹서버의 역할까지 모두 수행한다면 서버의 부하가 발생할 수 있다.WAS는 DB 조회나 다양한 로직을 처리하고, 단순한 정적 컨텐츠는 웹 서버에서 처리해줘야 한다. 만약 정적 컨텐츠까지 WAS가 처리한다면 부하가 커지게 되고, 수행 속도가 느려질 것이다.

  • 보안 강화 : SSL에 대한 암호화, 복호화 처리에 웹 서버를 사용 가능

  • 여러 대의 WAS 연결 가능 : 로드 밸런싱을 위해 웹 서버를 사용할 수 있다. 여러 개의 서버를 사용하는 대용량 웹 어플리케이션의 경우 웹 서버와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다.

  • 여러 웹 어플리케이션 서비스 가능 : 하나의 서버에서 PHP, JAVA 애플리케이션을 함께 사용할 수 있다.

  • 동작과정

  • Web Server는 웹 브라우저 클라이언트로부터 HTTP 요청을 받는다.

  • Web Server는 클라이언트의 요청(Request)을 WAS에 보낸다.

  • WAS는 관련된 Servlet을 메모리에 올린다.

  • WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)

  • HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.

  • Thread는 Servlet의 service() 메서드를 호출한다.

  • service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.

  • protected doGet(HttpServletRequest request, HttpServletResponse response)

  • doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.

  • WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.

  • 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.

WAS는 서블릿 컨테이너이다.

  • 서블릿 컨테이너란 말 그대로 서블릿을 담고 관리해주는 컨테이너이다. 서블릿 컨테이너는 구현되어 있는 servlet 클래스의 규칙에 맞게 서블릿은 관리해주며 클라이언트에서 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하며 post, get여부에 따라 동적인 페이지를 생성하여 응답을 보낸다.

HttpServletRequest
http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있습니다.

HttpServletResponse
WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송합니다.

Servlet이란?

  • 서블릿은 자바 클래스로 웹 애플리케이션을 작성한 뒤 이후 웹 서버 안에 있는 웹 컨테이너에서 이것을 실행하고, 웹 컨테이너에서는 서블릿 인스턴스를 생성 후 서버에서 실행되다가 웹 브라우저에서 서버에 요청(Request)을 하면 요청에 맞는 동작을 수행하고 웹 브라우저에 HTTP형식으로 응답(Response)함.

  • HTML을 사용해서 RESPONSE를 보내줌.

  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.

  • WAS안에서 클라이언트에 요청에 동적으로 대응하는 웹 어플리케이션 컴포넌트이다.

  • MVC패턴에서 Controller로 이용된다.

Spring에서 Servlet이 하는 역할?

  • Spring에서 Servlet은 내장된 형태로 사용함. Controller에 들어온 해당 url을 통한 요청으로 서블릿에 대한 요청을 처리해줌.
  1. 클라이언트 요청 처리: 클라이언트가 웹 애플리케이션에 HTTP 요청을 보내면, 요청을 처리할 컨트롤러(Controller)가 필요합니다.
    Spring MVC에서는 Servlet 대신 @Controller 어노테이션이나 @RestController 어노테이션을 붙인 클래스가 이 역할을 수행합니다.

  2. URL 매핑 및 핸들링: 클라이언트 요청의 URL을 기반으로 어떤 컨트롤러 메서드가 해당 요청을 처리할지 결정합니다. Spring MVC는 @RequestMapping 어노테이션을 통해 URL과 컨트롤러 메서드를 매핑합니다.

  3. 요청 데이터 처리:클라이언트가 요청한 데이터는 주로 HTTP 요청의 파라미터, 경로 변수, 헤더 등으로 전달됩니다.Spring MVC는 컨트롤러 메서드의 매개변수에 @RequestParam, @PathVariable, @RequestHeader 등의 어노테이션을 사용하여 요청 데이터를 받아올 수 있도록 지원합니다.

  4. 비즈니스 로직 실행:클라이언트의 요청에 따라 필요한 비즈니스 로직을 실행하고 데이터를 가공하여 모델(Model)을 생성합니다.컨트롤러 메서드 내에서 비즈니스 로직을 수행하거나, 서비스(Service) 레이어를 통해 처리합니다.

  5. 모델 생성 및 뷰 선택: 비즈니스 로직의 결과 데이터를 모델에 담아서 뷰(View)에 전달합니다. Spring MVC는 Model이나 ModelAndView 객체를 사용하여 모델 데이터를 저장하고, 어떤 뷰를 렌더링할지 결정합니다.

  6. 뷰 렌더링 및 응답 생성: 선택된 뷰는 클라이언트에게 전달될 HTML, JSON 등의 형태로 렌더링됩니다. Spring MVC는 뷰 리졸버(View Resolver)를 통해 뷰의 이름을 실제 뷰 객체로 변환하고, 뷰를 렌더링하여 응답 데이터를 생성합니다.

Dispatcher Servlet이란?

  • 클라이언트에서 요청을 주면 Servlet Container가 요청을 받음(was) => Spring에서 container로 들어오는 모든 요청을 처리하는 Front Controller를 정의함.

  • 기존에는 모든 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했음. 앞단에서 요청을 handling 하는게 dispatcher Servlet임.

ref)
https://code-lab1.tistory.com/199
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://mangkyu.tistory.com/14
https://riimy.tistory.com/87

profile
응애 나 애기 개발자

0개의 댓글