[JSP] 4.2 출력 버퍼
2022. 4. 7. 16:25ㆍJAVA/Servlet&JSP
JSP 페이지는 생성된 결과를 곧바로 웹 브라우저에 전송하지 않고 출력 버퍼라고 불리는 곳에 임시로 출력 결과를 저장했다가 한번에 웹 브라우저에 전송합니다.
출력 버퍼의 장점
- 데이터 전송 성능이 향상됨
- 작은 단위로 데이터를 전송하는 것이 아니라 한번에 큰 단위로 데이터를 전송하는 것이 가능하기 때문입니다.
- 바로 브라우저에 전송되지 않기 때문에, JSP 실행 도중에 버퍼를 비우고 새로운 내용을 보여줄 수 있음
- 버퍼가 있기 때문에 <jsp:forward>나 에러 페이지 처러를 할 수 있음
- JSP 페이지가 생성한 내용이 있다 하더라도 버퍼에 저장된 데이터가 웹 브라우저로 전송되기 전까지는 버퍼를 비우고 새로운 내용을 입력할 수 있게 된다. 예를 들어, JSP 실행 과정에서 에러가 발생할 경우, 지금까지 생성한 내용을 버퍼에서 지우고 에러 화면을 출력할 수 있음
- 버퍼가 다 차기 전까지는 헤더를 변경할 수 있음
- 헤더 정보는 가장 먼저 웹 브라우저에 전송됨
- 버퍼의 내용을 웹 브라우저에 전송하기 전까지는 헤더 정보를 변경할 수 있음
1. page 디렉티브에서 버퍼 설정하기: buffer 속성과 autoFlush 속성
<%@ page buffer = "4kb" %>
<%@ page buffer = "none" %>
buffer="none"
- JSP 페이지가 출력하는 내용을 바로 웹 브라우저에게 전송함
- <jsp:forward> 기능을 사용할 수 없음
- 바로 전송되기 때문에 출력한 내용을 취소 불가능
플러시(Flush)란 무엇인가?
버퍼가 다 찼을 때, 버퍼에 쌓인 데이터를 실제로 전소오디어야 할 곳(또는 저장되어야 할 곳)에 전송하고(또는 저장하고) 버퍼를 비우는 것을 플러시라고 한다. 위의 그림에서 과정 3이 플러시 수행과정입니다.
page 디렉티브 autoFlush 속성
- true : 버퍼가 다 차면 버퍼를 비우고 계속해서 작업
- false : 버퍼가 다 차면 예외를 발생시키고 작업을 중지시킴
autoFlushFalse.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page buffer="1kb" autoFlush="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//이 부분에서만 4KB 이상 데이터가 생성된다.
for(int i=0;i<1000;i++){%>
1234
<%
}
%>
</body>
</html>
- buffer="1kb" : 버퍼의 사이즈를 1 킬로바이트로 설정
- autoFlush = "false" : autoFlush를 false로 설정하여 1kb를 초과하면 예외가 발생하고 작업을 중지함
Caused by: java.io.IOException: 오류: JSP 버퍼 오버플로우
at org.apache.jasper.runtime.JspWriterImpl.bufferOverflow(JspWriterImpl.java:151)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:330)
at java.base/java.io.Writer.write(Writer.java:249)
at org.apache.jsp.Chapter04._01_005fautoFlushFalse_jsp._jspService(_01_005fautoFlushFalse_jsp.java:131)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
... 25 more
실행 결과 위의 결과와 같이 버퍼 오버플로우가 발생한 것을 볼 수 있습니다.
autoFlushTrue.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page buffer="1kb" autoFlush="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
//이 부분에서만 4KB 이상 데이터가 생성된다.
for(int i=0;i<1000;i++){%>
1234
<%
}
%>
</body>
</html>
실행 결과 버퍼가 다 차게되면 버퍼를 비우고 작업을 계속 수행하는 것을 볼 수 있습니다.
References
source code : https://github.com/yonghwankim-dev/JSP2.0/tree/master/JSP/WebContent/Chapter04
JSP 2.0 프로그래밍 기초부터 중급까지
'JAVA > Servlet&JSP' 카테고리의 다른 글
[JSP] 5.1 기본 객체 (0) | 2022.04.07 |
---|---|
[JSP] 4.3 어플리케이션의 폴더 구조 (0) | 2022.04.07 |
[JSP] 4.1 JSP(Java Server Pages)의 처리 과정 (0) | 2022.04.07 |
[JSP] 2.6 JSP 기본 객체 : response (0) | 2022.04.07 |
[JSP] 2.5 JSP 기본 객체 : request (0) | 2022.04.07 |