WEB
Servlet 구조 분석(5) - ServletResponse
긍.응.성
2020. 4. 18. 19:40
반응형
Servlet 구조 분석(4) - ServletRequest 에 이어서, Servlet interface의 service 메서드의 파라미터로 들어오는 응답, ServletRespone에 대해 분석해보았습니다.
void service(ServletRequest request, ServletResponse response) // in interface Servlet
7. Interface ServletResponse
서블릿이 클라이언트에 응답을 보내는데 필요한 객체를 정의한다. 서블릿 컨테이너는 ServletResponse 객체를 생성 후 service 메서드의 파라미터로 전달한다.
Response Body로 데이터를 보내는 방법은 두 가지가 존재한다.
- getOutputStream(): ServletOutputStream - Binary data를 전송 또는 Binary + Text data
- getWriter(): PrintWriter - Character data 전송
전송하려는 Response Body 데이터는 web-app의 ServletContext에서 지정한 characterEncoding 방식을 통해 인코딩 된다.
두 개 이상의 인코딩 기술이 지정되어 있다면 순서를 우선순위로 두고 인코딩에 사용한다.
request마다 아래의 얻을 수있는 아래의 값들을 이용하며 참조하며, 아무것도 지정되지 않았을 경우 ISO-8859-1을 따른다.
- setCharacterEncoding(String)
- setContentType(String)
- setLocal(Local)
세 메서드들은 모두 적어도 Writer를 부르기 전에 호출되어야 하고, 응답이 commit 되기 전 encoding 되어야 한다.
package javax.servlet;
...
public interface ServletResponse {
String getCharacterEncoding();
// character encoding(MIME charset) 의 이름을 반환한다
// ex> UTF-8
String getContentType();
// 응답 바디에 대한 Content type을 반환한다
// 응답 바디가 commit되기 전에 반드시 setContentType이 지정되어야 한다.
// ex> text/html; charset=UTF-8
// ex> null (아무 content-type 도 지정되지 않았을 때)
ServletOutputStream getOutputStream() throws IOException;
// Binary data response를 전송하기위한 ServletOutputStream(outputStream)을 반환한다.
// 서블릿 컨테이너는 binary data 이므로 encode 하지않는다
// getWriter() 메서드와 이 메서드 중 하나만 사용되어야 한다
// 직전에 reset()을 호출했다면 이전에 getWriter()를 호출했어도 이 메서드를 사용 가능하다
PrintWriter getWriter() throws IOException;
// Character data Response를 전송하기 위한 PrintWriter를 반환한다
// 지정된 encoding방식으로 인코딩한다 (지정되지 않았다면 ISO-8859-1 을 따른다)
// getOutputStream() 메서드와 이 메서드 중 하나만 사용되어야 한다
// 직전에 reset()을 호출했다면 이전에 getOutputStream()을 호출했어도 이 메서드를 사용 가능하다
void setCharacterEncoding(String charset);
// Client에게 함께 보내질 Response의 인코딩 방식을 지정한다
void setContentLength(int len);
// 전송하는 Body의 길이이다.
// HTTP에서 Content-Length 헤더의 값으로 사용된다
void setContentLengthLong(long len);
// setContentLength와 같으나 자료형이 long 형이다, 더 긴 body에 대해 처리할 수 있다
void setContentType(String var1);
// Client에게 전송될 response의 content-type을 지정한다.
// write하기 전에지정되어야 만 한다
// HTTP에서 Content-Type 헤더의 값으로 사용된다.
void setBufferSize(int size);
// 선호하는 응답 바디의 버퍼 크기를 지정한다
// 입력받은 사이즈보다 에서 서블릿 컨테이너는 최대한 작은 사이즈로 버퍼크기를 지정한다 (알뜰하다)
// 버퍼사이즈가 크면 더 많은 내용을 한번에 보내고 그 만큼 Header와 Status code를 작성하는 시간이 줄어든다
// 버퍼사이즈가 작으면 서버의 memory를 적게 사용할 수 있으며, 빠른 응답이 가능하다
int getBufferSize();
// 응답 버퍼의 사이즈를 반환한다. 버퍼를 사용하지 않으면 0을 반환한다
void flushBuffer() throws IOException;
// 버퍼의 내용을 강제로 클라이언트에게 전송한다. 이때 header와 status code가 작성된다.
void resetBuffer();
// Header와 status code를 남기고 buffer를 비운다
// IllegalStateException: 전송을 마친 상태에 발생하는 예외
boolean isCommitted();
// Response가 commit되었는지 여부를 반환한다
void reset();
// buffer에 존재하는 데이터와 status code, header등을 모두 비운다.
// getWriter(), getOutputStream() 도 초기화된다.
void setLocale(Locale loc);
// 응답의 locale을 지정한다
// 응답은 commit되지 않은 상태여야만 한다
// HTTP에서 Content-Language 헤더의 값을 결정하는 요인이된다.
Locale getLocale();
// 응답의 Locale 값을 반환한다
}
※ 참고자료
반응형