들어가기 전에
하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 때 application scope를 사용합니다.
이번 시간엔 어플리케이션 스코프에 대해서 알아보도록 하겠습니다.
학습 목표
- application scope를 이해한다.
- application scope를 사용할 수 있다.
핵심 개념
- ServletContext
- setAttribute
- getAttribute
학습하기
들어가기 전에
하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 때 application scope를 사용합니다.
이번 시간엔 어플리케이션 스코프에 대해서 알아보도록 하겠습니다.
학습 목표
핵심 개념
학습하기
실습코드
ApplicationScope01.java
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ApplicationScope01
*/
@WebServlet("/ApplicationScope01")
public class ApplicationScope01 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ApplicationScope01() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
int value = 1;
application.setAttribute("value", value);
out.println("<h1>value : " + value + "</h1>");
}
}
ApplicationScope02.java
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ApplicationScope01
*/
@WebServlet("/ApplicationScope02")
public class ApplicationScope02 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ApplicationScope02() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
try {
int value = (int)application.getAttribute("value");
value++;
application.setAttribute("value", value);
out.println("<h1>value : " + value + "</h1>");
}catch(NullPointerException ex) {
out.println("value가 설정되지 않습니다.");
}
}
}
applicationscope01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
try{
int value = (int)application.getAttribute("value");
value = value + 2;
application.setAttribute("value", value);
%>
<h1><%=value %></h1>
<%
}catch(NullPointerException ex){
%>
<h1>설정된 값이 없습니다.</h1>
<%
}
%>
</body>
</html>
생각해보기
참고 자료
https://www.pearsonitcertification.com
comment
jsp 에서 똑같은 코드 작성했는데 500대 애러가 나오네요....?
홈페이지의 설정(홈페이지 명칭, 디스크립션, 키워드 등)을 담당하는 데이터의 경우 애플리케이션 실행 당시에 Application Scope 쪽에 저장하여 모든 클라이언트가 동일한 정보를 바라보게 하고, 만약에 홈페이지의 설정에 수정이 일어난 경우에도 Application Scope에 설정한 특정 "key"에 대한 "value"만 동기화 해주면되니까 편리한 기능이겠다. 생각이 드네요. Session Scope를 사용하는 것 보다 나을 것 같네요. 좋은 강의 감사드립니다.
좋아요나 클릭수, 현재 이 페이지를 보는 사람 등 카운팅을 할때 어플리케이션 스콥을 쓰면 좋을것 같습니다.
일단 List는 인터페이스라서 문제의 원인이 되지는 않을 것 같다는 생각이 강하게 들고, List를 구현하는 구현체에 따라 다양한 메모리 문제가 발생할 수 있을 것 같습니다.
기본적으로 자바 어플리케이션의 메모리를 jvm에서 관리하기 때문에 너무 많은 Element가 List 구현체에 저장된다면 예외를 뱉어낼 것입니다.