[JSP] 개념정리 - 2

leesoyeong·2024년 1월 14일

JSP

목록 보기
2/3
post-thumbnail

[교재] Must Have 성낙현의 JSP 프로그래밍 책을 학습하며 정리한 글입니다.

3. 내장 객체의 영역

3.1 내장 객체의 영역이란?

내장 객체의 영역은 각 객체가 저장되는 메모리의 유효기간이라고 생각하면된다. JSP와 같은 웹 애플리케이션은 페이지 단위로 구성된다. 다른 페이지에서 선언한 변수를 또 다른 페이지에서도 접근할 수 있어야하기 때문에, 영역을 통해 내장 객체에 저장된 속성값을 공유할 수 있도록 한다.

내장 객체의 영역

  • page 영역 : 동일한 페이지에서만 공유된다. 페이지를 벗어나면 소멸된다.
  • request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유된다.
  • session 영역 : 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유된다.
  • application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될때까지 유지된다.

    범위의 크기는 application > session > request > page 순이며, 오른쪽처럼 애플리케이션 구조에 따라 더 큰 범위의 영역은 더 작은 범위의 영역을 하나 이상 포함할 수 있다.

이들의 사용법(API)는 모두 같다.

주요 메서드

  • void setAttribute(String name, Object value)
    • 각 영역에 속성을 저장한다.
    • 첫 번째 인수는 속성명, 두 번째 인수는 저장할 값
    • 값의 타입은 Object이므로 모든 타입의 객체를 저장 할 수 있다.
  • Object getAttribute(String name)
    • 영역에 저장된 속성값을 얻어온다.
    • Object로 자동 형변환되어 저장되므로 원래 타입으로 형변환 후 사용해야 한다.
  • void removeAttribute(String name)
    • 영역에 저장된 속성을 삭제한다.
    • 삭제할 속성명이 존재하지 않더라도 에러는 발생하지 않는다.

3.2 데이터 전송 객체(DTO) 준비

데이터 전송 객체란 주로 데이터를 저장하거나 전송하는 데 쓰이는 객체로, 다른 로직 없이 순수하게 데이터만 담고있다. 데이터만 가지고 있는 객체라 하여 값 객체(Value Object, VO)라고 한다. DTO는 자바빈즈 규약에 따라 작성한다.
자바빈즈란 자바로 작성한 소프트웨어 컴포넌트로, 다음의 규약을 따르는 자바 클래스를 말한다.

자바빈즈 규약

  1. 자바빈즈는 기본(default) 패키지 이외의 패키지에 속해야한다.
  2. 멤버 변수(속성)의 접근 지정자는 private으로 선언한다.
  3. 기본 생성자가 있어야 한다.
  4. 멤버 변수에 접근할 수 있는 게터/세터 메서드가 있어야한다.
  5. 게터/세터 메서드의 접근 지정자는 public으로 선언한다.

DTO는 일반적인 자바 클래스이다. src/main/java에 생성해야한다.

3.3 page 영역

page 영역은 기본적으로 클라이언트의 요청을 처리하는 데 관여하는 JSP 페이지마다 하나씩 생성된다. 그리고 이때 JSP 페이지는 page 영역을 사용하기 위한 pageContext 객체를 할당받게 된다. 이 객체에 저장된 정보는 해당 페이지에서만 사용할 수 있고 페이지를 벗어나면 소멸된다. 한편, include 지시어로 포함한 파일은 하나의 페이지로 통합되므로 page 영역이 공유된다.

3.4 request 영역

클라이언트가 요청을 할 때마다 새로운 request 객체가 생성되고, 같은 요청을 처리하는데 사용되는 모든 JSP페이지가 공유한다. 따라서 request 영역에 저장된 정보는 현재 페이지와 포워드된 페이지까지 공유할 수 있다. 단, 페이지 이동 시에는 소멸되어 사용할 수 없게 된다. 이처럼 request 영역은 하나의 요청에 대한 응답이 완료될 때 소멸하게 되므로 page 영역보다는 접근 범위가 조금 더 넓다.

  • 내장 객체를 통해 실제로 포워드를 수행하는 코드
    • 포워드란 현재 페이지로 들어온 요청을 다음 페이지로 보내는 기능
    • request.getRequestDispatcher("포워드할 파일 경로").forward(request, response)
  • getRequestDispatcher()의 반환 타입이 RequestDispatcher이며, 이 객체가 요청을 다른 페이지로 넘겨주는 기능을 한다.

3.5 session 영역

클라이언트가 웹 브라우저를 최초로 열고난 후 닫을 때까지 요청되는 모든 페이지는 session 객체를 공유할 수 있다. 세션이란 클라이언트가 서버에 접속해 있는 상태 혹은 단위를 말하는 것으로, 주로 회원인증 후 로그인 상태를 유지한느 처리에 사용된다.

3.6 application 영역

웹 애플리케이션은 단 하나의 application 객체만 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유하게 된다. 또한 application 객체는 웹 서버를 시작할 때 만들어지며, 웹 서버를 내릴 때 삭제된다. 따라서 application 영역에 한 번 저장된 정보는 페이지를 이동하거나, 웹 브라우저를 닫았다가 새롭게 접속해도 삭제되지 않는다.

4. 쿠키(Cookie)

4.1 쿠키란?

쿠키는 클라이언트의 상태 정보를 유지하기 위한 기술이다. 상태 정보를 클라이언트(주로 웹 브라우저)에 키와 값 형태로 저장했다가 다음 요청 시 저장된 쿠리를 함께 전송한다. 그러면 웹 서버는 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있다. 쿠키 표준에는 다음과 같이 제약이 있다고 명시되어있다.

  • 3000개까지 만들 수 있다.
  • 쿠키 하나의 최대 크기는 4096바이트이다.
  • 하나의 호스트나 도메인에서 최대 50개까지 만들 수 있다.

따라서 쿠키로 저장할 수 있는 최대 용량은 대략 1.2MB이다. 하지만 모든 브라우저가 표준을 그대로 따르지 않으며, 대부분 이보다 적은 수만 지원한다.

4.2 기본 동작 확인

동작 메커니즘

  1. 클라이언트가 서버에 요청을 보낸다.
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤더를 실어 클라이언트에 전송한다.
  3. 클라이언트 쿠키를 받아 저장해둔다. ( 이 시점에는 쿠키가 클라이언트에만 저장된 상태이므로 서버는 아직 쿠키를 사용할 수 없다. )
  4. 클라이언트는 다음번 요청 시 저장해둔 쿠키를 HTTP 요청 헤더에 실어 보낸다.
  5. 서버는 쿠키의 정보를 읽어 필요한 작업을 수행한다.

속성과 API

  • 이름 : 쿠키를 구별하는 이름
  • 값 : 쿠키에 저장할 실제 데이터
  • 도메인 : 쿠키를 적용할 도메인
  • 경로 : 쿠키를 적용할 경로
  • 유지기간 : 쿠키를 유지할 기간

설정 메서드

  • void setValue(String value)
    쿠키의 값을 설정한다. 문자열을 입력하면 되는데 쉼표나 세미콜론 같은 문자는 포함할 수 없다.
  • void setDomain(String domain)
    쿠키에 적용할 도메인을 설정한다. 주 도메인만 적용하고 싶으면 "도메인" 형태로 기술한다. 주 도메인 외에 서브 도메인에도 적용하고 싶다면 "도메인" 형태로 기술한다. 예를 들어 setDomain(".nakja.co.kr")로 설정하면 www.nakja.co.kr은 물론 mail.nakaj.co.kr에서도 쿠키가 적용된다.
  • void setPath(String path)
    쿠키가 적용될 경로를 지정한다. 지정한 경로와 그 하위 경로에까지 적용된다.
  • void setMaxAge(int expire_seconds)
    쿠키가 유지될 기간을 초 단위로 설정한다. 기간을 설정하지 않으면 웹 브라우저가 닫힐 때 쿠키도 같이 삭제된다.

setName()이 없는 이유는 쿠키의 이름은 생성자를 통해 설정하고, 생성 후에는 더 이상 이름을 변경할 수 없기 때문이다.

생성자의 형태

  • new Cookie(String name, String value)
    이름과 값을 받아 새로운 쿠키를 생성한다.

쿠키 정보를 읽는 메서드

  • String getName()
    쿠키의 이름을 반환한다.
  • String getValue()
    쿠키의 값을 반환한다.
  • String getDomain()
    쿠키가 적용되는 도메인을 반환한다.
  • String getPath()
    쿠키의 적용 경로를 반환한다. 단, setPath()로 설정한 적이 없다면 null을 반환
  • int getMaxAge()
    쿠키의 유지 기간을 반호나한다. 단, setMaxAge()로 설정한 적이 없다면 -1을 반환

쿠키는 생성 직후에는 사용할 수 없다. 쿠키는 서버에서 먼저 생성한 후 응답 헤더를 통해 클라이언트로 전송한다. 이때 서버는 클라이언트의 요청에 의해 단지 쿠키를 만들기만 할 뿐 그 내요을 즉시 읽지 않는다. 클라이언트로부터 재요청이 들어올 때 요청 헤더를 통해 쿠키가 서버로 전송되는데 이때부터 내용을 읽을 수 있다.
쿠키를 읽을 때 생성한 적 없는 JSESSIOND라는 쿠키도 생성되는데 이 쿠키는 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키로, 새로운 웹브라우저를 열면 자동으로 생성된다.

4.3 레이어 팝업창 제어 실습


쿠키를 통해 구현할 수 있다. -> 쿠키를 통해 하루동안 열지 않음 체크박스를 통해 유지할 수 있다.

4.4 로그인 아이디 저장 실습

JSP에 자바스크립트를 추가하여 할 수 있다,.

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieManager {
    // 명시한 이름, 값, 유지 기간 조건으로 새로운 쿠키를 생성합니다.
    public static void makeCookie(HttpServletResponse response, String cName,
            String cValue, int cTime) {
        Cookie cookie = new Cookie(cName, cValue); // 쿠키 생성
        cookie.setPath("/");         // 경로 설정
        cookie.setMaxAge(cTime);     // 유지 기간 설정
        response.addCookie(cookie);  // 응답 객체에 추가
    }

    // 명시한 이름의 쿠키를 찾아 그 값을 반환합니다.
    public static String readCookie(HttpServletRequest request, String cName) {
        String cookieValue = "";  // 반환 값

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                String cookieName = c.getName();
                if (cookieName.equals(cName)) {
                    cookieValue = c.getValue();  // 반환 값 갱신
                }
            }
        }
        return cookieValue;
    }

    // 명시한 이름의 쿠키를 삭제합니다.
    public static void deleteCookie(HttpServletResponse response, String cName) {
        makeCookie(response, cName, "", 0);
    }
}
profile
초보 개발자

0개의 댓글