[Spring/Springboot] 서블릿(Servlet)

2024. 12. 15. 23:06CS/Spring

 

서브릿(Servlet)

  • Servlet이 없다면?
    • HTML Form 데이터 전송을 하면, 웹 브라우저가 생성한 요청 HTTP 메세지를 만들어서 서버로 전송함
    • → 이 때, 만약 웹 서버를 직접 다 구현해야 한다면, 아래의 단계를 모두 개발자가 직접 수행해야함
서버 TCP/IP 연결 대기, 소켓 연결
HTTP 요청 메세지를 파싱해서 읽고,
POST 방식, /save URL 인지
Content-Type 확인
HTTP 메세지 바디 내용 파싱 → username, age 데이터를 사용할 수 있게 파싱
저장 프로세스 실행
비즈니스 로직 실행 → 데이터베이스에 저장 요청
HTTP 응답 메세지 생성 시작
HTTP 시작 라인 생성
Header 생성
메세지 바디에 HTML 생성에서 입력
TCP/IP 에 응답 전달, 소켓 종료
    • ⇒ 그러나 서블릿을 지원하는 WAS가 있으면, 의미있는 비즈니스 로직 실행을 제외한 모든 것을 지원해줌
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequesst request, HttpServletResponse response){
	//애플리케이션 로직
	}
  • urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행됨
    • service 로직이 실행되면서, 2가지 파라미터가 들어옴
    1. HttpServletRequest : HTTP 메세지를 직접 파싱하려면 노다가 → HTTP 요청 정보를 편리하게 사용할 수 있도록 HTTP 요청 메세지를 파싱하고, 그 결과를 HttpServlet 객체에 담아서 제공함 → 우리는 그냥 Request 객체를 사용하면 됨
      • 임시저장소 기능 : request.setAttribute(name, value), request.getAttribute(name)
      • 세션 관리 기능 : request.getSession(create: true)
      • 파라미터 조회 : (GET url 쿼리 파라미터 형식, POST HTML Form 형식에서 지원) : request.getParameter(”username”)
    2. HttpServletResponse : HTTP 응답 메세지 생성하려면 노다가 → HTTP 응답 정보를 편리하게 사용할 수 있도록 HTTP 응답 메세지를 생성하고, 편의 기능을 제공함 → 우리는 그냥 Response 객체에 원하는 데이터를 넣으면 됨
      • HTTP 응답 메세지 생성 : HTTP 응답코드 지정, 헤더 생성, 바디 생성
        • 응답 메세지가 주로 담는 내용
          • 단순 텍스트 응답 : (writer.println(”ok”);), HTML 응답, HTTP API - MessageBody JSON 응답
      • 편의 기능 제공 : Content-Type, 쿠키, redirect

HTTP 요청 시 응답 흐름

  • (ex) 웹 브라우저가 localhost:8080/hello라고 요청을 하면,
  • WAS 서버는 요청메세지를 기반으로 request, response 객체를 새로 만들고,
  • request, response 파라미터를 넘기면서, 서블릿 컨테이너 안 서블릿 객체(HelloServlet)를 호출한다.
  • 개발자는 request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용하고, response 객체에 HTTP 응답 정보를 편리하게 입력한다.
  • 끝나고 return을 하면 WAS는 response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성하여, 웹브라우저에 응답메세지가 전달이됨
  • 웹브라우저가 해당 html을 렌더링해서 사용자에게 예쁘게 보여 준다.

Servlet Container

  • 서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 있는데, 서블릿 컨테이너가 서블릿 객체(helloServlet, saveServlet)를 자동으로 생성, 초기화, 호출, 종료하는 생명주기를 관리해줌
  • 서블릿 객체는 싱글톤으로 관리됨
    • request, response 객체는 고객마다 다르니 매번 생성해야하지만, 서블릿 컨테이너는 메서드 안에 비즈니스 로직만 있으면 되니 싱글톤
      • 서블릿 객체는 최초 로딩 시점에 싱글톤으로 서블릿 객체를 미리 만들어두고 재활용함
      • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근함
      • 서블릿 객체는 서블릿 컨테이너 종료 시 함께 종료됨
    • 따라서, 서블릿 객체는 공유 변수 사용 시 주의 해야함
      • (ex) member 변수에 값이 있으면, 내가 로그인 했는데 다른 사람의 이름이 보일 수 있음
  • 서블릿 컨테이너는 동시 요청을 위한 멀티 쓰레드 처리를 지원

DispatcherServlet

  • Front Controller 패턴을 구현한 서블릿
  • Front Controller 패턴이란?
    • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
    • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출 = 입구를 하나로!
      • 공통 처리 가능 → 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
    • 스프링 웹 MVC와 프론트 컨트롤러: FrontController = 스프링 웹 MVC의 DispatcherServlet
    • 코드 예시