์ค๋์ ์ ๊ฐ์ธ์ ์ผ๋ก ์์ง์์ค๋ก ์์๋ณด๋ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํ์ตํ๋ฉด์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๋ํ ํ๋ก์ ๊ตฌ์ฑ ์ proxy_buffering ๊ณผ ๊ฐ์ ๋ฒํผ๋ง ์ต์ ์ ๋นํ์ฑํ ํด์ผํ๋ค๊ณ ์ ๋ฆฌํ์์ต๋๋ค. HTTP/2 ์ฐ๊ฒฐ๊ณผ ํจ๊ป SSE(Server Sent Event)๋ฅผ ํ์ฉํ๋ฉด ๊ตณ์ด ์น์์ผ ๊ตฌํ์ ํ์ง ์์๋ ์๋ฒ ์ธก์์ ํด๋ผ์ด์ธํธ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
ํ์ง๋ง, Nginx ์ธก์์๋ Nginx ๊ตฌ์ฑ์ ๋ํ 10๊ฐ์ง ์ค์์์ Mistake 5: The proxy_buffering off Directive์ผ๋ก ๋ฒํผ๋ง ์ต์ ์ ๋ํ ๋นํ์ฑํ์ ๋ํด์ ์ด์ผ๊ธฐํฉ๋๋ค.
Buffering can also be enabled or disabled by passing "yes" or "no" in the "X-Accel-Buffering" response header field. This capability can be disabled using the proxy_ignore_headers directive.
์์ ๊ฐ์ด ์์ง์์ค ๊ณต์ ๋ฌธ์ ์์๋ ํ๋ก์ ๋ฒํผ๋ง์ ๋ฌด์ํ ์ ์๋ ํค๋์ ๋ํ ์ค๋ช ์ ํด์ฃผ๊ณ ์์ผ๋ฉฐ ํ์ฌ ๋ด ์ธํ๋ผ ์์ง๋์ด ๋ถ์ ์๊ฒฌ์ ๋ฐ๋ผ์ ํ๋ก์ ๊ตฌ์ฑ ์ ๋ฒํผ๋ง ์ต์ ์ ์ผ๊ด์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ๋ณด๋ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๋ํ ์๋ต์ ์ํํ ๋ X-Accel-Buffering ํค๋๋ฅผ ์๋ตํ๋ ๊ฒ์ผ๋ก ์ต์ข ๊ฒฐ์ ํ์ต๋๋ค.
X-Accel-Buffering ํค๋ ์๋ตํ๊ธฐ โ
์คํ๋ง ํ๋ ์์ํฌ์์๋ SseEmitter๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๊ฐ๋จํ๊ฒ SSE ์ฐ๊ฒฐ์ ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ด ํด๋์ค๋ ResponseBodyEmitter๋ฅผ ํ์ฅํ์๊ธฐ์ extendResponse ํจ์๋ฅผ ํตํด ์๋ตํ๊ธฐ ์ HTTP ์ํ์ฝ๋ ๋๋ ์๋ต ํค๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์, ์ปจํธ๋กค๋ฌ ํธ๋ค๋ฌ ํจ์์์ HttpServletResponse๋ฅผ ์ธ์๋ก ๋ฐ์ ํ X-Accel-Buffering ํค๋์ ๋ํ ๊ฐ์ no๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
@Slf4j
@RestController
public class SseController {
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter sse(HttpServletResponse response) {
response.setHeader("X-Accel-Buffering", "no");
return new SseEmitter();
}
}
๊ฐ์ฌํฉ๋๋ค.