본문 바로가기
Java/JSP & Servlet

[JSP & Servlet] 5. JSP 내장 객체 및 매서드

by Rosmary 2022. 10. 27.
728x90
반응형

 

 

 

 

JSP에 작성된 태그 중 input 이라는 태그가 존재한다. 이 태그는 브라우저 사용자로부터 입력값을 받는데 사용한다. 예를 들어 필자가 사용자로부터 계정 ID와 비밀번호를 입력받는 JSP 페이지를 만든다면 아래와 같은 형태의 HTML 코드가 나타날 것이다.

 

 

 

사용자가 입력한 계정 정보는 빈 값이 아닌지, 아니면 비밀번호가 일치하지 않는지 확인하는 과정을 거쳐야하기 때문에 이 기능을 수행하는 다른 JSP 파일이나 Servlet으로 입력한 값을 전달할 수 있어야 한다. 하지만 현재 상태에서 "로그인" 버튼을 누르면 아무런 일도 일어나지 않음을 확인할 수 있다.

 

앞서 필자가 작성한 액션 태그 포스팅의 마지막 부분에서 사용자가 입력한 값은 <form> 태그나 <jsp:param> 액션 태그를 통해 다른 파일로 전달하는 과정을 보여주었다. 그런데, 입력값들을 처리하는 파일은 request객체의 getParameter() 매서드로 받아들이고, out 객체의 write()이나 println() 매서드로 이들 값을 화면에 출력한다. 방금 만든 index.jsp에서 checkInput.jsp라는 파일로 이들 값을 넘기도록 <form> 태그를 작성하고 입력값을 화면에 출력해보려 한다.

 

 

 

분명 필자는 Servlet 코드에서 request라는 객체를 선언해 준 적이 없는데, 어떻게 request 객체를 사용할 수 있는 것일까? 

 

Tomcat의 JSP 컨테이너는 JSP 파일을 Servlet으로 변환할 때, Servlet에서 유용하게 사용할 수 있는 몇몇 객체를 자동으로 생성한다. 보통 이들 객체는 사용자의 요청을 받아들이거나(request), 요청에 응답하거나(response), 세션(session) 수립 및 기타 설정 확인(config)와 관련된 기능을 수행한다. 이렇게 JSP컨테이너에 의해 JSP 파일이 Servlet으로 변환되는 과정에서 Servlet의 기능과 관련되어 자동으로 생성되는 객체들을 내장 객체라고 한다.

 

이번 포스팅에서는 Servlet의 내장 객체 종류와 자주 사용하는 매서드, 그리고 Servlet 파일에서 최소한도로 작성해야 하는 기본 코드와 문법에 대해 알아보려한다.

 

 

 

1. 내장 객체의 종류

 

JSP에서 제공하는 내장 객체는 총 9가지다. 내장 객체의 일부는 JSP, Servlet을 사용할 수 있도록 하는 javax.servlet 혹은 jakarta.servlet 패키지 내에 정의된 클래스로부터 생성된다. Tomcat이 설치된 폴더의 lib 폴더를 보면 servlet_api.jar라는 압축 파일이 보일텐데, 이 파일에 압축되어 존재하는 클래스로부터 내장 객체가 생성된다.

 

 

 

JSP에서 Servlet으로 변환될 때 생성되는 내장객체와 이들이 참조하는 클래스 및 기능은 아래와 같다.

 

내장 객체 참조 클래스 기능
out java.io.PrintWriter
javax.servlet.jsp.jsp.jspWriter
출력 스트림 객체로 브라우저 화면 출력과 관련된 기능을 수행
request javax.servlet.HttpServletRequest 브라우저 통신에서 요청(Request) 처리 기능 수행
response javax.servlet.HttpServletResponse 브라우저 통신에서 반응(Response) 처리 기능 수행
session javax.servlet.http.HttpSession 브라우저 통신에서 정보를 기억하기 위한 세션 수립과 관련된 기능을 수행
config javax.servlet.ServletConfig JSP 페이지의 설정 정보 처리 기능 수행
application javax.servlet.ServletContext Webapp의 Context 정보 처리
pageContext javax.servlet.jsp.PageContext JSP를 구현한 Java 페이지. 일부 내장 객체는 pageContext로부터 최종 생성
page java.lang.Object 페이지 호출로 생성된 Servlet 객체.
exception javax.lang.Throwable Servlet 실행 중 발생한 예외 처리를 수행

 

설치한 tomcat 버전에 따라 javax가 아닌 jakarta로 표시되는 경우도 있다

 

 

이들 내장 객체는 모두 Servlet 파일의 service() 매서드 내에 존재하기 때문에 Scriptlet에서만 사용이 가능하다. 따라서 계정 정보를 getParameter로 받는 예제에서 이 코드를 Scriptlet이 아닌 Declaration(선언자)에서 사용하게 되면 찾을 수 없는 객체라며 에러가 발생하게 된다.

 

 

 

하나의 포스팅에서 전부 다루기에는 어려움이 있으니, 기본 단계에서 자주 사용하는 내장 객체, 또는 알고 있으면 좋은 내장 객체의 기능에 대해서만 다루려 한다.

 

 

 

2. 내장 객체 매서드

 

(1) PageContext 내장객체

 

PageContext 내장 객체는 JSP 파일을 구현하는 Java 페이지다. 

 

 

웹의 context(문맥) 정보를 제공한다고 나와있는데, 이 context는 어떠한 객체를 다루기 위한 접근 수단이라 보면 된다. 따라서 pageContext 객체는 다른 내장 객체인 application, config, session 등의 객체를 포함하고 있으며, getXXX() 매서드를 통해 이들 내장 객체를 호출할 수 있다.

 

 

 

다른 내장 객체를 호출하는 것이 아니라면 크게 사용될 일이 없는 내장 객체다. pageContext의 매서드나 Enum 등의 정보가 기술된 Documentation은 아래의 링크를 참조하면 된다.

 

https://docs.oracle.com/javaee/7/api/javax/servlet/jsp/PageContext.html

 

PageContext (Java(TM) EE 7 Specification APIs)

This method shall "reset" the internal state of a PageContext, releasing all internal references, and preparing the PageContext for potential reuse by a later invocation of initialize(). This method is typically called from JspFactory.releasePageContext().

docs.oracle.com

 

 

 

(2) request, response 내장객체

 

웹 브라우저를 기반으로 하는 통신은 사용자의 요청(Request)을 받아들인 서버가 반응(Response)함으로써 진행된다. 따라서 request와 response는 JSP와 Servlet에서 out과 함께 가장 많이 사용되는 내장 객체다. 

 

Request는 사용자가 입력 또는 요청한 정보를 저장하고 처리하는 기능을 하기 때문에 매서드 역시 이와 관련된 기능으로만 구성되어 있다. 매서드 종류가 상당히 많기 때문에 기본 단계에서 사용할 수 있는 매서드만 추려서 소개하려한다.

 

[ request 내장객체 Method ]

-  getMethod()                                    : 사용자가 요청에 사용한 통신 프로토콜의 종류(GET/POST/PUT 등)를 반환.

-  getParameter("input 태그 ID")        : 사용자가 input 태그를 통해 입력한 정보를 받아들이는 기능을 함.

-  getContextPath()                            : 사용자가 Request로 응답을 받으려는 페이지의 Webapp 최상위 경로 반환.

-  getQueryString()                             : 사용자가 GET 프로토콜로 요청 시 입력값이 존재하는 경우, URL 뒤에 입력값 정보가 쿼리로 포함됨. getQueryString()은 URL의 쿼리 부분만 반환.

 

 

 

크게 설명이 필요하지는 않을 듯 하다. 사용자의 요청 정보를 객체 매서드로 호출한다는 관점에서 본다면 말이다. 단, getQueryString()의 경우 index.jsp가 post 프로토콜을 사용하기 때문에 getQueryString() 결과가 등장하지 않는다. 만약 index.jsp에서 form으로 checkInput.jsp 호출 시 get 방식을 사용하여 요청한다면 사용자가 입력한 id와 pw 값이 쿼리로 URL 뒤에 추가되는 것을 확인할 수 있다. 그리고 추가된 쿼리는 getQueryString() 결과로 반환됨을 확인할 수 있다.

 

 

 

response는 사용자로부터 들어온 요청에 대해 서버에서 반응하여 돌려주는 기능이 매서드로 정의되어 있다. 서버에서 사용자 요청에 따라 브라우저에 정상적인 응답을 돌려주는 경우가 대부분이다. 하지만 서버의 로직 상, 특정 URL을 호출할 때 에러 화면을 띄워야하는 경우, 혹은 다른 페이지 화면을 띄워주어야 하는 경우도 생긴다.

 

 

 

 

[ response 내장객체 Method ]

- getStatus():  http 통신의 응답 코드를 반환(응답 코드는 이 링크를 참고하자).

- sendRedirect("다른 페이지 경로"):  사용자 요청 시 다른 페이지로 요청을 전환.

- sendError(http 응답 Error 코드):  사용자 요청 시 특정 Error 화면을 반환.

 

 

request 내장 객체 테스트에 사용한 파일을 그대로 사용하되, 이번에는 checkInput.jsp 최상단에 Scriptlet을 적용하고 response 객체에 대한 테스트를 진행해보려한다. 먼저 getStatus로 응답 코드가 어떻게 돌아오는지 확인해보자. 정상적인 경우라면 200번 대의 번호가 출력될 것이다.

 

 

 

이번에는 필자가 동일하게 계정 정보를 입력하면 에러 페이지가 나타나도록 만들어보려한다. 500번대 응답 코드는 서버 내부의 문제로 인해 응답이 진행되지 않는 코드인데, 일부러 이 페이지가 나타나도록 Scriptlet에 sendError(500) 매서드를 적용하려한다.

 

 

 

마지막 매서드인 sendRedirect()는 별도의 파일을 하나 더 생성해야 한다. 필자는 단지 "리다이렉트 페이지로 이동함"이라는 문구와, 실제 리다이렉트 페이지가 맞는지 info 정보가 출력되도록 jsp 파일을 하나 생성하고, sendRedirect() 매서드의 인자로 생성한 jsp 파일을 명시해주었다.

 

 

 

 

 

(3) application 내장 객체

 

application 객체는 servlet의 외부 환경 정보를 나타내는 객체다. 지시자(Directive) 속성으로 작성하는 info 내용이나 호출된 페이지의 실제 파일 경로를 확인하거나 이벤트 로그를 기록하는 등의 기능을 매서드로 제공한다.

 

[ application 내장객체 Method ]

 

- getServletInfo() : 현재의 JSP 페이지에 작성된 지시자(Directive)의 info 속성을 문자열로 반환.

- getMimeType(filename) :  매개인자로 지정된 JSP 파일의 MIME 정보를 문자열로 반환.

- getRealPath(url): 호출 시 반응하는 JSP, Servlet 페이지의 서버 내 파일 경로를 문자열로 반환.

- log(message):  매개인자로 지정된 message를 이벤트로그로 기록한다.

 

 

 

getMimeType()은 페이지의 Mime 정보(text/html)를 반환하는 매서드다. 하지만 Mime 정보를 Servlet에서 확인할 수 없는 경우, null 값이 반환된다. 

 

로그 기록의 경우, tomcat의 logs 폴더 내 이벤트 로그 파일에 기록된다. 서버명으로 시작하는 파일인데, 이 파일은 페이지 호출 시 발생한 에러 등 특정 이벤트를 저장한다. application.log() 매서드는 매개인자로 사용한 메세지를 이 파일에 기록한다. 

 

 

 

 

 

(4) session 내장 객체

 

특정 웹 페이지에서 사용자가 로그인 한 뒤, 실수로 창을 닫았다고 생각해보자. 요즘 사용자들이 사용하는 대부분의 웹 페이지는 이렇게 실수로 창이 닫히더라도 다시 해당 주소로 들어가면 로그인 상태가 유지되도록 만들어져 있다. 이렇게 로그인 사용자에 대한 정보를 보존하기 위해 세션(session)이라는 것을 사용하는데, 내장 객체의 session은 이 세션을 관리하는 기능의 매서드가 정의되어 있다. 세션과 관련된 내용은 나중에 다른 포스팅에서 다룰 예정이라 이번에는 아주 간단한 예시를 통해 session 내장 객체 예시를 들어보려한다.

 

session 수립 확인을 위해 위에서 사용한 index.jsp 파일의 내용을 아래와 같이 변경했다.

 

 

 

계정 정보를 입력하고 로그인을 하면, 로그아웃 버튼을 누르지 않는 한 로그인 상태가 유지되도록 페이지를 만들었다. 로그인이 유지되는, 즉 세션이 유지되는 시간은 session.setMaxInactiveInterval() 매서드를 사용하는데, 매개변수로 세션을 유지할 시간을 정수형으로 지정하면 되며, 지정된 정수형의 초만큼 세션이 유지되도록 한다.

 

JSP에서의 세션 수립은 세션에 지정한 속성값을 사용한다. 만약 로그인이 되지 않은 상태라면 session.setAttribute() 매서드로 특정 속성의 값을 지정하면 되는데, 세션이 유지되는 동안 이 속성값도 함께 유지되기 때문이다. 만약 이 속성값이 null, 지정되지 않은 상태라면 로그인 계정 정보를 입력하는 페이지가 화면에 나타나고, 그렇지 않다면 세션 유지에 사용한 계정에 대한 환영 문구가 화면에 출력된다.

 

아이디 "abcd"로 로그인하였다.

 

 

그런데, index.jsp 파일을 보면 session의 속성값을 받아오는 getAttribute() 매서드만 정의되어 있을 뿐, setAttribute()는 어디에도 보이지 않는다. 이 setAttribute() 매서드는 입력값이 전달되는 loginValidate.jsp 파일에 작성되어 있다.

 

loginValidate.jsp 파일은 아래와 같이 작성되었다.

 

 

 

loginValidate.jsp 파일을 작성할 때 유의해야 할 점은 입력값을 전달받는 index.jsp 페이지와도 세션이 연결, 유지되어 있어야 하기 때문에 지시자(Directive) 내에 session 속성을 반드시 true 값으로 설정해주어야 한다는 것이다. 코드를 보면 index.jsp 파일에서 입력값이 공백이 아닌 경우 session의 "login" 속성값을 입력한 id 값으로 지정하도록 되어 있는데 만약 지시자의 session 속성값이 기본값인 false로 지정되어 있다면 index.jsp와 세션 수립이 불가능하기 때문에 index.jsp는 항상 로그인 계정 입력 화면만 나타나게 된다.

 

session.setAttribute()에 의해 "login" 속성값이 설정된다면, response 객체의 sendRedirect() 매서드를 통해 index.jsp 페이지로 돌아가게 된다. 다시 index.jsp 파일이 호출되면 session.getAttribute("login")은 첫 호출과 달리 입력한 id 값을 반환하기 때문에 로그인 유지 화면이 나타나게 된다.

 

index.jsp에서 session.setMaxInactiveInterval() 매서드로 세션 유지 시간을 10초로 설정했다. 만약 로그인 이후 아무 동작 없이 10초가 지나고 페이지 새로고침을 누르면 index.jsp는 다시 로그인 계정 입력 화면으로 돌아오게 된다. 

 

로그인 유지 화면의 아래에는 로그아웃 버튼이 있는데, 세션 유지 시간 내에 로그아웃 버튼을 클릭하면 현재의 세션 수립을 종료해야 index.jsp 페이지 호출 시 getAttribute("login")의 값이 null로 호출된다. 따라서 로그아웃 버튼을 누르면 연결되는 logout.jsp 파일은 세션 수립을 종료하는 session.invalidate() 매서드가 정의되어 있다.

 

loginValidate.jsp와 마찬가지로 지시자의 session 속성 값이 true로 설정된 것을 확인하자.

 

 

session.invalidate()에 의해 setAttribute()로 지정된 "login" 속성값이 사라지기 때문에, index.jsp 페이지를 다시 호출하는 경우 다시 계정 입력 창이 나타나게 된다. 

 

정리하자면 session 내장 객체는 여러 페이지에서 특정 사용자의 정보가 계속 유지되어 있어야 하는, 세션 수립과 관련된 기능을 매서드로 제공한다고 보면 된다.

 

 

[ session 내장객체 method ]

-  getId()                                        : 수립된 세션의 ID값 반환

-  getAttribute("속성")                    : 수립된 세션에 정의한 속성값을 Object 객체로 반환함.

-  getMaxInactiveInterval()            : 수립된 세션이 유지되는 시간을 정수형으로 반환

-  setAttribute("속성", 속성값객체) :  세션 수립 시 정의할 속성값을 설정.

-  setMaxInactiveInterval(a)           : 수립 세션을 유지할 최소 시간을 a초(second)로 설정

-  invalidate()                                  : 수립된 세션을 종료.

 

 

 

(5) exception 내부 객체

 

exception 내부 객체는 JSP와 Servlet 페이지 호출 시 에러가 발생하는 경우, 에러를 처리하기 위한 객체다. 따라서 일반 페이지에서는 사용할 일이 없고, 에러로 인해 연결되어야하는 페이지에서 주로 사용하게 된다. 

 

위의 로그인 예시에서 ID나 비밀번호 공백 입력 시 예외를 발생시키고, 이 예외를 error1.jsp에서 처리하도록 코드를 수정해보자. loginValidate.jsp가 로그인 검증을 진행하는 부분이니, 이 부분에 아래와 같이 예외 발생 코드와 errorPage 이동 속성을 지시자에 추가하면 된다.

 

 

 

에러 페이지인 error1.jsp는 지시자의 isErrorPage 속성을 true 값으로 설정해야 에러 페이지로 동작한다. 또한 에러 발생 시 에러 메세지와 에러 클래스 정보를 표시하기 위해 exception 객체의 getMessage() 및 toString() 매서드를 사용한다.

 

 

 

공백으로 로그인을 진행하면, error1.jsp 파일의 내용에 작성한 에러 관련 문구가 화면에 출력되는 것을 확인할 수 있다. getMessage()의 결과는 필자가 예외를 던지면서 지정한 메세지인 "일부러 유발한 에러 메세지"가 출력되며, toString()은 던져진 객체의 클래스 정보를 반환한다.

 

 

 

exception 내장 객체 역시, 에러 발생 페이지에서 에러의 매세지와 정보를 출력하는 것 이상으로는 아직 사용할 일이 없기 때문에 추후 예외 처리 관련하여 조금 더 심도있는 내용을 포스팅으로 작성할 때 다시 언급하려한다.

 

 


 

 

원래 이번 포스팅에서 Servlet의 기본 코드에 대해서도 다루려고 했는데, 생각보다 내장 객체 내용이 길어져 다음 포스팅에서 언급하려 한다. 다음 포스팅에서는 Servlet 파일을 동작하도록 만드는 최소한의 코드에 대해 알아보려한다.

 

 

 

 

반응형

댓글