서블릿은 서버 소켓 연결, 요청 메시지를 파싱해서 읽기, Post 방식인지 어떤 URL인지 읽기, Content-Type 확인, body 내용 파싱, 저장 프로세스 실행 .. 등을 하고,
의미있는 것은 '데이터베이스에 저장을 하는'비즈니스 로직인데, 비즈니스 로직을 실행 하고 응답 메시지를 생성하는 등의 과정을 거쳐야 하는게 서버에서 처리하는 업무다.
즉 비즈니스 로직 외에 나머지 과정은 매번 실행을 해줘야 하는데, 이러한 과정들을 자동화해주는 것이 서블릿이다.
@WebServlet(name = "helloServelt", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
//로직
}
urlPatterns에 해당하는 URL이 호출되면, 서블릿 코드가 실행된다.
HttpServletRequest, HttpServletResponse 를 사용하면 HTTP 요청, 응답 정보를 사용할 수 있다. 즉 응답 메시지를 편리하게 사용할 수 있도록 해준다. 원하는 데이터를 Response 객체에 넣는 방식이고, HTTP 스펙을 매우 편리하게 사용 가능하다.
전체 흐름
HTTP 요청 시 WAS가 request, response 객체 생성
서블릿 컨테이너에 있는 서블릿 객체를 호출
개발자가 Request에서 HTTP 요청 정보를 꺼내서 사용, Response 객체에서 HTTP 응답 정보를 입력 WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 생성
응답 내용으로 html에 랜더링해서 보여줌
서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 있는데, 서블릿 컨테이너가 서블릿 객체를 생성해준다. WAS가 종료될 때 서블릿도 종료해준다. 톰캣이 바로 서블릿 컨테이너이다.
단일 요청의 경우, 요청이 오면 스레드를 할당하고, 응답이 완료되면 스레드가 휴식을 하게 된다.
다중 요청의 경우, 서블릿 안에서 요청 1의 경우 처리가 지연될 수 있다. 스레드가 하나만 있다면, 이 상황에서 요청2가 오게 되면 요청1,요청2 둘 다 실행을 기다리기만 하게 된다.
요청마다 스레드를 생성한다면, 요청1이 처리가 지연되더라도, 요청2가 들어오면 새로운 스레드를 만들어서 요청을 처리하면 된다.
장점
이러한 단점들을 해결하기 위해, WAS는 스레드 풀이라는 걸 활용한다.
필요한 스레드를 스레드 풀에 보관하고 관리하는 것이 스레드 풀의 역할이다. 스레드 풀에 생성 가능한 스레드의 최대치를 관리하고, 스레드 사용을 하고 반납하는 형식으로 활용한다. 톰캣은 최대 200개가 기본으로 설정되어 있으며, 변경 가능하다.
스레드 사용하기
실무 팁
WAS의 주요 튜닝 포인트는 최대 스레드 수이다.
스레드 풀의 적정 숫자
웹 브라우저에서 정적 리소스를 요청할 경우, 고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공한다.
웹 브라우저에서 요청을 하면, WAS에서 DB에서 조회를 해온 뒤에, 동적으로 필요한 HTML 파일을 생성해서 전달하면, 웹 브라우저는 HTML 파일을 해석해서 제공한다.
HTML이 아닌 데이터를 전달하는데, JSON 형태로 전달한다. 다양한 시스템에서 이를 호출하게 되는데, 데이터만 주고 받을 경우 활용한다. 앱 -> 서버, 서버 -> 서버, 웹 클라이언트 -> 서버 의 경우들이 있다.
React,Vue.js와 같은 웹 클라이언트나 웹 브라우저에서 자바스크립트을 이용하여 HTTP API를 호출하는 경우들이 있다.
서버와 서버 간의 통신의 경우 주문 서버와 결제 서버가 분리되어 있을 경우, json으로 통신할 수 있다.
서버에서 최종 결과, 즉 최종 HTML을 동적으로 만들어서, 클라이언트에 전달하는 것이다.
HTML 결과를 자바스크립트를 사용해서 웹 브라우저에서 동적으로 생성해서 적용하는 것이다.
주로 동적인 화면에 사용을 하는데, 관련 기술로는 React, Vue.js가 있다.
흐름은 다음과 같다.
내용이 없는 html을 요청하는데, 내부에는 자바스크립트 링크가 있다. 그러면 이 자바스크립트를 요청을 하게 되는데, 서버에서는 자바스크립트 내부에 있는 클라이언트 로직과 html 랜더링 코드를 응답을 하게 된다.
웹 브라우저는 이번에는 HTTP API로 서버를 호출한다. 즉 데이터를 요청하는 것이기 때문에, DB에서 정보를 조회하고 json 타입으로 웹 브라우저에 반환한다. 그러면 최종적으로 클라이언트,웹 브라우저에서 동적으로 HTML을 생성해서 반환을 해준다. 즉 클라이언트에서 동적으로 자바스크립트를 사용하여 HTML을 생성해주는 방법이다.