2 분 소요

상태정보

상태정보 유지

  • 서블릿, JSP도 HTTP 프로토콜 기반에서 동작하는 웹 프로그램 ⇒ 무상태 특성
  • 이전 요청에서 처리된 결과 사용하려면 클라이언트나 서버에 저장해서 유지해야 함

저장 위치

  • 클라이언트
    • 웹 브라우저에 저장
    • 브라우저가 종료되기 전까지 정보 유지, 또는 종료된 후에도 유지 가능
    • 쿠키(Cookie)
  • 서버
    • 서버의 힙 메모리 영역에 만들어진 객체에 상태정보를 저장
    • 객체가 힙 메모리 영역에 존재하는 한 계속해서 사용 가능

유지 기간

  • 웹 애플리케이션 단위 유지
    • 웹 애플리케이션이 서비스되고 있는 동안
    • ServletContext
  • 클라이언트 단위 유지
    • 클라이언트별로 구분해서 유지
    • A 클라이언트가 계속 사용해야 할 상태정보를 다른 클라이언트가 사용할 수 없어야 할 때 사용
    • 쿠키
  • 요청 단위 유지
    • 클라이언트의 서비스 요청 단위로 유지

ServletContext

  • 웹 애플리케이션 단위로 정보를 서버 쪽에 유지할 수 있는 방법
  • 서블릿가 서블릿 컨테이너 간의 통신 기능 제공

servletContext 생성

  • 서블릿 컨테이너가 시작될 때 웹 서버에 등록된 웹 애플리케이션 단위로 하나의 ServletContext 객체 자동 생성, 중지될 때 소멸
  • 웹 애플리케이션 단위로 컨텍스트가 생성되는 이유 ⇒ 서블릿 컨테이너가 웹 애플리케이션 단위로 관리할 수 있게 하기 위해

ServletContext 변수

  • 설정
    • 웹 애플리케이션 단위로 사용할 수 있는 변수 선언하고 활용하려면 web.xml 에 변수 선언 ⇒ ServletContext 객체로 추출
    • <context-param> 태그 사용
    • <param-name> 변수의 이름 설정
    • <param-value> 변수의 값 설정
  • 추출
    • getInitParameter() 메소드 사용

서버 정보 추출

  • 웹 애플리케이션 단위로 만들어진 ServletContext 객체를 통해 웹 애플리케이션에 관한 정보 추출

웹 애플리케이션 단위 정보 공유

  • 동일한 웹 애플리케이션 안에 있는 모든 페이지에서 동일한 ServletContext 객체 사용
    • void setAttribute(String name, Object value) : 웹 애플리케이션 범위에서 공유할 데이터 ServletContext 객체에 등록
    • Object getAttribute(String name) : ServletContext 객체에 등록한 데이터 추출
    • void removeAttribute(String name) : setAttribute() 메소드로 등록한 데이터 삭제

쿠키

  • 클라이언트 단위로 상태정보를 유지해야 할 경우 사용

쿠키란

  • 서버가 클라이언트에 저장하는 정보
  • 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술
  • 클라이언트와의 연결이 끊어져도 클라이언트마다 개별적으로 상태 정보를 유지하고자 할 때 활용

쿠키 사용

  • 쿠키 생성 : Cookie(String name, String value)
  • 쿠키 유효 시간 설정 : setMaxAge(int expiry)
  • 쿠키 경로 설정 : setPath(String uri)
  • 쿠키 도메인 설정 : setDomain(String domain)
  • 쿠키 전송 : addCookie(Cookie cookie)

쿠키 추출

  • 쿠키 추출 : Cookie[] getCookie()
  • 쿠키 검색 : String getName()
  • 쿠키 값 추출 : String getValue()

세션

  • HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 상태정보
  • 로그인, 로그아웃 기능에 주로 사용

세션 생성

  • HttpWervletRequest의 getSession() : 클라이언트가 갖고 있는 세션 ID와 동일한 세션 객체 찾아 주소 반환. 세션이 없으면 새로운 HttpSession 객체 생성하여 반환
  • HttpWervletRequest의 getSession(boolean create) : 클라이언트가 갖고 있는 세션 ID와 동일한 세션 객체 찾아 주소 반환. 세션이 없으면 매개변수 create가 true면 새로운 객체 생성 후 반환, false면 null 반환

HttpServletRequest

  • 여러 페이지 간 공유하는 방법
  • HttpServletRequest 객체는 클라이언트로부터 실행 요청 들어올때마다 서블릿의 service() 메소드 실행되기 전에 자동 생성, service() 메소드 종료되면 자동 소멸

    ⇒ 여러 페이지에서 공유할 정보를 저장하는게 의미가 있을까?

  • 한번의 클라이언트 요청으로 실행된 여러 페이지 간 데이터를 공유할 때 사용

요청 재지정

  • 요청 재지정 : 클라이언트가 요청한 페이지가 실행되다가 다른 페이지로 이동하는 것
  • HttpServletResponse 요청 재지정
    • 해당 메소드 사용해서 요청을 재지정할 경우 다른 웹 애플리케이션의 파일이나 다른 웹서버의 자원으로 요청을 재지정 할 수 있음.
  • RequestDispatcher 요청 재지정
    • 요청을 재지정하는 자원이 반드시 현재 자원과 동일한 웹 애플리케이션에 있어야만 함
    • RequestDispatcher 객체 생성
    • forward(ServletRequest request, ServletResponse response) : 클라이언트 요청으로 생성되는 두 객체를 다른 자원에 전달하고 수행 제어를 완전히 넘겨 다른 자원의 수행 결과를 클라이언트로 응답
    • include(ServletRequest request, ServletResponse response) : 클라이언트 요청으로 생성된 두 객체를 다른 자원에 전달하고 수행한 다음, 그 결과를 클라이언트에서 요청한 서블릿 내에 포함하여 클라이언트로 응답
    • Request 단위 정보 공유
      • forward(), include() 메소드를 이용해 다른 페이지로 이동할 때 현재 페이지가 사용하는 HttpServletRequest, HttpServletResponse 객체를 그대로 전달하면서 이동 ⇒ 이전 페이지나 이동한 페이지나 같은 객체 사용
      • 한번의 요청으로 실행된 페이지끼리 정보 공유할 때 사용