ServletContext 사용법
ServletContext 클래스
ServletContext 클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext 객체를 생성합니다. 그리고 톰캣 컨테이너가 종료하면 ServletContext 객체 역시 소멸됩니다. ServletContext 객체는 웹 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서 서블릿들이 공유하여 사용합니다.
ServletContext 클래스의 특징은 다음과 같습니다.
- javax.servlet.ServletContext로 정의되어 있습니다.
- 서블릿과 컨테이너 간의 연동을 위해 사용합니다.
- 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext가 생성됩니다.
- 서블릿끼리 자원(데이터)을 공유하는 데 사용합니다.
- 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸됩니다.
ServletContext가 제공하는 기능은 다음과 같습니다.
- 서블릿에서 파일 접근 기능
- 자원 바인딩 기능
- 로그 파일 기능
- 컨텍스트에서 제공하는 설정 정보 제공 기능
톰캣 컨테이너를 실행할 때 각 애플리케이션에서 생성되는 ServletContext와 ServletConfig 객체를 나타내었습니다. ServeltContext는 컨텍스트당 생성되는 반면에 ServeltConfig는 각 서블릿에 대해 생성됩니다.

ServletContext에서 제공하는 여러 가지 매서드의 기능을 정리한 것입니다.
| 메서드 | 기능 |
| getAttribute(String name) | - 주어진 name을 이용해 바인딩된 value를 가져옴 - name이 존재하지 않으면 null을 반환 |
| getAttributeNames( ) | 바인딩된 속성들의 name을 반환 |
| getContext(String uripath) | 지정한 uripath에 해당되는 객체를 반환 |
| getInitParameter(String name) | - name에 해당되는 매개변수의 초기화 값을 반환 - name에 해당되는 매개변수가 존재하지 않으면 null을 반환 |
| getInitParameterNames( ) | - 컨텍스트의 초기화 관련 매개변수들의 이름들을 String 객체가 저장된 Enumeration 타입으로 반환 - 매개변수가 존재하지 않으면 null을 반환 |
| getMajorVersion( ) | 서블릿 컨테이너가 지원하는 주요 서블릿 API 버전을 반환 |
| getRealPath(String path) | 지정한 path에 해당되는 실제 경로를 반환 |
| getResource(String path) | 지정한 path에 해당되는 Resource를 반환 |
| getServerInfo( ) | 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전을 반환 |
| getServletContextName( ) | 해당 애플리케이션의 배치 관리자가 지정한 ServletContext에 대한 해당 웹 애플리케이션의 이름을 반환 |
| log(String msg) | 로그 파일에 로그를 기록 |
| removeAttribute(String name) | 해당 name으로 ServletContext에 바인딩 된 객체를 제거 |
| setAttribute(String name, Object object) | 해당 name으로 객체를 ServletContext에 바인딩 |
| setInitParameter(String name, String value) | 주어진 name으로 value를 컨텍스트 초기화 매개변수로 설정 |
ServletContext 바인딩 기능
1. 다음과 같이 GetServletContext, SetServletContext 클래스 파일을 준비합니다.

2. SetServletContext 클래스를 다음과 같이 작성합니다. getServletContext() 메서드를 이용해 ServletContext 객체에 접근한 다음 ArrayList에 이름과 나이를 저장한 후 다시 ServletContext 객체에 setAttribute() 메서드를 이용해 바인딩합니다.
package sec05.ex01;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/cset")
public class SetServletContext extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
List member = new ArrayList();
member.add("이순신");
member.add(30);
context.setAttribute("member", member);
out.print("<html><body>");
out.print("이순신과 30 설정");
out.print("</body></html>");
}
}
3. GetServletContext 클래스를 다음과 같이 작성합니다. getServletContext() 메서드를 이용해 ServletContext 객체에 접근합니다. 그리고 getAttribute() 메서드를 이용해 다른 서블릿에서 ArrayList를 가져와 회원 정보를 출력합니다.
package sec05.ex01;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/cget")
public class GetServletContext extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
List member = (ArrayList) context.getAttribute("member");
String name = (String) member.get(0);
int age = (Integer) member.get(1);
out.print("<html><body>");
out.print(name + "<br>");
out.print(age + "<br>");
out.print("</body></html>");
}
}
4. 크롬 브라우저에서 http://localhost;8090/pro08/cset으로 요청하면 ServletContext 객체에 데이터를 바인딩합니다.

5. 이번에는 인터넷 익스플로러에서 http://localhost:8090/pro08/cget으로 요청합니다. 마찬가지로 바인딩된 데이터를 브라우저에 표시합니다.

이처럼 ServletContext에 바인딩된 데이터는 모든 서블릿들(사용자)이 접근할 수 있습니다. 따라서 웹 애플리케이션에서 모든 사용자가 공통으로 사용하는 데이터는 ServletContext에 바인딩해놓고 사용하면 편리합니다.
'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글
| ServletContext의 파일 입출력 기능 (1) | 2025.06.24 |
|---|---|
| ServletContext의 매개변수 설정 기능 (1) | 2025.06.21 |
| 바인딩 (1) | 2025.06.15 |
| dispatch를 이용한 포워드 방법 (1) | 2025.06.12 |
| 서블릿 포워드 기능 & 서블릿의 여러 가지 포워드 방법 (1) | 2025.06.09 |