웹 - 상태정보 유지 기술

corncheese·2023년 7월 20일
0

HTTP 프로토콜의 통신 방식은 클라이언트와 서버 간의 연결을 클라이언트의 요청이 있을때마다 새롭게 연결하는 방식이다. 클라이언트와 서버간에 연결상태가 유지되지 않는 통신방식으로 stateless 라고 한다.

stateless 통신 방식의 특징은 한 번 접속한 후 연결이 유지되지 않기 때문에 서비스를 요청한 클라이언트에 대한 정보가 유지되지 않는 것이다. 그래서 클라이언트의 이전 요청 처리결과를 계속해서 사용하고 싶다면 서버 측 또는 클라이언트 측에 정보를 저장해야 한다.

클라이언트 측에 저장

  • javax.servlet.http.Cookie

서버 측에 저장

서버측에 저장하는 것은 서버의 힙 메모리 영역에 만들어진 객체에 저장하는 것을 의미한다.

  • javax.servlet.ServletContext ( 생성,삭제 시점 : 서버 시작 / 서버중단 )
  • javax.servlet.http.HttpSession ( 생성,삭제 시점 : 클라이언트 접속 / 클라이언트 종료)
  • javax.servlet.http.HttpServletRequest( 생성,삭제 시점 : 요청 / 응답)

ServletContext

웹 애플리케이션 단위로 정보를 서버쪽에 유지 할 수 있는 방법.
웹 애플리케이션 단위로 서비스를 하는 웹서버에서 서블릿 컨테이너는 웹 애플리케이션 단위로 ServletContext를 생성하여 관리한다.
ServletContext는 웹 애플리케이션 단위로 정보를 유지하는 기능도 있지만 서블릿과 서블릿 컨테이너 간의 통신하는 기능도 제공한다.

서블릿 컨테이너가 시작될 때 웹서버에 등록된 웹 애플리케이션 단위로 servletContext 객체가 자동으로 생성된다. 그리고 웹 애플리케이션 서비스가 중지될 때 소멸한다.

ServletContext를 추출하는 메소드는 ServletConfig의 getServletContext() 이다.
서블릿을 실행할 때 최초 요청이면 ServletConfig 객체가 생성되며 init() 메소드의 인자값으로 전달된다. ServletConfig 객체에서 현재 웹 애플리케이션에 할당된 ServletContext 객체의 주솟값을 추출할 수 있는 getServletContext() 메소드를 제공한다.

관련 메소드

ServletContext 객체는 웹 애플리케이션 단위로 사용되므로 동일한 웹 애플리케이션 안에 있는 모든 페이지에서 동일한 ServletContext 객체를 사용한다.

void setAttribute(String name, Object value)
웹 애플리케이션 범위에서 공유할 데이터를 ServletContext 객체에 등록하는 메소드이다. Object로 선언되었으므로 어떠한 자바객체도 공유할 수 있다.

Ojbect getAttribute(String name)
ServletContext 객체에 등록한 데이터를 추출하는 메소드.
getAttribute 메소드는 특정 타입으로 반환하지 않고, 자바 객체의 최상위 타입인 Object를 반환한다. getAttribute() 메소드로 데이터를 추출한 다음에는 항상 원래 데이터 타입으로 캐스팅해서 사용해야 한다.

void removeAttribute(String name)
ServletContext 객체에 setAttribute() 메소드로 등록한 객체를 삭제한다.

클라이언트에 단위로 상태정보를 유지하는 기술
저장 위치 : 클라이언트
저장 데이터 타입 : 텍스트
저장 데이터 크기 : 제한 있음

클라이언트에 저장된 쿠키 정보는 이후 다시 서버에 방문할 때 자동으로 요청정보의 헤더 안에 포함되어 전달된다. 쿠키는 name, value 로 구성된 정보로서 사용 목적에 따라 name과 value를 지정한다.

Session

HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 "상태정보"를 세션이라고 한다. 세션은 HttpSession 이라는 인터페이스 객체로 표현되며, HtpSession 객체는 HttpServletRequest의 getSession() 이나 getSession(true)메소드를 이용하여 생성할 수 있다.

HttpSession 객체가 생성될 때는 요청을 보내온 클라이언트 정보, 요청 시간 정보 등을 조합한 세션 ID가 부여되며, 이 세션 ID는 클라이언트 측에 쿠키로 저장된다.

HttpSession

HttpSession 객체는 개발자가 수동으로 생성하는 것이 아닌, 메소드를 이용하여 생성하거나 기존의 HttpSession 객체의 주솟값을 추출하여 사용한다.

  • HttpServletRequest - getSession()
    클라이언트가 가지고 있는 세션ID와 동일한 세션 객체를 찾아서 주솟값을 반환한다. 세션이 존재하지 않으면 새로운 HttpSession 객체를 생성하여 반환한다.

  • HttpServletRequest - getSession(boolean create)
    클라이언트가 가지고 있는 세션ID와 동일한 세션 객체를 찾아서 주솟값을 반환한다. 만일 세션이 존재하지 않으면 매개변수 create값이 true인지, false인지에 따라 다르게 동작한다.
    trued이면 객체 생성 / false 이면 null을 반환한다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

항상 좋은 글 감사합니다.

답글 달기