[JSP] JSP 기본 객체와 영역 | Attribute

Jeini·2023년 4월 29일
0

🌐 JSP

목록 보기
12/24
post-thumbnail

웹은 원래 상태를 저장하게끔 만들어지지 않았다. 초창기 웹은 항상 정해져있는 정적데이터만 사용가능했지만, 현재는 상태라는 정보를 넣음으로써, 값을 저장하며 그 값이 언제까지 유지되는지 알 수 있게 되었다.

예를 들어, 사용자가 회원가입을 할 때 본인인증 ➡️ 가입 ➡️ 로그인 순으로 이루어진다.
이러한 일들은 순서가 있으며 본인인증을 먼저 거쳐야지 가입을 할 수 있다.

우리는 본인인증에서 변수를 만들어서 testOk = true 값을 가지면 가입이 되기로 만들었다. 하지만, 어떠한 변수를 만들어 놨을 때 testOk 를 만들어 놨으면 가입까지는 가져가야 된다. 하지만 어디에 저장할까?

파일에 저장? 아니다. 매번 휘발성 데이터를 파일에 저장할 필요가 없다. 파일은 영속성을 가지기 때문에 파일에 저장하지 않는다.

서버는 이 정보(데이터)를 언제까지 유지해야 되는가에 대한 상태를 4가지의 영역으로 나눴다.

💡 웹 어플리케이션 4가지 영역


✔️ PAGE 영역

  • 하나의 JSP 페이지를 처리할 때 사용되는 영역
  • 페이지 내부
  • pageContext 기본 객체

✔️ REQUEST 영역

  • 하나의 HTTP 요청을 처리할 때 사용되는 영역
  • 요청 ➡️ 응답
  • request 기본 객체

✔️ SESSTION 영역

  • 하나의 웹 브라우저와 관련된 영역
  • 브라우저당 1개씩 할당. 브라우저 접속에서 브라우저 종료까지
  • 로그인 과정
  • session 기본 객체

✔️ APPLICATION 영역

  • 하나의 웹 어플리케이션과 관련된 영역
  • 모두 공유. 서버 시작에서 서버 종료까지
  • 방문자 수, 설정 정보
  • application 기본 객체

✏️ 4가지 영역과 기본 객체의 관계

❗️ 하나의 요청을 처리하는데 두 개 이상의 JSP가 사용될 수도 있다.
이는, request 기본 객체를 공유하게 된다.

  • 웹 브라우저가 호출한 JSP 페이지가 다른 JSP를 include
  • 웹 브라우저가 호출한 JSP 페이지가 다른 JSP를 forward

💡 속성(Attribute) 사용하기


✔️ Attribute <속성의 이름, 값>
: JSP 페이지 사이에서 정보를 주고받거나 공유하기 위한 목적으로 사용됨

✔️ 4개의 기본 객체는 속성(Attribute)을 갖는다.

  • 4개의 기본 객체는 서로 다른 이름을 갖는 속성을 여러 개 포함할 수 있다.
  • 4개의 기본 객체는 속성 처리 메서드를 사용해서 속성을 추가, 변경, 삭제할 수 있다.

📎 속성 처리 메서드

  • setAttribute(String name, Object value)
    : void
    : 이름이 name인 속성의 값을 value로 지정한다.

  • getAttribute(String name)
    : Object
    : 이름이 name인 속성의 값을 구한다.
    : 지정한 이름의 속성이 존재하지 않으면 null을 리턴한다.

  • removeAttribute(String name)
    : void
    : 이름이 name인 속성을 삭제한다.

  • getAttributeNames()
    : Enumeration<String>
    : 속성의 이름 목록을 구한다,
    : pageContext 기본 객체는 이 메서드를 제공하지 않는다.


✏️ application 객체에 속성을 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // application 기본 객체에 설정할 속성 이름으로 사용할 파라미터를 읽어온다.
	String name = request.getParameter("name");

	// application 기본 객체에 설정할 속성값으로 파라미터를 읽어온다.
	String value = request.getParameter("value");
	
	if(name != null && value != null) {
      	// application 기본 객체에 속성 설정
      	// 파라미터로 전달받은 값을 속성 이름과 값으로 사용한다.
		application.setAttribute(name, value);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>속성 지정</title>
</head>
<body>
  <%

      if(name != null && value != null) {

  %>
          application 기본 객체의 속성 설정:
          <%= name %> = <%= value %>
  <%

      } else {

  %>
          application 기본 객체의 속성 설정 안함
  <%

      }

  %>
</body>
</html>

✏️ 파라미터 넣기 전

✏️ URL에 파라미터 넣기 후

http://localhost:8080/04_25/setApplicationAttribute.jsp?name=속성이름&value=속성값

✏️ 속성값을 보여주는 JSP 페이지 작성

setApplicationAttribute.jsp를 또 실행하여 http://localhost:8080/04_25/setApplicationAttribute.jsp?name=attr&value=value1 을 추가하고 application 기본 객체의 속성 출력 결과를 확인해보자.

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>기본 객체 속성 보기</title>
</head>
<body>
<%

	Enumeration<String> attrEnum = application.getAttributeNames();
	
	while(attrEnum.hasMoreElements()) {
		String name = attrEnum.nextElement();
		Object value = application.getAttribute(name);
%>
		application 속성: <b><%= name %></b> = <%= value %><br>
<%
	}
%>

</body>
</html>


처음 setApplicationAttribute.jsp에서 설정한 application 속성과 두 번째로 설정한 application 속성이 다 나오는 것을 확인 할 수 있다.

서로 다른 JSP 페이지와 서로 다른 웹 브라우저에서 동일한 application 기본 객체의 속성을 사용하는 이유는 웹 어플리케이션 내에 있는 모든 JSP가 한 개의 application 기본 객체를 공유하기 때문이다.

❗️ setApplicatonAttribute.jsp로 지정한 속성 이외에 다른 속성들이 표시되는 것은?

  • 톰캣 서버가 제공하는 것으로 톰캣에서만 유효한 것
  • 유지보수 과정에서 톰캣 서버를 JBoss와 같은 서버로 교체하면 톰캣 관련 속성들을 사용할 수 없다.
    ➡️ 특정 컨테이너에서만 제공하는 속성은 사용하지 않는 것이 좋다.

💡 Attribute의 값 타입


📎 setAttribute(String name, Object value)

속성의 이름은 문자열을 나타내는 String 타입이지만, 값은 모든 클래스 타입이 올 수 있다.

✏️ Date, String, File 타입 객체로 속성값 사용

session.setAttribute("date", new java.util.Date());
session.setAttribute("memberId", "jipark09");
application.setAttribute("application_temp", new File("c:\\temp"));

Date date = (Date)session.getAttribute("date");
String memberId = (String)session.getAttribute("memberId");
File tempDir = (File)application.getAttribute("application_temp");

리턴값이 Object이기 때문에 형변환 해줘야 한다.


✔️ 기본 데이터 타입의 값은 래퍼 타입을 대신 사용해야 한다.

  • int ➡️ Integer
// int의 래퍼 타입인 Integer를 이용해서 값을 설정
request.setAttribute("age", new Integer(20));
// = request.setAttribute("age", 20);

// int age = (Integer)request.getAttribute("age");
Integer ageAttr = (Integer)request.getAttribute("age");
int ageValue = ageAttr.intValue();

java는 기본적으로 래퍼 타입 간의 변환을 자동으로 처리해주는 오토 박싱 / 오토 언박싱 기능을 제공하므로 new Integer(20) 으로 지정해주지 않고 20 을 넣어도 자동으로 오토 박싱이 된다.

또한 Integer 타입의 값도 자동으로 int타입으로 변환된다.

💡 Attribute의 활용


✔️ pageContext

  • PAGE 영역
  • (한 번의 요청을 처리하는) 하나의 JSP 페이지 내에서 공유할 값을 저장함.
  • 주로 커스텀 태그에서 새로운 변수를 추가할 때 사용함.
  • 하지만, script를 써서 변수 사용이 가능하므로 pageContxt는 잘 쓰이지 않음.

✔️ request ⭐️

  • REQUEST 영역
  • 한 번의 요청을 처리하는데 사용되는 모든 JSP 페이지에서 공유할 값을 저장함.
  • 주로 하나의 요청을 처리하는데 사용하는 JSP 페이지 사이에서 정보를 전달하기 위해 사용됨.

✔️ session ⭐️

  • SESSION 영역
    - 한 사용자와 관련된 정보를 JSP 사이에 공유하기 위해 사용함. (특정 값 ⭕️)
  • 사용자의 로그인 정보와 같은 것들을 저장함.

✔️ application

  • APPLICATION 영역
  • 모든 사용자를 위해 공유할 정보를 저장함. (특정 값 ❌)
  • 임시 폴더 경로와 같이 웹 어플리케이션의 설정 정보를 주로 저장함.

❓ context-Param과 Attribute 차이

Servlet 초기화 파라미터를 지정할 때 DD파일에 context-Param 태그를 사용한다.

context-Param은 서버와 상관없이 영속성을 보장한다.
하지만 Attribute는 값을 담아둘 수 있지만 서버를 껐다가 키면 값이 사라진다.

❓ request에서 왜 Attribute를 많이 사용할까? mvc와 무슨 관계가 있을까?

MVC(Model, View,Controller)는 각각 기능이 다르다.
결론적으로 결과를 만들어낸다는 것은 3가지 파트가 다 합쳐진 것이다.

즉, 각각 할일이 끝내야 되는데 끝난다는 말은 3개의 분리된 영역에서 완전히 단절된 것이 아니고 서로서로 전달되는 값이 존재한다는 의미이다. 이 값을 request의 Attribute를 이용한다.

그래서 위와 같은 일이 끝나면 전달되는 값이 사라지고, 그러한 일 처리가 request가 적합하다.

profile
Fill in my own colorful colors🎨

0개의 댓글