서블릿(Servlet) 이해하기

LeeYulhee·2024년 1월 9일
0

👉 서블릿이란?


  • 설명
    • 자바를 사용하여 웹 서버에서 실행되는 작은 프로그램
      • 자바 언어로 작성된 서버 측 웹 컴포넌트로, 웹 서버에서 실행
    • HTTP 요청을 처리하고 동적 컨텐츠를 생성하는 데 사용
    • 비즈니스 로직의 수행도 담당

  • 특징
    • 자바 기반
      • 서블릿은 자바 언어로 작성되며, 자바의 특성을 활용하여 멀티스레딩, 객체 지향 프로그래밍 등을 지원
    • 요청 및 응답 처리
      • 서블릿은 HTTP 요청을 받아 처리하고, 적절한 형식(HTML, JSON 등)으로 응답을 생성
    • WAS와의 통합
      • 서블릿은 웹 애플리케이션 서버의 컨테이너 내에서 실행되며, WAS는 서블릿의 생명주기를 관리
        • 서블릿의 생성, 초기화, 요청 처리, 소멸 등
    • 상태 유지
      • 서블릿은 세션 관리를 통해 상태 정보를 유지할 수 있음
      • 사용자별 상태 정보를 기억하여 상호작용적인 웹 애플리케이션을 구현하는 데 필수적

  • 예시
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    
    public class MyServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 응답 내용 설정
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
    
            // HTML 형식으로 응답 작성
            out.println("<html><body>");
            out.println("<h1>Hello, this is a Servlet example</h1>");
            out.println("</body></html>");
        }
    }
    • HttpServlet을 상속받아 새로운 클래스(MyServlet과 같은)를 만들어서 사용



👉 JSP와 서블릿


  • 설명
    • JSP는 서블릿 기반의 웹 프로그래밍 기술로 내부적으로 서블릿으로 변환되어 실행
    • 서블릿과 JSP는 다른 개념
      • 서블릿은 서버에서 실행되는 자바 프로그램으로, 클라이언트 요청에 따라 동적 컨텐츠를 생성하여 응답
      • JSP는 HTML 내에 자바 코드를 삽입하여 웹 페이지를 동적으로 생성하는 서블릿의 확장 형태

  • JSP 파일의 처리 과정
    1. JSP 페이지 로딩
      • 사용자의 웹 요청이 들어오면, 웹 서버나 애플리케이션 서버(예: Tomcat)는 해당 JSP 파일을 로드함
    2. JSP를 서블릿으로 변환
      • 서버는 JSP 파일을 자바 서블릿 소스 코드로 변환
      • 이 변환 과정에서, JSP 파일 내의 HTML 코드는 그대로 유지되며, JSP 태그와 스크립트릿(자바 코드 조각)은 자바 코드로 변환
      • 웹 애플리케이션 서버(예: Tomcat, Jetty)는 자바 코드를 실행할 수 있는 환경을 제공
      • JSP 파일 자체는 HTML과 자바 코드의 조합이므로, 이를 직접 실행할 수 없음
      • 서블릿으로 변환함으로써, JSP 파일 내의 코드가 웹 서버에서 실행 가능한 자바 코드로 변환
    3. 서블릿 컴파일
      • 변환된 자바 서블릿 코드는 .java 파일로 저장되고, 이후 자바 컴파일러에 의해 .class 파일(자바 바이트코드)로 컴파일됨
    4. 서블릿 실행
      • 컴파일된 서블릿은 웹 애플리케이션 서버에 의해 실행
      • 서블릿은 사용자의 요청에 따라 동적으로 HTML을 생성하고, 이를 응답으로 클라이언트에게 보냄
    5. 결과 반환
      • 생성된 HTML 내용은 사용자의 웹 브라우저로 전송되어 페이지로 렌더링됨



👉 일반적인 서블릿의 요청-응답 처리 과정


  1. 웹 서버 요청 수신
    • 사용자의 웹 브라우저로부터 웹 서버에 요청이 들어옴
    • 이 요청은 HTTP 프로토콜을 사용
    • 웹 서버는 이 요청을 웹 애플리케이션 서버(컨테이너)로 전달
  2. 컨테이너 처리
    • 컨테이너는 배포 서술자(web.xml)를 참조하여 요청을 처리할 적절한 서블릿을 결정
    • 필요에 따라 새로운 스레드를 생성하거나 미리 생성된 스레드를 사용
  3. 서블릿 인스턴스 생성 및 요청 객체 전달
    • 컨테이너는 서블릿의 인스턴스를 생성(또는 재사용)하고, 요청(HttpServletRequest) 및 응답(HttpServletResponse) 객체를 서블릿에 전달
  4. 서블릿 처리
    • 서블릿은 내부 로직에 따라 요청 객체의 유형(HTTP 메소드)을 확인하고, 이에 맞게 doPost() 또는 doGet() 메서드를 실행
    • 이러한 처리는 서블릿이 실행되는 스레드의 컨텍스트 내에서 이루어짐
  5. 동적 페이지 생성 및 반환
    • 서블릿은 doPost() 또는 doGet() 메서드를 통해 생성된 동적 페이지를 응답 객체(Response)에 실어 컨테이너에 반환
  6. HTTP 응답 전송 및 자원 정리
    • 컨테이너는 응답 객체를 HTTP 응답 형태로 변환하여 웹 서버에 전달
    • 그 후, 처리에 사용된 스레드는 종료되고, 요청(HttpServletRequest) 및 응답(HttpServletResponse) 객체는 소멸됨



👉 Spring MVC와 Spring Boot에서 서블릿


  • 스프링 부트는 서블릿 컨테이너(예: Tomcat, Jetty)를 내장하고 있으며, 이를 자동으로 구성
    • 개발자는 별도의 서블릿 컨테이너 설정 없이 웹 애플리케이션을 실행할 수 있음
  • 사용자의 HTTP 요청은 내장된 서블릿 컨테이너에 의해 받아들여짐
    • ⇒ 이후 요청은 스프링의 디스패처 서블릿(DispatcherServlet)으로 전달
  • 스프링 부트와 스프링 MVC 프레임워크가 제공하는 추상화된 컴포넌트와 애노테이션을 사용
  • 스프링 부트에서 동적 페이지를 구현할 때, 개발자가 직접 서블릿을 사용하는 일은 별로 없음
    • 컨트롤러 정의 & 뷰 템플릿 사용 & 디스패처 서블릿으로 구현
      • 동적 페이지를 생성하기 위해, 스프링 부트는 Thymeleaf, FreeMarker, JSP 등과 같은 다양한 뷰 템플릿 엔진을 지원
      • 컨트롤러는 모델 데이터를 이러한 뷰 템플릿에 전달하고, 템플릿 엔진은 이 데이터를 활용하여 HTML 페이지를 동적으로 생성



👉 Spring MVC의 디스패처 서블릿(DispatcherServlet)과 컨트롤러(Controller)


  • 디스패처 서블릿
    • 스프링 MVC에서 중심 역할
      • ⇒ 스프링 부트가 아닌 스프링 MVC의 일부
    • 모든 클라이언트 요청을 받아 적절한 컨트롤러에 전달하는 역할
    • 스프링 MVC의 핵심 컴포넌트로, 모든 HTTP 요청을 하나의 지점에서 처리하여 적절한 처리기(컨트롤러)로 라우팅
    • MVC2에서는 서블릿이 컨트롤러 역할을 해서 직접 요청을 매핑시켜줬어야 했는데, Spring MVC에서는 디스패처 서블릿이 직접 모든 컨트롤러로 요청을 매핑
  • 컨트롤러
    • 개발자는 스프링 MVC의 컨트롤러를 사용하여 요청을 처리
    • 컨트롤러는 서블릿 API 위에서 작동하지만, 직접 서블릿을 다루는 대신 스프링의 애노테이션과 메서드를 사용하여 요청을 처리
    • 애노테이션을 사용하여 정의되며, HTTP 요청을 처리하는 메서드를 포함



👉 Spring MVC에서 디스패처 서블릿의 흐름


1. 요청이 들어옴
2. Handler Mapping을 통해서 매핑할 핸드러를 찾음(실행할 컨트롤러 메서드를 찾는 과정)
3. 찾아낸 핸들러를 실행시킬 수 있는 Handler Adapter를 찾음
4. Handler Adapter를 실행
- 여기서 컨트롤러가 실행되어 서비스 로직이 돌아감
5. 결과값으로 나온 Model이 생성되고, 선택한 View의 이름을 반환
6. 반환값의 View 이름을 가지고 View Resolver에서 해당 View 오브젝트를 찾은 후 Model과 데이터 바인딩 시킴
- ViewResolver에 따라 JSP나 Thymeleaf와 같은 템플릿 엔진을 선택할 수도 있음
7. 최종적으로 완성된 View를 DispatcherServlet이 반환하면, 동적 웹페이지가 완성

💻 참고 사이트 : Spring에서의 요청 흐름 3 - Spring MVC

profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보