그럼에도 불구하고

👨‍💻

[Servlet/JSP] 내장 객체 본문

Java, Servlet/Servlet, Jsp

[Servlet/JSP] 내장 객체

zenghyun 2022. 11. 4. 23:49

오늘은 내장 객체에 대해 알아보자

 

 

 

 

 

[ 내장 객체란? ]

"JSP 내에서 선언하지 않고 사용할 수 있는 객체" 

 

JSP가 서블릿 형태로 자동 변환된 코드 내에 자동으로 포함되어 있는 멤버 변수, 메서드 매게 변수 등의 각종 참조 변수들을 말한다. 

보통 스크립트 내부에서 사용하며 내장객체를 사용하면 클라이언트(사용자)의 요청을 컨트롤하거나 페이지 간의 데이터를 손쉽게 공유할 수 있다. 

 

내장 객체들은 특정 클래스에 대한 인스턴스 형태로서, 컨테이너를 통해서 초기화되고 다양한 기능과 정보 등을 제공한다. 

 

 

 

[ 선언하지 않고 사용할 수 있는 이유 ]

 

Insert title here
why?

작성된 JSP 코드는 서블릿으로 변환된 후 모두 _jspService() 메서드 안으로 들어가기 때문에 메서드 매개변수인 request, response와 지역변수로 선언된 pageContext, application, page, config, out 등은 모두 내장객체가 된다. <해당 내장객체들은 _jspService 메서드 부분에서 사용자가 작성된 코드 위에  자동으로 선언되고 초기화 되기 때문에 JSP 파일에서 프로그램을 작성할 때 내장객체를 별도의 선언 없이 사용할 수 있는 것이다.

 

 

 

 

[ 내장 객체의 종류와 기능 ] 

 

내장 객체의 대표적인 것들을 알아보자

  • request
  • reponse
  • out
  • session
  • application

 

 

request : HttpServletRequest

"사용자 요청과 관련된 기능을 제공하는 내장객체"

주로 클라이언트에서 서버로 전달되는 정보를 처리하려고 사용한다.

가장 대표적인 유형은 HTML 폼을 통해 입력된 값을 JSP에서 가져올 때 사용하는 것이다. 

 

 

method 기능
getParameterNames() 사용자가 전달한 키들을 Enumeration 객체로 반환
getParameter(name) 사용자가 전달한 name과 일치하는 값을 반환
getParameterValues(name) 사용자가 전달한 name과 일치하는 값을 배열형식으로 반환
getCookies() 클라이언트에서 전달한 쿠키를 배열 형식으로 반환
getMethod() 현재 요청방식이 GET인지 POST인지 문자열로 반환
getSession() 현재 세션 객체를 반환
getRemoteAddr() 클라이언트의 IP 주소를 반환
getProtocol() 현재 서버의 프로토콜을 문자열로 반환
setCharacterEncoding()  현재 JSP로 전달되는 내용을 지정한 문자셋으로 변환
getHeaders(name) 현재 요청한 헤더에서 지정한 이름의 모든 값들을 반환
getQueryString() 현재 요청에 포함된 쿼리 문자열을 반환

 

 

[ 쿠키란? ]

 

쿠키는 클라이언트와 서버 간의 연결이 유지되지 않는 웹 프로그램의 문제점을 보완하려고 클라이언트에 간단한 데이터를 저장하고 있다가 서버에서 요청이 오면 이를 브라우저가 제공하는 기술이다. 

최근에는 보안상의 문제로 잘 이용되지 않지만 서버가 클라이언트의 이전 사용 기록 등을 유지하기 위한 수단으로는 아직 유용하다.

 

 

 

response : HttpServletResponse

"사용자 응답과 관련된 기능을 제공하는 내장 객체"

사용자 요청을 처리하고 응답을 다른 페이지로 전달하는 기능을 제공한다. 

javax.servlet.http.HttpServletResponse 객체에 대한 참조 변수로, request에 비해 사용되는 메서드는 적지만 setContentType, sendRedirect와 같은 메서드는 잘 알아두어야 한다.

 

 

method 기능
setContentType(type) 컨텐츠 형식을 설정
setHeader(name,value) 클라이언트에게 헤더로 전달할 값을 설정
setDateHeader(name, date) 클라이언트에게 헤더로 전달할 날짜를 설정
sendError(status, msg) 클라이언트에게 에러코드와 메시지를 전달
sendRedirect(url) 클라이언트 요청을 다른 페이지로 전달
addCookie(cookie) 클라이언트에게 전달할 쿠키를 설정
encodeURL(url) URL로 유효하지 않은 문자를 인코딩
setStatus(sc) 상태 코드를 설정

 

 

※ setContentType() 

해당 메서드를 사용하게 되면 page 지시어에서 contentType을 이용해 지정된 MIME Type을 무시하고

새로운 MIME Type이 헤더로 전달된다.

 

 

※ sendRedirect vs forward

결과만 보면 forward 액션과 거의 유사하지만 sendRedirect는 새로운 페이지를 위한 request, response 객체가 새로 생성되며 forward 액션의 경우에는 원래 요청에 포함된 request와 response 객체가 포함되어 그대로 전달된다.

즉, a->b->c 이런 식으로 요청이 진행된다 할 때, forward 액션을 사용하면 a에서 전달된 request 객체가 c까지 전달이 되지만, sendRedirect 메서드를 사용하면 b에서 c로 넘어갈 때 새로운 request, response 객체가 생성되어 값이 전달되지 않는다.

 

즉,

▶ sendRedirect : 일을 이어나가는 게 아니라 새로 요청할 때

▶ forward : 일을 이어나갈 수 있을 때

 

 

 

out: javax.servlet.jsp.JspWriter

"출력 스트림으로, 사용자 웹 브라우저로 출력하기 위한 채널"

스트립트에서 브라우저로 텍스트를 출력할 때 사용하며, out은 javax.servlet.jsp.JSPWriter 객체의 참조 변수로, 버퍼 관련 메서드와 출력 관련 메서드로 구성되며 out을 이용해서 출력된 내용은 서버의 콘솔이 아닌 사용자에게 전달된다.

 

 

method 기능
getBufferSize() output buffer의 크기를 byte로 알려준다.
getRemaining() 남아있는 버퍼의 크기중 사용가능한 비율을 알려준다.
clearBuffer() 버퍼에 잇는 콘텐츠를 모두 지운다.
Flush() 버퍼를 비우고 output stream도 비운다.
Close() output stream을 닫고 버퍼를 비운다.
Println(content) content의 내용을 newline과 함께 출력한다.
Print(content) content의 내용을 출력한다.

여기서 버퍼를 비운다는 것은, 버퍼 내용을 output stream을 통해 전달하고 버퍼의 내용을 지운다는 의미

 

 

 

session: javax.servlet.http.HttpSession

"HTTP 프로토콜이 비연결형 프로토콜이라는 문제를 해결하기 위해 등장"

HTTP 프로토콜은 한 페이지가 출력된 다음에는 클라이언트와 서버의 연결이 끊어진다. 따라서 사용자가 특정 행동을 할 때까지 보관해야 할 정보가 있다면 처리가 매우 곤란해진다. 이러한 문제점을 해결하기 위해 등장한 것이 세션쿠키이다. 쿠키는 사용자와 관련된 정보를 PC에 저장하고, 세션은 서버에 보관하는 방식인데, 세션이 쿠키보다 보안 문제에 유리하고 제약사항이 적은 편이라서 최근에는 대부분 세션을 사용한다. 

 

 

※ Session :현재 접속한 사용자

Session은 브라우저마다 사용자를 다르게 인식한다.

같은 브라우저에서 새로 열어도 기존 세션이 저장되어 있어서 동일한 세션으로 인식한다.

(process가 아니라 thread의 개념으로 갖고 있기 때문)

 

method 기능
getID() 각 접속에 대한 세션 고유의 id를 문자열형태로 반환
getCreationTime() 세션이 생성된 시간을 밀리세컨드값으로 반환
getLastAccessedTime() 현재 세션으로 마지막 작업한 시간을 밀리세컨드값으로 반환
getMaxInactiveInterval() 세션 유지 시간을 초로 반환
setMaxInactiveInterval(t) 세션 유효시간을 t에 설정된 초 값으로 설정
invalidate() 현재 세션을 종료, 세션과 관련한 값을 모두 지움
getAttribute(attr) 문자열 attr로 설정된 세션 값을 object형태로 반환
setAttribute(name.attr) 문자열 name으로 attr을 설정
removeAttribute(name) 세션에 설정한 속성 값을 삭제

 

 

 

application : javax.servlet.ServletContext

"웹 애플리케이션 전체를 관리하는 객체"

application 객체를 통해 각 서블릿이나 JSP에서 공유하려고 하는 각종 정보를 설정하고 참조할 수 있다. 

application은 javax.servlet.ServletContext 객체에 대한 참조 변수로서, config 객체를 통해 생성한다. ServletContext 객체는 컨테이너와 관련된 여러 정보를 제공하며, application 참조 변수를 통해서 서블릿이 실행되는 환경, 서버 자원과 관련된 정보를 얻거나 로그 파일을 기록하는 작업을 수행한다.

 

 

method 기능
setAttribute(name, value) application 범위의 값 설정
getAttribute(name) application 범위의 값 얻기
getRealPath(path) 실제 물리 경로를 반환
getResource(path) path 경로의 리소스를 가리키는 URL을 반환
gerServletinfo() 현재 요청방식이 GET인지 POST인지를 문자열로 반환
getSession() 현재 세션 객체를 반환
getRemoteAddr() 클라이언트의 IP주소를 반환
getProtocol() 현재 서버의 프로토콜을 문자열로 반환
setCharacterEncoding() 현재 JSP로 전달되는 내용을 지정한 문자셋으로 변환해준다.

 

 

[ config란? ]

 

서블릿이 최초로 메모리에 적재될 때 컨테이너는 서블릿 초기화와 관련된 정보를 읽고 javax.servlet.ServletConfig 객체에 저장한다. 웹 애플리케이션 하나에는 서블릿, JSP, 빈즈 클래스 등이 여러 개로 구성되는데 config 내장 객체는 서로 독립적인 파일로 구성된 JSP나 서블릿들이 서로 다른 시점에 임의의 정보를 서로 교환할 수 있는 기법 중 하나로 활용할 수 있다.

 

기본적으로 web.xml 파일에 초기화 값을 등록해놓고 JSP에서 필요한 경우 config 내장 객체를 이용해 참조하는 방법이 있다.

 

▶ getInitParameterNames() : 초기 매개변수 값들의 설정 이름을 열거 객체로 반환

▶ getInitParameter(name): 문자열 name에 해당하는 초기화 매개변수 값 반환

 

[ 내장 객체의 생명주기와 속성 관리 ]

JSP는 HTTP 프로토콜을 사용하는 웹 환경에서 구동되는 프로그램이다. 이런 웹 프로토콜은 비연결 방식으로 사용자가 서버에 특정 페이지를 요청하고 요쳥결과를 응답받으면 서버와의 연결이 끊기는 형태다.

이런 특성 때문에 어떤 정보를 지속적으로 가지고 있어야 하는 기능을 구현하기 어려워진다.

이런 문제점을 해결하기 위해 등장한 것이 내장 객체이다. 

 

그렇기 때문에 내장 객체의 생명주기와 속성 관리에 대해 확실하게 이해하고 있어야 좋은 웹을 개발할 수 있다.

 

 

[ request, session, application의 생성 시점과 소멸 시점 ] 

객체 생성시점 소멸시점
request 해당 페이지 요청 시점 해당 페이지 로딩 완료 시점
session 해당 컨텍스트 내 특정 파일 요청 시점 웹 브라우저 종료 or 일정시간 경과 시점
application 웹 에플리케이션 시작 시점 웹 에플리케이션 종료 시점

 

 

[ request, session, application을 통해 관리할 수 있는 맵 형태의 속성 ]

request, session, application은 맵 형태의 속성을 관리하는 기능을 제공한다. 해당되는 메서드는 setAttribute()와 getAttribute()이다. JSP에서 내장 객체에서 다루는 속성의 의미는 "각 내장객체의 생명주기 내에서 관리될 수 있는 자바 Object 형태의 데이터"로 정의할 수 있다. 

 

내장객체에서 맵 기반으로 속성을 관리하는 기본적인 방법은 "이름(Name): 값(Value)"의 쌍으로 객체를 저장하는 것이다. 이러한 방식은 자바의 대표적인 자료구조 중 하나인 해시 맵과 유사하다.

 

[ 컨테이너 기반 프로그램의 특징과 JSP 내장객체 ]

프로그램 관점에서 컨테이너란 프로그램 실행에 관 연하면서 모듈화 된 프로그램을 실행할 수 있게 하고, 프로그램 간의 원활한 데이터(객체) 교환을 지원하는 소프트웨어를 말한다.

컨테이너 기반 프로그램의 장점은 다음과 같다. 

  1.  프로그램의 모듈화가 용이하다.
  2. 독립적으로 실행하는 모듈 간의 데이터 교환이 용이하다.
  3. 개별 프로그램에서 화면/상태 전환 시 데이터를 유지/관리하기 용이하다.
  4. JSP에서는 컨테이너에 의해 관리되는 내장 객체를 통해 임의의 객체를 각각의 생명주기 시점에 따라 공유할 수 있다.

 

※ JSP에서 내장객체를 이용한 속성 관리가 가능한 것은 JSP와 빈즈 객체들이 톰캣이라고 하는 컨테이너에 의해 관리되고 실행되기 때문이다. 

 

 

Document Reference: here
Comments