출력 버퍼와 응답

de_sj_awa·2021년 5월 20일
0

1. 출력 버퍼와 응답

JSP 페이지는 응답 결과를 곧바로 웹 브라우저에 전송하지 않는다. 대신 출력 버퍼(buffer)라고 불리는 곳에 임시로 응답 결과를 저장했다가 한 번에 웹 브라우저에 전송한다.

JSP 페이지가 생성하는 출력 내용을 버퍼에 저장했다가 한꺼번에 웹 브라우저에 전송할 때 생기는 장점은 다음과 같다.

  • 데이터 전송 성능 향상
  • JSP 실행 도중에 버퍼를 비우고 새로운 내용 전송 가능
  • 버퍼가 다 차기 전까지 헤더 변경 가능

버퍼를 사용하면 성능이 향상되는데, 그 이유는 작은 단위로 데이터를 전송하는 것이 아니라 한 번에 큰 단위로 데이터를 전송하는 것이 가능하기 때문이다. 네트워크를 비롯한 모든 데이터 교환에서는 작은 단위를 여러 차례 보내는 것보다, 큰 단위로 한 번에 묶어서 보내는 것이 더 높은 성능을 발휘하게 된다.

출력 버퍼를 사용하는 이유는 네트워크를 통한 데이터 교환을 하려면 패킷을 만들어서 보내야 하는데, 이 자체가 비용이 들기 때문이다. HTTP 2까지는 tcp 프로토콜을 따르기 때문에 패킷을 만들어 데이터를 전송하게 된다.

두 번째 장점은 버퍼를 사용함으로써 <jsp:forward> 기능과 에러 페이지 처리 기능이 가능하다는 점이다. JSP 페이지가 생성한 결과를 일단 버퍼에 저장하기 때문에, 버퍼에 보관된 데이터가 일정 크기가 될 때까지 웹 브라우저에 전송되는 데이터는 없다. 따라서, JSP 페이지가 생성한 내용이 있다 하더라도 버퍼에 저장된 데이터가 웹 브라우저로 전송되기 전까지는 버퍼에 보관된 데이터를 지우고 새로운 내용을 전송할 수 있다. 예를 들어, JSP 실행 과정에서 에러가 발생하면, 지금까지 생성한 내용을 버퍼에서 지우고 에러 화면을 출력할 수 있다.

마지막으로 버퍼가 다 차기 전에는 헤더 정보를 변경할 수 있다. HTTP 프로토콜의 구조상 응답 상태 코드와 함께 가장 먼저 헤더 정보를 웹 브라우저에 전송해야 한다. 이런 이유로 WAS는 처음 버퍼의 내용을 웹 브라우저로 전송하기 전에 헤더 정보를 전송한다. 따라서 첫 번째로 버퍼의 내용을 웹 브라우저에 전송하기 전까지는 헤더 정보를 얼마든지 변경할 수 있다. 하지만, 일단 버퍼의 내용이 웹 브라우저에 전송되면 그 이후로는 헤더 정보를 변경해도 적용되지 않게 된다.

2. page 디렉티브에서 버퍼 설정하기 : buffer 속성과 autoFlush 속성

page 디렉티브는 buffer 속성을 제공하고 있다. 이 buffer 속성을 사용하면 JSP 페이지가 사용할 버퍼를 설정할 수 있다. buffer 속성은 JSP 페이지가 사용할 버퍼의 크기를 지정할 때 사용하며, 다음과 같이 킬로바이트 단위로 버퍼의 크기를 지정한다.

<%@ page buffer = "4kb" %>

buffer 속성값에 kb를 붙이지 않으면 JSP 페이지를 자바 코드로 변환하는 과정에서 에러가 발생한다. 즉, 버퍼는 킬로바이트 단위로 지정할 수 있다.

일반적으로 JSP 페이지를 작성할 때에는 buffer 속성을 지정하지 않는다. JSP 규약은 buffer 속성을 지정하지 않으면 최소한 8KB 이상의 크기를 갖는 버퍼를 사용하도록 규정하고 있다.

버퍼를 사용하고 싶지 않다면 buffer 속성의 값을 다음과 같이 "none"으로 지정하면 된다.

<%@ page buffer = "none" %>

buffer 속성의 값을 "none"으로 지정하면 JSP 페이지가 출력하는 내용을 곧바로 웹 브라우저에 전송하기 때문에, 다음고 같은 기능을 사용하는 데 제한이 따른다.

  • <jsp:forward> 기능을 사용할 수 없다.
  • 곧바로 전송되기 때문에 출력한 내용을 취소할 수 없다.

위와 같은 제한이 있기 때문에, buffer 속성의 값을 "none"으로 지정하는 경우는 거의 없지만, 이런 설정도 있다는 정도는 알도록 하자.

버퍼가 다 차면 JSP 페이지는 버퍼의 내용을 웹 브라우저에 전송한 후 버퍼를 비우고 새롭게 버퍼의 내용을 채우기 시작한다. 아래의 그림은 버퍼의 동작 방식을 보여주고 있다.

위의 그림의 3번 과정에서 출력 버퍼에 보관된 데이터를 웹 브라우저에 전송하는데, 이때 버퍼에 보관된 응답 데이터를 전송하기 전에 응답 상태 코드와 응답 헤더를 먼저 전송한다. 따라서 이후에는 응답 헤더 값을 변경해도 웹 브라우저에 전송되지 않고 무시한다.

플러시(flush)
버퍼가 다 찼을 때, 버퍼에 쌓인 데이터를 실제로 전송되어야 할 곳(또는 저장되어야 할 곳)에 전송하고(또는 저장하고) 버퍼를 비우는 것을 플러시라고 한다. 위의 그림의 과정 3에서 플러시하는 것을 보여주고 있다.

page 디렉티브는 autoFlush 속성을 제공한다. 이 속성을 사용하면 버퍼가 다 찼을 때 어떻게 처리할지를 결정할 수 있다. autoFlush 속성은 "true"나 "false"를 값으로 갖는데, 각 값에 따라서 다음과 같이 처리한다.

  • true : 버퍼가 다 차면 버퍼를 플러시하고 계속해서 작업을 진행한다.
  • false : 버퍼가 다 차면 익셉션을 발생시키고 작업을 중지한다.

참고

  • 최범균의 JSP2.3 웹 프로그래밍
profile
이것저것 관심많은 개발자.

0개의 댓글