Http 프로토콜을 기반으로 클라이언트의 요청을 서비스
웹 서버란 클라이언트(사용자)가 웹 브라우저에서 어떠한 페이지 요청을 하면 웹 서버에서 그 요청을 받아 정적 컨텐츠(html, css, js, image 등 즉시 응답이 가능한 컨텐츠
)를 제공하는 서버이다.
클라이언트에서 요청이 올 때 가장 앞에서 요청에 대한 처리를 합니다.
WAS = Web Server + Web Container
웹 서버가 동적 컨텐츠를 요청받으면 WAS에게 요청을 넘겨주고 WAS에서 처리한 결과를 클라이언트에게 전달하는 역할을 한다.
WAS는 웹 서버와 웹 컨테이너가 합쳐진 형태로 웹 서버 단독으로 처리할 수 없는 DB조회
나 다양한 로직처리가 필요한 동적 컨텐츠
를 제공한다.
jsp, Servlet 구동 환경을 제공해주기 때문에 웹 컨테이너(Web Containser)
, 서블릿 컨테이너(Servlet Container)
라고도 불린다.
(jsp, Servlet을 실행시킬 수 있는 소프트웨어 = Container)
클라이언트 -> Web Server -> WAS -> DB
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);
}
}
WAS가 정적 컨텐츠 요청까지 처리하면 부하가 커지고 동적 컨텐츠의 처리속도가 느려질 수 있으며, 이로 인해 페이지 노출 시간이 늘어나는 문제가 발생하여 효율성이 크게 떨어진다.
-> 웹 서버를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그린 형태로 설정하여 사용하면 더욱 효율적인 분산 처리가 가능하다.