Skip to content

์˜ค๋ž˜์ „์— ๊ฐœ์ธ์ ์œผ๋กœ ์—”์ง„์—‘์Šค๋กœ ์•Œ์•„๋ณด๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๊ตฌ์„ฑ ์‹œ 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๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

java
@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();
    }
}

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Released under the MIT License.