중요 학습 내용 [Servlet]
CGI(Common Gateway Interface) vs Servlet
- Common Gateway Interface: 요청 1건 당 1스레드로, 새로운 요청이 생길 때마다 Applicaiton을 생성
- Servlet: 여러 요청을 여러 스레드로 동시에 처리 가능. 요청별로 별도의 어플리케이션을 생성하지 않고, 멀티스레드로 여러 요청을 처리할 수 있다.
Servlet Container
- Apache Tomcat은 Servlet Container와 JSP container로 각각 Controller와 View의 역할을 담당한다.
- Servlet: Servlet Container에서 요청 처리를 위한 서버 측 컴포넌트
- 서블릿 생명주기 관리: 서블릿의 로드, 초기화, 요청 처리, 종료 등의 생명주기를 관리
- 동적 데이터 서빙: HTTP 요청을 서블릿으로 전달하여, 서블릿이 생성한 동적 응답 반환
- JSP 처리: JSP 페이지를 서블릿으로 컴파일하고 실행하여, 동적으로 생성된 데이터 전달
- Apache Tomcat는 Web Server와 Servlet Container 기능을 모두 포함하여 자체적으로 HTTP 요청을 서블릿으로 전달하고, 정적 파일도 서빙 가능
Servlet LifeCycle

- Servlet은 Servlet Container로부터 생성되어 LifeCycle를 갖는다.
-
init() [load-on-startup]
- Servlet Container로부터 호출되어 최초 요청에만 인스턴스가 생성된다.
-
service()
- 이후 service()에 따른 doGet(), doPost() 등을 통해 요청에 맞는 데이터 처리
-
destroy()

깨달은 점 💡
- Node, Flask, Django 등 다른 서버들에서는 CGI로 싱글스레드와 같이 처리되는 줄 알았다.
- Flask나 Django는 wsgi나 asgi 등의 Gateway Interface를 통해 싱글스레드로 생기는 문제를 대체할 수 있다.
- Node나 asgi 등, 비동기 통신을 하면, 싱글스레드일지라도 비동기처리를 통해 마치 멀티스레드와 같은 작업을 하는 것처럼 요청을 처리할 수 있다.
- 내부적으로 이벤트 기반 루프 모델을 사용하여 이벤트 큐에 여러 작업에 대해 콜백을 하나씩 처리한다.
- 아무런 생각 없이 프로젝트에 적용했던 개념에 대한 확실한 의의를 깨달았다.