서블릿 JSP

Application 저장소

영카이브 2024. 2. 23. 22:08

서블릿은 서버 애플리케이션의 조각으로, 클라이언트의 요청에 따라 필요한 서블릿을 선택하여 사용한다. 서블릿은 요청을 처리한 후에 WAS에 의해 메모리에서 사라지게 되는데, 이는 다른 요청이 들어왔을 때 이전에 실행되었던 서블릿의 결과를 다음 요청에서 이용할 수 없다는 것을 의미한다.

 

하지만 로그인과 같이 서블릿의 의미 있는 값을 유지해야 하는 경우가 있다. application, session, cookie 는 상태를 저장할 수 있는 객체들이다. 

 

Application이란?

서블릿 컨텍스트는 서블릿 간의 데이터를 공유하고 유지할 수 있는 저장소로, 마치 책갈피 역할을 하면서 서블릿들이 서로간의 문맥을 유지할 수 있도록 한다. 이를 통해 서블릿 간에 자원을 공유하고 데이터를 계속해서 이어갈 수 있다. 때문에 이를 Application이라고도 부른다.

Application은 웹 어플리케이션의 생명주기 동안 유지되는 객체 저장 공간이다. 사이트를 방문한 누구나 상태값을 서버(웹 어플리케이션)에 application 객체를 저장하여 사용한다.

 

Application특징

  • 웹 어플리케이션의 모든 사용자에게 공유되는 데이터를 저장
  • 웹 어플리케이션이 시작될 때 생성되고, 종료될 때 파괴
  • 여러 서블릿 간 데이터를 공유하기 위해 사용
  • 'ServletContext' 인터페이스를 통해 제공
  • 웹 어플리케이션의 설정 정보나 공통 리소스에 대한 정보를 저장 가능 

 

<body>
	<div>
		<form action="calc2" method="post">
			<div>
				<label>입력 : </label>
				<input type="text" name="v" />
			</div>
			<div>
				<input type="submit" name="operator" value="+" />
				<input type="submit" name="operator" value="-" />
				<input type="submit" name="operator" value="=" />
			</div>
			<div>
				결과 : 0
			</div>
		</form>
	</div>
</body>
@WebServlet("/calc2")
public class Calc2 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// ServletContext : Application저장소
		ServletContext application = req.getServletContext();
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html; charset=UTF-8");
		String v_=req.getParameter("v"); 
		String op = req.getParameter("operator");
		
		// 기본값(값을 입력하지 않은 경우)
		int v=0; 
		int result=0; 
		if(!v_.equals("")) v = Integer.parseInt(v_);
		
		// op에 따라 값을 계산하거나 저장한다.
		// 계산
		if(op.equals("=")) { // 계산
			// x는 앞에서 저장했던값(Application저장소에 담겨진 내용)
			int x=(Integer)application.getAttribute("value"); 
			System.out.println(x);
			// y는 지금 사용자가 전달한 값
			int y=v; 
			String operator = (String)application.getAttribute("op");
			if(operator.equals("+")) {
				result=x+y; 
			}else {
				result=x-y; 
			}
			resp.getWriter().println("result is " + result);
		}
		// 저장
		else { // 기본연산을 저장
			// Application에 v와 op를 저장 (Map Collection과 유사)
			application.setAttribute("value", v); 
			application.setAttribute("op", op); 
		}
	}
}

 

 

getAttribute()과 setAttribute()를 사용하여 사용자가 전달한 값을 서버에 저장하고, 서블릿에서 사용하게 된다.

 

 

참고 자료 출처 :  https://www.youtube.com/watch?v=leZ6Cf3cqEs&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=27