▸JSP & Servlet/기본 문법

JSP 내장 객체_request, response, out [1/4]

코데방 2020. 2. 14.
728x90

[ JSP 내장 객체 ]

  • 개발자가 객체를 별도로 생성하지 않아도 JSP에서 바로 사용할 수 있는 객체
  • 컨테이너가 JSP를 서블릿으로 변환할 때 자동으로 객체가 생성됨
  • request, response, out, page, config, application, pageContext, exception, session

내장 객체는 말 그대로 JSP가 기본적으로 내장하고 있어서 따로 선언하거나 만들어줄 필요 없이 바로 사용 가능한 객체를 말합니다. 당연한 말이지만 모두 Java의 클래스 객체이므로 서블릿에서도 동일하게 사용이 가능합니다. 서블릿에서는 자동으로 생성되는 내장 객체는 아니지만 대부분 get 메소드를 이용해 객체를 얻어낼 수 있습니다. 

 

전반적인 구조에 대한 아래 링크글을 먼저 참조하시면 좀 더 이해가 수월할 수 있습니다.

 

JSP 내장객체의 구조와 생명주기 (session / config / application )

 

 


 

 

[ request - javax.servlet.http.HttpServletRequest 객체]

  • 생성 : 클라이언트 요청 시
  • 소멸 : 요청에 대한 처리 완료 시
  • 사용 범위 : 요청을 처리하기 위한 하나의 스레드

서블릿의 request 객체와 같은 클라이언트가 요청한 정보에 대한 객체입니다. 컨테이너는 요청된 데이터를 바탕으로 HttpServletRequest 객체를 만들어서 전달해줍니다.

 

가장 주요한 메소드는 사용자가 입력한 요청 데이터를 받아오는 작업입니다. 아래 네 가지 메소드를 이용해 값을 가져옵니다.

 

request 주요 메소드 설명
String getParameter(String name) name(변수이름, 파라미터)의 값을 가져옴
String[] getParameterValues(String name) name의 값이 1개 이상일 때 값을 모두 가져옴
Enumeration<String> getParameterNames() 모든 파라미터 name을 반환 (값이 아닌 변수 이름)
Map<String, String[]> getParameterMap() 모든 파라미터 name과 value를 Map으로 반환

 

 

직관적인 메소드라 사용법은 간단합니다. 하나씩 파라미터에 대한 값을 가져올 수도 있고, 아래 코드와 같이 한번에 다 가져올 수도 있습니다. value 값의 갯수가 일정하지 않을 때는 Map에 담아서 value는 하나이건 여러 개이건 모두 배열 형태로 담아와 처리해주면 됩니다.

 

	Map<String, String[]> arr = request.getParameterMap();

			for (String a : arr.keySet()) {
				
				System.out.println(Arrays.toString(arr.get(a)));
			}

 

 


 

 

request 객체는 최종적으로 클라이언트에게 응답되기 전까지는 계속 유지됩니다. 하나의 요청을 처리하는 스레드에서 용도를 다할 때까지 계속 공유되는 객체기 때문에 <jsp:forward>와 같이 다른 페이지로 흐름 제어를 넘기는 경우에도 같은 request 객체가 유지됩니다. 따라서 아래 메소드를 사용해서 request 객체에 별도의 정보를 넣은 뒤 다른 페이지로 넘길 수 있습니다.  <jsp:param> 태그로 파라미터를 넘겨주는 것과 동일한 효과이지만 정보의 묶음인 '객체'의 전달이 가능합니다. 서블릿에서는 액션 태그가 없기 때문에 아래 메소드를 통해서 추가적인 객체를 request에 담아줄 수 있습니다. 

 

Parameter는 사용자가 보낸 정보고 Attribute는 개발자가 필요에 의해 첨부된 별도의 객체 모음입니다. 

 

request 주요 메소드 설명
String setAttribute(String name, Object o) request 객체에 'name' 이름의 Object 객체를 첨부함
Object getAttribute(String name) request 객체에 첨부된 'name' 이름의 값을 가져옴
Enumeration<String> getAttributeNames() request 객체에 첨부된 모든 'name' 이름을 가져옴
void removeAttribute(String name) request 객체에 첨부된 'name' 이름의 객체를 제거함

 

 


 

 

클라이언트가 보낸 데이터가 아닌, 부가적인 정보를 담은 헤더의 정보를 얻어오는 메소드들도 있습니다. 아래 메소드 외에도 여러 가지가 있는데 필요할 때 찾아서 쓰면 될 것 같습니다. 

 

request 주요 메소드 설명
String getRequestURL() 요청한 URL 전체의 값을 가져옴
String getRequestURI() 서비스 포트 뒤의 주소를 가져옴
String getProtocol() 사용 중인 프로토콜 정보를 가져옴
String getQueryString() 쿼리 스트링 값을 가져옴
String getMethod() 요청 방식(GET, POST 등)을 리턴
String getRemoteAddr() 요청 클라이언트의 IP주소 리턴

 

 

 


 

 

[ response - javax.servlet.http.HttpServletResponse 객체 ]

  • 생성 : 클라이언트 요청 시
  • 소멸 : 요청에 대한 처리 완료 시
  • 사용 범위 : 요청을 처리하기 위한 하나의 스레드

클라이언트에게 회신을 보내주는 응답 객체입니다. 출력 자체는 HTML 코드나 out 객체를 통해 하면 되는데 헤더 정보에 추가로 내용을 넣는다거나 쿠키를 전송한다거나 클라이언트의 페이지가 쿼리스트링을 가지고 다른 페이지로 이동할 수 있게끔 한다거나 하는 용도로 사용됩니다. 또한 서블릿에서는 출력 스트림인 PrintWriter 객체를 얻을 때 response 객체의 getWriter() 메소드를 통해 얻습니다. 응답을 해주는 객체니 출력스트림도 response에서 얻는 것입니다. 

 

헤더 정보를 전송하는 기능은 주로 브라우저에 표현되는 내용을 다루는 프론트엔드 개발자가 다루는 내용입니다. 예를 들어 브라우저가 캐시값을 저장하고 있다가 특정 상황에서 서버에 요청하지 않고 바로 사용자에게 저장된 캐시값을 보여주는 경우가 있습니다. 만약 DB에서 값이 바꼈는데 캐시값을 출력하게 되면 문제가 생길 수 있으므로 Cache-Control 헤더 값에 캐시를 사용하지 않고 무조건 서버에 요청하도록 할 수 있습니다.

 

response 주요 메소드 설명
void setHeader(String name, String value) 'name' 헤더값의 value를 지정(문자형)
void setIntHeader(String name, int value) 'name' 헤더값의 value를 지정(정수형)
void setDateHeader(String name, long date) 'name' 헤더값의 value를 지정(날짜형)
addHeader(String name, String value) 'name' 헤더에 value값을 추가(문자형)
addIntHeader(String name, int value) 'name' 헤더에 value값을 추가(정수형)
addDateHeader(String name, long date) 'name' 헤더에 value값을 추가(날짜형)

 

 


 

 

response 응답 객체를 주로 사용하는 경우는 클라이언트의 페이지를 리다이렉트 시킬 때입니다. 클라이언트가 요청한 페이지에서 추가적인 파라미터와 함께 다른 페이지로 전환시키는 것을 리다이렉트라고 합니다. 액션태그의 forward와 다른점은 forward는 자바 내부에서 URI를 찾아 다른 페이지로 넘어가 수행한 뒤 결과를 회신하는 것이고, response의 리다이렉트는 해당 페이지가 클라이언트에게 응답객체를 보내 다시 클라이언트측에서 전송된 URI로 자동 접속하도록 만든다는 점입니다. URI에는 쿼리 스트링을 포함할 수 있으므로 클라이언트가 호출 시에 넘겨줘야 할 파라미터를 같이 보낼 수 있습니다.  

 

response 주요 메소드 설명
void sendRedirect(String location) 지정된 URI를 클라이언트측에서 재호출 하도록 함

 

		response.sendRedirect("join.do?id=codevang&pw=12345");
		System.out.println(request.getParameter("id"));
		System.out.println(request.getParameter("pw"));

 

 

* forward와 sendRedirect의 차이

 

<jsp:forward>

  • 서버 내에서 다른 페이지로 넘겨 로직 수행 후 클라이언트에게 응답
  • 클라이언트측에서는 해당 과정을 인지할 수 없음 (URI 주소가 바뀌지 않음)

response.sendRedirect()

  • 응답 객체와 함께 해당 페이지에서 클라이언트로 결과 회신
  • 클라이언트가 response 객체에서 받은 URI를 재호출
  • 클라이언트측에서 해당 과정을 인지할 수 있음 (URI 주소가 바뀜)

 

 


 

 

서블릿이나 JSP에서 reponse 객체를 자주 쓰는 용도 중 하나는 쿠키 정보를 보낼 때 입니다. 쿠키(Cookie)는 클라이언트의 브라우저에 특정한 데이터를 임시로 저장시켜놨다가 필요할 때 찾아서 쓰는 데이터입니다. 쿠키를 브라우저에 보내는 역할은 response이고 쿠키 정보를 가져오는 역할은 request 입니다. 자세한 내용은 쿠키와 세션 정리글을 참조 부탁드립니다.

 

2020/02/18 - [· JSP & Servlet/- 기본 문법] - 쿠키(Cookie)

2020/02/17 - [· JSP & Servlet/- 기본 문법] - JSP 내장 객체_session (쿠키와 세션) [4/4]

 

response 주요 메소드 설명
void addCookie(Cookie cookie) 클라이언트 브라우저에 쿠키 정보를 삽입함

 

 

 


 

 

[ out - javax.servlet.jsp.jspWriter 객체 ]

  • 생성 : 클라이언트 요청 시
  • 소멸 : 요청에 대한 처리 완료 시
  • 사용 범위 : 요청을 처리하기 위한 하나의 스레드

클라이언트로 데이터를 전송하는 출력 스트림입니다. 출력되는 내용들은 모두 버퍼에 담았다가 한번에 보내게 됩니다. 서블릿의 FileWriter 객체와 동일한 역할을 가지는 내장 객체이고, 뷰(View)의 역할을 하는 JSP답게 서브릿에서 귀찮게 만들어줘야 하는 출력 스트림을 내장 객체로 가지고 있어 바로 사용할 수 있어 편리합니다. HTML에서는 body에 그냥 텍스트를 입력하면 되지만 스크립트릿<% %> 안에서 HTML 코드를 섞지 않고 바로 출력할 수 있게 해줍니다.

 

물론 서블릿으로 변환되면 HTML 코드도 모두 out 객체(출력 스트림)을 통해 전송되고, 기본적으로 일단 버퍼에 담았다가 한번에 출력하는 버퍼 스트림입니다. NIO의 채널 방식과 달리 out의 버퍼는 flush(버퍼에 있는 내용을 모두 출력)에 신경쓰지 않아도 알아서 마지막에 출력을 해줍니다. 하지만 조금 더 버퍼 사용을 세밀하게 하고 싶다면 제어도 가능합니다.

 

out 주요 메소드 설명
void println() 클라이언트에게 출력 (HTML 소스에 개행문자 적용)
void print() 클라이언트에게 출력 (개행문자 없음)
int getBufferSize() 출력 버퍼의 전체 크기를 리턴
int getRemaining() 출력 버퍼에서 현재 남아있는 크기를 리턴
void flush() 버퍼에 있는 내용을 모두 전송하고 비움
void clearBuffer() 버퍼에 쌓인 내용을 모두 삭제 (전송하지 않음)
void close() 출력 버퍼에 저장된 내용을 모두 전송하고 스트림을 닫음

 

println() 은 개행문자(엔터, '\n')를 포함하는 메소드고 print()는 개행문자를 포함하지 않습니다. 하지만 둘 다 시도해보면 둘 다 줄바꿈은 일어나지 않습니다. 이는 개행문자가 HTML 코드에 적용되기 때문입니다. 예를 들어 아래 코드로 JSP를 작성하고 HTML 소스를 보면 코드상에서 개행문자가 작동한 것을 알 수 있습니다. HTML에서 줄을 바꾸면 띄워쓰기로 인식해서 줄바꿈이 아닌 공백이 생긴 것을 알 수 있습니다.

 

<%
	out.println("안녕");
	out.println("하세요.");
%>
<br/>
<%
	out.print("안녕");
	out.print("하세요.");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

안녕
하세요.

<br/>
안녕하세요.
</body>
</html>

 

728x90

댓글

💲 추천 글