프로그래밍 공방

[Spring] 1-2 Servlet / 서블릿 본문

개발/스프링

[Spring] 1-2 Servlet / 서블릿

hyosupsong 2021. 10. 13. 16:17

Servlet

클라이언트의 요청을 받아 웹페이지를 동적으로 생성하여 응답하는 서버측 프로그램

웹 애플리케이션 서버를 직접 구현한다면 해야할 일

1. 서버 TCP/IP 연결 대기, 소켓 연결
2. 웹 브라우저가 생성한 요청 HTTP 메시지 파싱해서 읽기
3. 파싱한 데이터를 분석해서 필요한(저장) 프로세스 실행
4. 비즈니스 로직 실행
    - 데이터베이스에 저장 요청
5. HTTP 응답 메시지 생성 시작
    - HTTP 시작 라인 생성
    - Header 생성
    - 메시지 바디에 HTML 생성 후 입력
6. TCP/IP에 응답 전달, 소켓 종료

서블릿을 지원하는 WAS를 사용한다면 해야할 일

1. 비즈니스 로직 실행
    - 데이터베이스에 저장 요청

서블릿

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
	@override
	protected void service(HttpServletRequest request, HttpServletResponse response) {
    	/*...*/
    }
}

특징

- urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
- 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다

전체 흐름

웹 브라우저에서 WAS로 요청을 보내면 WAS에서 요청 메시지를 기반으로 request, response 객체를 생성한다
해당 객체를 파라미터로 매칭되는 서블릿 컨테이너로 넘겨서 실행한다
서블릿 컨테이너가 리턴을 하면 만들었던 response를 기반으로 HTTP 응답 메시지를 생성해서 전달한다

HTTP 요청, 응답 흐름

HTTP 요청 시

- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
-> 웹 브라우저는 응답 HTML을 잘 렌더링해서 유저에게 보여줌

서블릿 컨테이너

- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리
- 고객의 요청이 올 때마다 계속 객체를 생성하는 것은 비효율
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환되어서 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원