본문 바로가기
Everyday Study

2024.10.03(목) { 서블릿 컨테이너, 서블릿 컨텍스트 }

by xogns93 2024. 10. 3.

💡 서블릿 컨테이너(Servlet Container)

서블릿 컨테이너클라이언트의 요청을 받아서 이를 처리하고, 처리된 결과를 다시 클라이언트에게 응답해주는 자바 웹 애플리케이션의 핵심 컴포넌트입니다. 자바에서 웹 애플리케이션을 개발할 때, 서블릿 컨테이너는 다음과 같은 역할을 수행합니다:

  1. HTTP 요청 처리:
    • 서블릿 컨테이너는 클라이언트로부터 들어온 HTTP 요청을 수신하여 해당 요청을 적절한 **서블릿(자바 클래스)**에 전달합니다.
  2. 서블릿 관리:
    • 서블릿 컨테이너는 서블릿의 생명 주기(생성, 초기화, 요청 처리, 종료)를 관리합니다. 즉, 서블릿을 처음 호출할 때 인스턴스를 생성하고, 이후에는 재사용하면서 성능을 최적화합니다.
  3. HTTP 응답 생성:
    • 서블릿이 요청을 처리한 결과를 바탕으로 HTTP 응답을 생성하고, 이를 다시 클라이언트로 전달합니다. 이 과정에서 HTML, JSON, XML 등의 데이터를 클라이언트에게 반환할 수 있습니다.
  4. 세션 관리:
    • 서블릿 컨테이너는 세션 관리를 통해 클라이언트와 서버 간의 상태를 유지할 수 있게 해줍니다. 이를 통해 사용자는 로그인 상태나 장바구니 정보 등을 계속 유지할 수 있습니다.
  5. 보안 처리:
    • 서블릿 컨테이너는 인증인가(Authorization)를 처리하고, 특정 리소스에 대한 접근 제어를 수행할 수 있습니다.

💡 엔진 == 서블릿 컨테이너

**엔진(Engine)**이라는 용어는 보통 Tomcat과 같은 서블릿 컨테이너의 구성 요소를 설명할 때 사용됩니다. Tomcat에서는 **엔진(Engine)**이 서블릿 컨테이너 역할을 하며, 클라이언트의 요청을 받아들이고 처리하는 중심적인 역할을 합니다.

  • Tomcat과 같은 웹 서버에서 **엔진(Engine)**은 요청을 처리하는 메인 구성 요소로, **호스트(Host)**와 컨텍스트(Context) 등과 함께 웹 애플리케이션의 다양한 요청을 처리하고 응답을 반환하는 역할을 합니다.
  • 즉, 엔진서블릿 컨테이너의 한 부분으로, 웹 애플리케이션에서 들어오는 클라이언트의 HTTP 요청을 처리하는 주요 컴포넌트라고 할 수 있습니다.

💡 서블릿 컨테이너의 예시

  • Apache Tomcat: 가장 널리 사용되는 서블릿 컨테이너 중 하나로, JSP(JavaServer Pages)와 서블릿을 실행할 수 있는 기능을 제공합니다.
  • Jetty: 경량화된 서블릿 컨테이너로, 빠르고 간편한 서버 구성이 필요할 때 자주 사용됩니다.
  • JBoss/WildFly: 엔터프라이즈 환경에서 자주 사용되는 애플리케이션 서버로, 서블릿 및 여러 자바 EE 기술을 지원합니다.

💡 서블릿 컨테이너의 동작 과정

  1. 클라이언트 요청: 사용자가 웹 브라우저를 통해 URL을 입력하거나 HTTP 요청을 보냅니다.
  2. 서블릿 컨테이너가 요청 수신: 서블릿 컨테이너는 HTTP 요청을 수신합니다. Tomcat 같은 엔진이 이 작업을 수행합니다.
  3. 서블릿 실행: 서블릿 컨테이너는 요청에 맞는 서블릿을 찾아 해당 서블릿의 메서드(예: doGet(), doPost())를 실행하여 요청을 처리합니다.
  4. 응답 생성: 서블릿이 요청을 처리한 후, HTML, JSON, 또는 기타 데이터 형태로 응답을 생성하여 서블릿 컨테이너에 전달합니다.
  5. 클라이언트로 응답 전송: 서블릿 컨테이너는 생성된 응답을 클라이언트에게 전송합니다. 이때 HTTP 응답이 클라이언트에게 전달됩니다.

결론

서블릿 컨테이너는 클라이언트의 요청을 받아 서블릿을 통해 처리하고, 그 결과를 클라이언트에게 다시 응답하는 역할을 합니다. 이는 웹 애플리케이션의 핵심 요소로, 모든 자바 기반 웹 서버에서 필수적인 부분입니다. **엔진(Engine)**은 Tomcat 같은 서블릿 컨테이너에서 요청을 처리하는 중심 구성 요소로, 서블릿 컨테이너의 중요한 역할을 수행합니다.


서블릿 컨텍스트(ServletContext)웹 애플리케이션 전체에서 공유되는 정보를 제공하는 자바 객체입니다. 서블릿 컨텍스트 안에는 여러 개의 서블릿(Servlet)이 존재할 수 있으며, 이 서블릿들은 서블릿 컨텍스트를 통해 서로 정보를 공유하거나, 공통된 리소스에 접근할 수 있습니다.

💡 서블릿 컨텍스트(ServletContext)란?

서블릿 컨텍스트웹 애플리케이션의 실행 환경을 나타내며, 애플리케이션 전체에서 공유되는 환경 정보를 관리하는 객체입니다. 웹 애플리케이션이 배포될 때 생성되며, 해당 애플리케이션의 종료 시점까지 유지됩니다. 애플리케이션 내 모든 서블릿, JSP, 필터 등은 이 서블릿 컨텍스트 객체를 통해 공통된 정보를 접근할 수 있습니다.

서블릿 컨텍스트의 주요 역할

  1. 애플리케이션 레벨에서 정보 공유:
    • 서블릿 컨텍스트는 애플리케이션 내의 모든 서블릿과 리소스에서 공통 정보를 공유할 수 있는 수단을 제공합니다. 각 서블릿이 별도의 서블릿 객체로 존재하더라도, 컨텍스트 객체를 통해 상호작용할 수 있습니다.
  2. 공유 리소스 관리:
    • 서블릿 컨텍스트는 웹 애플리케이션이 사용하는 전역 리소스(예: 데이터베이스 연결, 파일, 설정 값 등)를 관리할 수 있습니다. 이를 통해 서블릿들이 특정 리소스나 설정에 쉽게 접근하고 사용할 수 있습니다.
  3. 애플리케이션 초기화 파라미터:
    • 서블릿 컨텍스트는 애플리케이션 시작 시 초기화 파라미터(context-param)를 설정하고 이를 여러 서블릿에서 공유할 수 있습니다. 이런 초기화 파라미터는 web.xml 파일에 정의됩니다.
  4. 애플리케이션의 전역 설정 관리:
    • 서블릿 컨텍스트는 특정 서블릿에 국한되지 않고, 애플리케이션 전체에서 필요한 전역적인 설정과 상태를 관리할 수 있습니다.
  5. 로그 기록:
    • 서블릿 컨텍스트는 애플리케이션 실행 중 발생하는 로그 메시지를 기록하는 기능을 제공합니다.

💡 서블릿 컨텍스트와 서블릿의 관계

  • 서블릿(Servlet)서블릿 컨텍스트 안에서 실행됩니다. 즉, 하나의 애플리케이션 내에서 여러 서블릿이 있을 수 있으며, 이 서블릿들은 모두 하나의 서블릿 컨텍스트를 공유합니다.
  • 서블릿서블릿 컨텍스트 객체를 통해 애플리케이션의 설정 정보나 공통 데이터를 가져오고, 이를 활용할 수 있습니다.

💡 서블릿 컨텍스트 사용 예시

1. 서블릿 컨텍스트에서 초기화 파라미터 가져오기

서블릿 컨텍스트의 초기화 파라미터는 web.xml 파일에 설정할 수 있습니다. 여러 서블릿이 이 초기화 파라미터를 공유하여 사용할 수 있습니다.

web.xml 예시:

<context-param>
    <param-name>globalConfig</param-name>
    <param-value>production</param-value>
</context-param>

서블릿에서 서블릿 컨텍스트 사용 예시:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 서블릿 컨텍스트 객체 가져오기
        ServletContext context = getServletContext();

        // 서블릿 컨텍스트 초기화 파라미터 가져오기
        String configValue = context.getInitParameter("globalConfig");

        response.getWriter().println("Global Config Value: " + configValue);
    }
}

이 코드에서, globalConfig 초기화 파라미터는 서블릿 컨텍스트에 저장되며, 서블릿 내에서 이를 가져와 사용할 수 있습니다.

2. 서블릿 컨텍스트에 전역 객체 저장 및 공유

서블릿 컨텍스트는 애플리케이션 전역적으로 사용할 수 있는 객체를 저장하고 공유하는 데 사용될 수 있습니다. 예를 들어, 데이터베이스 연결 객체를 서블릿 컨텍스트에 저장하고, 여러 서블릿이 이를 사용할 수 있습니다.

public class MyServlet extends HttpServlet {
    public void init() {
        // 서블릿 초기화 시점에 전역 데이터베이스 연결 객체 저장
        DatabaseConnection dbConnection = new DatabaseConnection();
        getServletContext().setAttribute("DBConnection", dbConnection);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 서블릿 컨텍스트에서 DB 연결 객체 가져오기
        DatabaseConnection dbConnection = (DatabaseConnection) getServletContext().getAttribute("DBConnection");

        // DB 작업 수행
        response.getWriter().println("DB Connection Active: " + dbConnection.isActive());
    }
}

여기서는 서블릿 컨텍스트에 데이터베이스 연결 객체를 저장하고, 이를 다른 서블릿에서 접근하여 사용하는 구조입니다. 이렇게 하면 여러 서블릿이 동일한 객체를 공유할 수 있습니다.

💡 서블릿 컨텍스트의 주요 메서드

  • getInitParameter(String name): 초기화 파라미터를 가져오는 메서드입니다. web.xml에 정의된 파라미터 값을 가져옵니다.
  • setAttribute(String name, Object value): 서블릿 컨텍스트에 속성(Attribute)을 저장하는 메서드입니다. 애플리케이션 전역에서 공유할 객체를 저장할 때 사용됩니다.
  • getAttribute(String name): 서블릿 컨텍스트에 저장된 속성을 가져옵니다.
  • getContextPath(): 애플리케이션의 컨텍스트 경로(예: /myApp)를 반환합니다.
  • log(String message): 서블릿 컨텍스트에 로그 메시지를 기록합니다.

결론

서블릿 컨텍스트(ServletContext)웹 애플리케이션 전체에서 공유되는 전역적인 정보를 관리하고, 서블릿 간에 공통된 리소스를 공유하는 데 사용됩니다. 여러 서블릿이 하나의 서블릿 컨텍스트 내에서 실행되며, 이 컨텍스트를 통해 초기화 파라미터나 전역 객체 등을 공유하고 사용할 수 있습니다. 이를 통해 애플리케이션 내에서 서블릿들이 상호작용하고 공통 데이터를 사용할 수 있게 되어 효율적인 웹 애플리케이션 개발이 가능합니다.