서블릿, 서블릿 컨테이너( Apache Tomcat )

TopOfTheHead·2026년 4월 28일

자바 ( JAVA )

목록 보기
28/28

서블릿 컨테이너 = WAS

서블릿 객체를 생성 및 생명주기를 관리하는 컨테이너
HTTP 요청을 수신 시 컨테이너 내부의 어플리케이션에 구현된 알맞은 서블릿에게 전달 및 응답클라이언트로 반환

WAS 내부에 디스패처 서블릿을 포함한 다수의 서블릿 객체를 구현한 Java 어플리케이션을 포함하여 구동
JAVA / SpringTomcat 상에서 구동되는 이유

TCP/IP 5계층전송계층으로부터 전달된 MessageHttpServletRequest / HttpServletResponse자바 객체로 변환하여 내부 어플리케이션의 각 Servlet으로 전달
▶ 이후 어플리케이션으로부터 HttpServletResponse를 반환받아서 다시 전송계층으로 전달

Apache TomcatWAS이자 서블릿 컨테이너 역할을 수행
요청스레드를 하나씩 할당 후 처리하는 특징으로 Thread Safe한 특징이 존재


서블릿 컨테이너 요청/응답 처리 과정

1. 클라이언트Web ServerURLHTTP 요청 전송

2. Web Server에서 수신 및 WASURL요청 전송

3. WAS에서 수신 및 해당 URL서블릿으로 요청을 전달
요청HttpServletRequest 객체변환 후 비어있는 HttpServletResponse 객체와 함께 서블릿에게 전달

4. WAS에서 서블릿으로부터 HttpServletReponse 객체 수신 및 Web Server -> 클라이언트에게 응답

서블릿 ( Servlet )
JAVA에서 네트워크 통신을 위한 명세 역할의 표준 인터페이스
Server-Side에서 ClientRequestResponse를 처리

MVC 디자인패턴Controller 역할을 수행

。현재는 Spring MVCDispatcher Sevlet을 통해 받은 모든 요청@Controller Class@GetMapping 어노테이션으로 라우팅하여 손쉽게 Http RequestHttp Response를 수행하므로 HttpServlet를 사용하지 않는다.
Spring요청응답을 수행하는 HttpServlet의 기능을 추상화계층을 제공
Spring MVC


Servlet 특징

  • Client에게 요청을 받는 즉시 HTML을 동적으로 생성하여 반환 가능
    。초기 Servlet 등장 이전에는 정적으로 문서를 작성.
    Servlet을 통해 클라이언트에게 받은 값을 기준으로 동적으로 문자열을 다룰 수 있으므로, WAS는 이를 통해 동적 컨텐츠를 제공 가능

  • 서블릿저수준 모듈이므로, URL 패턴 당 하나의 Servlet을 구축해야하는 단점이 존재
    API가 많아질수록, Boiler-plate code가 많아지는 단점이 존재하므로 현재는 고수준Spring MVC를 활용

HttpServlet를 상속하고, @WebServlet 어노테이션을 선언하여 서블릿 클래스 정의
。정의된 서블릿 클래스를 포함한 어플리케이션WAS ( tomcat 등 ) 내에서 관리되며, WAS로부터 전달된 HttpServletRequestHttpServletResponse를 처리

 @WebServlet(
        name = "서블릿명칭",
        urlPatterns = {"/호출될엔드포인트"}
)
public class HtmlStringServlet extends HttpServlet { // 코드 }

▶ 해당 서블릿 클래스이 정의된 경우 Tomcat 내부에서 어플리케이션 배포 시 서블릿으로서 작동

  • @WebServlet
    name = "서블릿명" 속성 : 서블릿 명칭을 지정
    ▶ 지정하지 않는 경우 클래스명으로 설정됨

    urlPatterns = { "/호출될엔드포인트" } : 외부에서 서블릿으로 접근할 엔드포인트명을 지정
    ▶ 여러개의 url pattern을 정의가능하지만, 서블릿url을 하나 지정하는 것이 원칙

  • HttpServlet : javax.servlet.http.HttpServlet
    서블릿에서 HTTP 요청을 처리하기 위한 기본 클래스

    서블릿 클래스에서 상속GET, POST,.. 등의 요청 처리에 필요한 메서드 오버라이딩하여 요청 처리를 수행
    ServletdoGet(), doPost() , ... 등의 메서드오버라이딩ServletURLHttp Method에 해당하는 요청을 수신 시 처리

HttpServletRequest / HttpServletRequest
클라이언트서블릿을 통해 데이터 통신WAS (= Tomcat)를 통해 데이터를 전달받고 반환하는 자바객체
웹 통신자바 객체를 통해 규격화하는 용도로 활용

MVC 패턴Dispatcher Sevlet의 경우도 해당 객체를 활용하여 통신을 수행

HttpServletRequest :
클라이언트로 부터 전송계층을 통해 전달된 HTTP 요청WAS에 의해 캡슐화자바객체

HTTP 요청 구조 그대로 Request Line, Headers, Query Parameter, Request Body, Cookie, Session를 포함한다.

  • request객체.getMethod() :
    。해당 HTTP 요청에서 Http Method를 추출

  • request객체.getRequestURI() :
    HTTP 요청대상 URI를 추출

  • request객체.getHeader("헤더명")
    。해당 헤더명에 해당하는 헤더값을 반환

  • request객체.getHeaderNames() :
    HTTP 요청에서 포함된 모든 헤더명를 추출하여 Enumeration 객체로 반환
    request객체.getHeader("헤더명")과 함께 사용
Enumeration<String> headers = req.getHeaderNames();
Collections.list(headers).forEach(headerName -> {
            System.out.println("header : " + req.getHeader(headerName));
        });
  • request객체.getParameterMap()
    HTTP 요청Query StringMap<String,String[]> 객체로서 반환

HttpServletResponse :
클라이언트에게 반환HTTP 응답을 정의하는 자바객체
▶ 처음에는 비어있는 객체로 전달되며, 헤더데이터를 포함 후 반환하도록 설정 시 WAS에 의해 전송 계층을 통해 클라이언트에게 전송

HTTP 응답 구조 그대로 Http Status Code, Response Header, Response Body를 포함

Response Body 작성 즉시 클라이언트응답
Http Status Code / Response HeaderResponse Body 작성 전에 우선 설정해야한다.

템플릿 엔진에서 VIEW 생성 시 HttpServletResponse에 포함 후 Dispatcher Servlet -> 브라우저로 전달

  • response객체.setStatus(응답코드)
    HTTP응답Http Status Code를 설정
    ▶ 보통 Enum을 통해 HttpServletResponse.SC_상태명을 설정

  • response객체.setContentType("타입")
    HTTP응답ContentType 설정
    text/html, application/json

    text/html 설정 시 브라우저렌더링을 우선적으로 시도

  • response객체.setCharacterEncoding("인코딩")
    HTTP응답인코딩 설정
    UTF-8

  • response객체.setHeader("헤더명", "헤더값")
    HTTP응답헤더를 설정

    헤더이름 규칙 : 헤더이름대문자로 작성 및 kebab-case로 작성
    ex ) X-CUSTOM-HEADER

    헤더 길이를 매우 크게하면 안된다.
    헤더를 매우 크게 하는 공격법들이 존재하므로.

  • response객체.addCookie(쿠키객체)
    HTTP응답쿠키를 추가
    쿠키 : new Cookie();

  • response객체.getWriter()
    Http Response Body를 작성 시 활용하는 Writer 객체를 생성
    Buffer로 작성되며, 작성이 끝난 즉시 BufferHTTP Response Body삽입되어 전송됨
    • writer객체.write(문자열)
      문자열 그대로 버퍼에 작성 및 null 입력 시 NPE 발생

    • writer객체.print(문자열)
      문자열 그대로 버퍼에 작성하지만, write()와 달리 null을 넣으면 문자열 null로 작성됨

    • writer객체.println(문자열)
      print()에 줄바꿈까지 지원

    • writer객체.flush()
      Buffer에 축적된 데이터Http Request Body로 보냄.
      ▶ 이후 HTTP 응답클라이언트에게 전송

톰캣을 활용하여 서블릿을 포함하는 WAR 파일 배포하기

  • 톰캣 설치 및 압축해제


  • Jakarta EE Project 생성
    Application Server에 해당 Apache Tomcat디렉토리 경로를 설정


  • Edit Configuration - Deployment를 통해 각각의 WAR파일에 대해 URL Prefix 정의
    Tomcat 서버는 여러 WAR파일배포할 수 있으므로, URL Prefix를 통해 Artifact명을 할당하여 WAR파일들을 구분

    ▶ 해당 WAR 파일에 대해 url prefix : /로 설정

  • 서블릿 클래스 정의
    @WebServlet 어노테이션 선언 및 HttpServlet 상속

    。해당 urlPattern으로 GET 요청 전송 시 HttpServlet으로부터 메서드 오버라이딩doGet()을 통해 요청 처리
    POST 요청 등에 대한 요청처리가 추가적으로 필요 시 doPost() , ...오버라이딩
    톰캣에서 HttpServletRequest / HttpServletResponse매개변수로서 전달

    HttpServletResponse비어있는 객체로 전달되며, 헤더데이터를 정의하여 톰캣에게 반환하여 클라이언트에게 응답

    resp객체.setContentType("text/html;charset=utf-8"); 을 설정하여 브라우저텍스트 전달 시 브라우저텍스트HTML문으로 인식하도록 설정
@WebServlet(
        name = "HtmlServlet",
        urlPatterns = {"/c01/01"}
)
public class HtmlStringServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 톰캣(WAS)에서 HttpServletRequest / HttpServletResponse 를 전달
        // HttpServletResponse은 비어있는 객체로 전달되며, 헤더와 데이터를 정의하여 톰캣에게 반환
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("<!DOCTYPE html>");
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<title>Servlet::title</title>");
        writer.println("</head>");
        writer.println("<body>");
        writer.println("<div>");
        // 동적 출력
        IntStream.rangeClosed(1, 3)
                .forEach(i -> writer.println("동적 출력" + (i) + "</p>"));
        writer.println("</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
}
  • 서버 구동 및 실행

    localhost:8080/c01/01 접속 시 for문을 통한 동적 콘텐츠응답
    톰캣의 기본 포트번호 : 8080이므로.
profile
공부기록 블로그

0개의 댓글