[ Web ] 웹 서버(Web Server), WAS(Web Application Server)

duck-ach·2023년 2월 14일
0

Web

목록 보기
2/2

웹 서버(Web Server)

Http 프로토콜을 기반으로 클라이언트의 요청을 서비스

웹 서버란 클라이언트(사용자)가 웹 브라우저에서 어떠한 페이지 요청을 하면 웹 서버에서 그 요청을 받아 정적 컨텐츠(html, css, js, image 등 즉시 응답이 가능한 컨텐츠)를 제공하는 서버이다.

클라이언트에서 요청이 올 때 가장 앞에서 요청에 대한 처리를 합니다.

웹 애플리케이션 서버(WAS, Web Application Server)

WAS = Web Server + Web Container
웹 서버가 동적 컨텐츠를 요청받으면 WAS에게 요청을 넘겨주고 WAS에서 처리한 결과를 클라이언트에게 전달하는 역할을 한다.

WAS는 웹 서버와 웹 컨테이너가 합쳐진 형태로 웹 서버 단독으로 처리할 수 없는 DB조회다양한 로직처리가 필요한 동적 컨텐츠를 제공한다.

jsp, Servlet 구동 환경을 제공해주기 때문에 웹 컨테이너(Web Containser), 서블릿 컨테이너(Servlet Container)라고도 불린다.
(jsp, Servlet을 실행시킬 수 있는 소프트웨어 = Container)

동작 프로세스

클라이언트 -> Web Server -> WAS -> DB

  1. Web Server로부터 요청이 오면 컨테이너가 받는다.
  2. 컨테이너는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성, HttpServletRequest객체를 생성하여 전달한다.
  3. 컨테이너는 Servlet을 호출한다.
  4. 호출된 Servlet의 작업을 담당하게 된 Thread(2번에서 생성된 Thread)는 doGet() 또는 doPost() 호출
  5. 4번에서 호출된 doGet() 또는 doPost()는 생성된 동적 페이지를 와 HttpServletResponse 객체에 담아 컨테이너에게 전달한다.
  6. 컨테이너는 전달받은 Response를 HTTPResponse 형태로 바꿔 Web Server에 전달하고 생성되었던 Thread 종료와 동시에 HttpServletRequest, HttpServlet 객체를 소멸시킨다.
package ex02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/my")  // @WebServlet({"/my", "/me"}) 처럼 2개 이상의 URL Mapping을 지정할 수 있음

public class MyServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
       
    public MyServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 요청
		//    1) 클라이언트 -> 서버로 보내는 요청 또는 데이터
		//    2) HttpServletRequest request 객체가 처리 (Tomcat이 있어야 사용 가능)
		
		// 1) 요청에 포함된 한글 처리(문자셋 : UTF-8)
		request.setCharacterEncoding("UTF-8");
		
		// 2) 요청 파라미터(Parameter) 확인
		//    (1) URL?파라미터=값&파라미터=값
		//    (2) 모든 파라미터는 String 타입!
		String name = request.getParameter("name");
		String strAge = request.getParameter("age");
		
		// null 처리
		int age = 0;
		if(strAge != null) {
			age = Integer.parseInt(strAge);
		}
		
		
		// 2. 응답
		//    1) 서버 -> 클라이언트로 보내는 응답
		//    2) HttpServletResponse response 객체가 처리 (Tomcat이 있어야 사용 가능)
		
		// 1) 사용자에게 전달할 데이터의 형식을 HTML 문서로 결정한다.
		//    MIME-TYPE을 활용
		//    (1) HTML : text/html
		//    (2) CSS  : text/css
		//    (3) JS   : text/javascript
		//    (4) XML  : application/xml
		//    (5) JSON : application/json
		response.setContentType("text/html");
		
		// 2) 응답에 포함되는 한글 처리
		response.setCharacterEncoding("UTF-8");
		
		// 1) MIME-TYPE + 2) 문자셋
		response.setContentType("text/html; charset=UTF-8");
		
		// 3) 응답 스트림 생성
		//    (1) 문자 출력 스트림(*Writer)을 생성
		//    (2) response 객체로부터 PrintWriter 객체를 얻을 수 있음
		//        - IOException 예외 처리가 필요한데 이미 처리되어 있음
		//        - write() 메소드보다는 print()/println() 메소드를 사용하는 것이 권장
		PrintWriter out = response.getWriter();
		
		// 4) 응답 만들기 (HTML 문서 만들기)
		out.println("<html lang=\"ko\">");
		out.println("<head>");
		out.println("<meta charset=\"UTF-8\">");
		out.println("<title>");
		out.println("나의 첫 번째 응답");
		out.println("</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>안녕하세요. " + name + "님 반갑습니다 ♥</h1>");
		if(age >= 20) {
			out.println("<h1>귀하는 " + age + "살이므로 입장이 가능합니다.</h1>");
		} else {
			out.println("<h1>" + age + "살? 애들은 다음에</h1>");
		}
		out.println("</body>");
		out.println("</html>");
		
		out.flush();  // 출력 스트림에 남아 있는 모든 데이터 내보내기 (만약을 위해서)
		out.close();
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

WS와 WAS를 구분하는 이유

WAS가 정적 컨텐츠 요청까지 처리하면 부하가 커지고 동적 컨텐츠의 처리속도가 느려질 수 있으며, 이로 인해 페이지 노출 시간이 늘어나는 문제가 발생하여 효율성이 크게 떨어진다.
-> 웹 서버를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그린 형태로 설정하여 사용하면 더욱 효율적인 분산 처리가 가능하다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글