SpringBoot

서블릿 이란?

Terror123 2025. 1. 20. 11:23

개요

  • 서블릿에대한 개념에 대해 이해해 보는 시간을 가져봅시다

서블릿(Servlet) 이란?

  • 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 이다
  • 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다
  • 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹브라우저에 결과를 전송한다
  • Ex)
    • 서버에서 /login 서블릿 생성
      • 컨트롤러가 아님 주의!
    • 클라이언트 측에서 /login 경로로 데이터 전송
    • /login 서블릿이 이를 감지하고, 매핑되며 데이터등을 수신 가능하다

서블릿의 주요 특징

  • 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
  • 정적 웹 프로그램의 문제점을 보완하여 동적인 여러가지 기능을 제공
  • JAVA의 쓰레드를 이용하여 동작
  • MVC패턴에서 컨트롤러로 이용됨
  • 컨테이너에서 실행

    컨테이너란?

    • 서블릿과 JSP 같은 웹 컴포넌트를 관리하고 실행하는 Java 애플리케이션 서버의 일부
    • 웹서버와 Java 애플리케이션 사이에서 동작하며, 서블릿의 생명주기와 요청-응답처리 담당
    • 클라이언트의 요청시, 필터처럼 바로 처리되는게 아니라 컨테이너 안에 들어온후 서블릿에 의해 처리되는 개념

  • 보안 기능을 적용하기 쉬움

서블릿의 동작과정

  • 대략적인 흐름은 아래와 같다
    1. 클라이언트 요청
    2. HttpServletRequest, HttpServletResponse 객체 생성 (컨테이너 내부에서)
    3. Web.xml이 어느 서블릿에 대한 요청인지 탐색
    4. 해당하는 서블릿에서 service() 메서드 호출
    5. doGet() or doPost() 호출
    6. 동적 페이지 생성후 HttpServletResponse 객체에 응답 전송
    7. HttpServletRequest, HttpServletResponse 객체 소멸

      Web.xml?

      • 서블릿을 작성하였다면 해당 서블릿을 사용자가 요청한 경로와 매핑시켜야한다
      • 그래야 WAS에서 맵핑된 정보를 읽어서 브라우저에서 해당 URL로 HTTP요청시 보내 줄 수 있다
      • 톰켓을 예로 들면 웹 애플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server 디렉토리의 Web.xml에 있다


서블릿의 생명주기

  • 대략적인 흐름은 아래와 같다
    1. 클라이언트 요청
    2. 컨테이너는 서블릿이 메모리에 있는지 확인
      • 존재함
        -> init() 과정 생략
      • 존재하지 않음
        -> init() 메서드를 호출하여 메모리에 적재
      • 실행중 서블릿이 변경될경우, 기존 서블릿을 destory()하고, init()을 통해 새로운 내용을 다시 메모리에 적재
    3. 컨테이너 내부에서 HttpServletRequest, HttpServletResponse 객체 생성
    4. 클라이언트의 HTTP요청에 따라 doGet(), doPost() 등으로 분기처리 된다 (각 분기처리로 넘어갈때 기존에 만들어진 HttpServletRequest, HttpServletResponse 두 객체가 넘어간다)
      • doGet()
      • doPost()
      • doPut()
      • doDelete()
      • doOptions()
      • ... 등등
    5. 요청에 대한처리가 완료되고 클라이언트에게 응답이 반환되었다면, 컨테이너는 관련된 HttpServletRequest, HttpServletResponse 객체를 소멸합니다
    6. 애플리케이션 종료와같은 이유로 서블릿 객체가 더이상 필요로 하지않을때, 컨테이너는 서블릿에게 종료 요청을하여 destory()를 통해 서블릿 객체를 제거합니다
      ( 서블릿 객체 자체는 싱글톤으로서 모든 요청,응답에 대해 공유하지만 HttpServletReqeust,Response는 각 요청,응답에 대해 고유하게 하나로만 존재한다)

서블릿 컨테이너

  • 구현되어 잇는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해주는 컨테이너
  • 클라이언트에서 요청하면 컨테이너는 HttpServletReqeust,Response 두 객체를 생성하여준다 (이걸 서블릿이 만드는게 아니라 컨테이너가 만들고 넘겨주는거였군)

웹서버와의 통신 지원

  • 서블릿과 웹서버가 손쉽게 통신할 수 있게 해준다
  • 일반적으로 소켓을 만들고 listen, accpet등을 해야하지만 이러한 기능을 API로 제공하여 편리하게 이용하게 해준다

서블릿 생명주기 관리

  • 서블릿 클래스를 로딩하여 인스턴스화하고, init(),service(),destory() 메서드를 호출한다
  • 수명이 다된 서블릿을 적절하게 GC를 활용하여 막아준다

멀티쓰레드 지원 및 관리

  • Request가 올때마다 새로운 Java 쓰레드 생성
    • 각 요청이 올때마다 새로운 쓰레드가 생겨 독립적으로 실행되는군
  • 이러한 연유로 쓰레드가 종료되면 쓰레드 풀로 반환하는 작업, 공유자원의 동기화문제, 시스템 자원의 문제 등등
    • 공유자원의 동기화문제?
      • 하나의 서버는 하나의 서블릿 객체를 가지고있고, 그 객체는 싱글톤이다
      • 따라서 첫번째 요청에서 static으로 선언된 변수를 수정하고 있을때
      • 두번째 요청에서 동일한 변수에 접근하게되면서 공유자원의 동기화 문제가 발생 할 수 있다
  • 이것들을 서블릿 컨테이너가 관리해준다는 의미

선언적인 보안관리

  • 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도된다
    • SpringSecurity를 활용하여 일일이 비즈니스 로직에서 인증,검증 로직을 하지않듯이
    • 서블릿도 Web.xml파일의 구현을 통하여 가능하다는 의미

오늘 나는 무엇을 알았는가?

  • servlet이란?
    • 동적인 웹 페이지를 만들때 사용되는 객체
    • 클라이언트의 요청 ->
    • 서블릿 컨테이너 내부 진입 (HttpServetlReqeust,Response객체 생성) ->
    • 메모리에 서블릿 객체가 존재하면 생성,없으면 생략 ->
    • HTTP의 요청에 따라 doGet(), doPost()로 분기처리 ->
    • 요청 처리후 HttpServletResponse에 응답값을 담아 반환
    • HttpServetlReqeust,Response 소멸
    • 애플리케이션 종료같은 상황일시, 컨테이너가 서블릿에게요청하여 서블릿 소멸
  • 서블릿 컨테이너란?
    • 서블릿을 실행하고 환경을 관리하는 Java 웹 애플리케이션의 서버 구성 요소
    • init(), doGet(), destory() 등등

참조 문헌

https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80