μ˜€λž˜μ „μ— 개인적으둜 μ—”μ§„μ—‘μŠ€λ‘œ μ•Œμ•„λ³΄λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ₯Ό ν•™μŠ΅ν•˜λ©΄μ„œ 이벀트 μŠ€νŠΈλ¦Όμ— λŒ€ν•œ ν”„λ‘μ‹œ ꡬ성 μ‹œ 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();
    }
}

κ°μ‚¬ν•©λ‹ˆλ‹€.