JSP(JavaServer Pages)는 웹 애플리케이션 개발을 위한 서버 측 스크립팅 언어로, 동적인 웹 페이지를 쉽게 생성할 수 있도록 지원합니다. JSP 컨테이너는 각 JSP 페이지마다 여러 개의 미리 정의된 Java 객체를 제공하는데, 이를 내장 객체(Implicit Objects)라고 합니다. 개발자는 이러한 내장 객체를 별도의 선언 없이 즉시 사용할 수 있어 개발 생산성을 높일 수 있습니다.
JSP에서 제공하는 주요 내장 객체는 다음과 같습니다.
- request: 클라이언트의 HTTP 요청을 나타내는
HttpServletRequest인터페이스의 인스턴스입니다. 요청 헤더, 파라미터, 쿠키 등의 정보를 담고 있습니다. - response: 서버가 클라이언트에게 보낼 HTTP 응답을 나타내는
HttpServletResponse인터페이스의 인스턴스입니다. 응답 헤더, 상태 코드, 쿠키 설정 등을 제어할 수 있습니다. - out: 클라이언트에게 전송될 응답 내용을 출력하는
JspWriter클래스의 인스턴스입니다. 버퍼링 기능을 지원하며,print(),println()등의 메소드를 통해 데이터를 출력합니다. - session: 클라이언트와 서버 간의 세션 상태를 유지하는
HttpSession클래스의 인스턴스입니다. 사용자의 로그인 상태나 장바구니 정보 등 여러 요청에 걸쳐 유지되어야 하는 데이터를 저장하는 데 사용됩니다. - application: 웹 애플리케이션 전체에 대한 정보를 담고 있는
ServletContext클래스의 인스턴스입니다. 애플리케이션의 초기화 파라미터나 공유 자원에 접근하는 데 사용됩니다. - config: 현재 JSP 페이지에 대한 서블릿 설정을 담고 있는
ServletConfig클래스의 인스턴스입니다. 주로 서블릿 초기화 파라미터를 읽어오는 데 사용됩니다. - pageContext: JSP 페이지의 컨텍스트 정보를 제공하는
PageContext클래스의 인스턴스입니다. 다른 내장 객체들에 접근할 수 있으며, 페이지의 속성(attribute) 관리 및 스코프(scope) 제어 기능을 제공합니다. - page: 현재 JSP 페이지의 인스턴스를 참조하는 객체로, Java 클래스의
this키워드와 유사합니다. - Exception: JSP 페이지 실행 중 발생한 예외 객체를 담고 있는
Exception클래스의 인스턴스입니다. 오류 처리 페이지에서 사용됩니다.
request 객체 활용
request 객체는 클라이언트가 서버로 보낸 모든 요청 정보를 담고 있습니다. 이를 통해 개발자는 사용자가 입력한 폼 데이터, URL 파라미터, HTTP 헤더 정보 등을 얻어올 수 있습니다. 예를 들어, 폼에서 전송된 "username"이라는 파라미터 값을 가져오려면 다음과 같이 사용할 수 있습니다.
String userId = request.getParameter("username");
String userAgent = request.getHeader("User-Agent");
response 객체 활용
response 객체를 사용하면 서버에서 클라이언트로 보내는 응답을 커스터마이징할 수 있습니다. 예를 들어, 특정 URL로 클라이언트의 브라우저를 리디렉션시키거나, 쿠키를 설정하는 등의 작업이 가능합니다.
// 3초 후 지정된 URL로 리디렉션
response.setHeader("Refresh", "3;url=/new_page.jsp");
// 쿠키 설정
Cookie cookie = new Cookie("session_id", "12345abc");
response.addCookie(cookie);
out 객체 활용
out 객체는 JSP 페이지의 내용을 HTML로 렌더링하는 데 핵심적인 역할을 합니다. print() 메소드는 인자로 전달된 데이터를 그대로 출력하고, println() 메소드는 데이터를 출력한 후 줄바꿈을 추가합니다. 버퍼링을 사용하지 않으려면 page 지시어에서 buffer="false" 속성을 설정할 수 있습니다.
<%-- 일반적인 출력 --%>
<%= out.print("Hello, World!") %>
<%-- 줄바꿈 포함 출력 --%>
<%= out.println("This is a new line.") %>
<%-- 버퍼 플러시 --%>
<% out.flush(); %>
session 객체 활용
session 객체는 특정 클라이언트와 서버 간의 상호작용을 추적하는 데 사용됩니다. 사용자가 웹사이트를 방문하여 로그인하면, 해당 사용자의 세션 정보는 서버에 유지되며, 이후 요청에서도 동일한 세션 정보를 공유할 수 있습니다. 데이터를 세션에 저장하거나 조회할 때는 setAttribute() 및 getAttribute() 메소드를 사용합니다.
// 세션에 사용자 정보 저장
session.setAttribute("user_email", "test@example.com");
// 세션에서 사용자 정보 조회
String loggedInUser = (String) session.getAttribute("user_email");
// 세션 만료 또는 무효화
session.invalidate();
application 객체 활용
application 객체는 웹 애플리케이션의 모든 JSP 페이지와 서블릿이 공유하는 정보를 저장하는 데 사용됩니다. 애플리케이션이 시작될 때 생성되어 종료될 때까지 유지됩니다. 예를 들어, 데이터베이스 연결 풀 설정이나 전체 웹사이트에 적용되는 설정을 저장할 수 있습니다.
// application에 속성 저장
application.setAttribute("db_connection_count", 10);
// application에서 속성 조회
Integer connectionCount = (Integer) application.getAttribute("db_connection_count");
config 객체 활용
config 객체는 해당 JSP 페이지나 서블릿의 초기화 파라미터에 접근하는 데 사용됩니다. 이러한 파라미터는 web.xml 파일이나 @WebServlet 어노테이션의 initParams 속성을 통해 설정됩니다. 일반적으로 JSP에서는 자주 사용되지 않지만, 특정 설정을 동적으로 로드해야 할 때 유용할 수 있습니다.
<%-- 서블릿 이름 가져오기 (web.xml 또는 어노테이션 기반 설정 필요) --%>
String servletName = config.getServletName();
pageContext 객체 활용
pageContext 객체는 JSP 페이지의 전체적인 컨텍스트를 관리하며, 다른 내장 객체들에 대한 접근을 용이하게 합니다. 또한, 페이지 레벨의 속성을 관리하는 데 주로 사용됩니다. setAttribute(), getAttribute(), removeAttribute() 메소드를 사용하여 PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE, APPLICATION_SCOPE 등 다양한 스코프에 걸쳐 속성을 관리할 수 있습니다.
// 페이지 스코프에 속성 저장
pageContext.setAttribute("page_variable", "This is local", PageContext.PAGE_SCOPE);
// 요청 스코프에 저장된 속성 제거
pageContext.removeAttribute("request_data", PageContext.REQUEST_SCOPE);
page 객체
page 객체는 현재 JSP 페이지의 인스턴스를 가리키는 Java 객체입니다. 이는 현재 JSP 페이지를 나타내는 this와 같은 역할을 합니다. 특정 상황에서 페이지 자체의 메소드를 호출하거나 멤버 변수에 접근해야 할 때 사용될 수 있지만, 일반적인 웹 개발에서는 자주 직접적으로 사용되지 않습니다.
exception 객체
exception 객체는 JSP 페이지 실행 중 발생한 예외를 담고 있습니다. 이 객체는 isErrorPage="true" 속성이 설정된 오류 처리 페이지에서만 사용할 수 있습니다. 이를 통해 오류의 원인을 파악하고 사용자에게 적절한 오류 메시지를 제공하는 데 활용됩니다.
<%-- 오류 처리 페이지에서 예외 메시지 출력 --%>
<% if (exception != null) { %>
<p>An error occurred: <%= exception.getMessage() %></p>
<% } %>