[JSP] 4.2 출력 버퍼

2022. 4. 7. 16:25JAVA/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 프로그래밍 기초부터 중급까지