Web Server
HTTP 기반으로 동작하며 정적 리소스를 제공한다.
대표적인 웹 서버
- Apache
- NGINX
- 등등
WAS (Web Application Server)
웹 서버의 기능에 + DB 조회를 포함하여 다양한 로직에 대한 처리를 함께 한다.
추가적인 코드 실행을 통해 어플리케이션 로직을 수행하고 동적 컨텐츠를 생성한다.
대표적인 WAS
- Apache Tomcat (Spring Boot에 내장)
- Eclipse Jetty
- 등등
실제 웹 시스템 구성 (Web Server과 WAS의 관계)
- 정적 데이터에 대한 요청은 Web Server에서 바로 처리하여 응답한다.
- ex) 요청 경로가 `/public/images/logo.png` -> 정적 리소스로 처리, 바로 응답
- 그 외의 경우 Web Server가 Http Request를 Web Container(Servlet Container를 포함)로 전달한다.
- Web Container는 애플리케이션의 비즈니스 로직을 수행하거나 동적 데이터를 생성하여 요청에 대한 응답을 생성한다.
Servlet이란?
JAVA EE 사양의 일부분으로 HTTP 프로토콜 기반 요청과 응답을 처리하는 데 사용되는 소프트웨어이다.
서블릿은 기능을 정의한 표준 API이고, 웹 애플리케이션을 만드는 주체가 실제 구현 구현하여 배포한다. (ex. Apache Tomcat이 Servlet API를 구현)
표준 API 예시
package javax.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface Servlet {
public void init();
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException;
public void destroy();
}
- 기능을 정의한 표준 API
- interface 형태로 제공
서블릿 구현체 예시
package javax.servlet.http;
import javax.servlet.Servlet;
import java.io.IOException;
public class HttpServlet implements Servlet {
@Override
public void init() {
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { <===== ❷
if ("GET".equals(request.getMethod())) {
doGet(request, response);
} else {
doPost(request, response);
}
}
@Override
public void destroy() { }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { }
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {}
}
- 표준 API를 구현하여 WAS에서 제공 (ex. Tomcat)
- `HttpServlet`, `HttpServletRequest`, `HttpServletResponse` 등등을 구현함
개발자의 서블릿 구현
- WAS에서 구현해 놓은 `HttpServlet`을 상속함으로써 구현 가능하다.
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
@Override
protected void service(
HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
) {
// application logic
}
}
Servlet Container
- 여러 서블릿을 생성, 관리, 종료하는 역할을 한다.
- 각 Servlet 객체는`싱글톤`으로 관리
- 동시 요청 처리를 위해 `멀티 스레드` 사용
템플릿 엔진 Template Engine
정적인 데이터(HTML, CSS, 이미지 등)를 단순 렌더링하는 것이 아니라, 동적인 데이터를 삽입할 수 있도록 하는 소프트웨어
서버 사이드 템플릿 엔진
- 클라이언트가 요청을 보내면, 서버 측에서 HTML 템플릿에 동적으로 데이터를 삽입하여 완성된 HTML을 클라이언트에 전송한다.
- 클라이언트는 전송 받은 HTML을 사용자에게 렌더링
- `Q` 그렇다면 클라이언트는 단순히 HTML을 그려내는 역할만 하는가?
- `A` YES. 데이터 처리 없이 렌더링 역할만 함.
- 서버가 데이터 처리와 UI 생성을 모두 책임지므로 서버 부하가 클 수 있음
대표적인 템플릿 엔진
- Thymleaf
- JSP(Java Server Pages)
- Mustache
- 등등
클라이언트 사이드 템플릿 엔진
- 클라이언트에서 HTML 구조를 template화 (DOM을 구성), 주로 JavaScript 기반 동작
- `Q` 이 때 공통 프레임(HTML)은 어디에서 가져오는가? 클라이언트에서 가지고 있는가?
- `A` 템플릿은 보통 클라이언트 쪽 코드에 미리 포함되어 있음 (그렇지만 필요에 따라 별도의 요청을 통해 받아올 수도 있음. 불가능한 것은 X)
- 필요한 데이터를 서버에 요청
- 클라이언트는 받아온 데이터를 템플릿에 동적으로 삽입 후 렌더링
- 브라우저(클라이언트)가 자바스크립트와 템플릿 엔진을 실행할 수 있어야 함
대표적인 템플릿 엔진
- Mustache
- EJS
- 현대에는 React, Vue.js, Angular와 같은 프레임워크에서 템플릿 엔진 역할을 포함함.
'Web' 카테고리의 다른 글
Cookie 와 Session (0) | 2022.04.12 |
---|