본문 바로가기
TYLER SONG2026
블로그 목록
Frontend

next / error / complete 알림 이해: Observables 의 라이프사이클 끝부분을 처리하는 방식

Observable 은 값 하나를 Emit 하는 것이 아니라 생성, 완료, 오류 중 하나의 상태가 결정된 순간에 알림을 보냅니다. 이 세 가지 알림은 Observability의 수명주기를 정의하며, subscribe 를 실행할 때 한 번만 발생하므로 반복처리가 불가능합니다.

송민성3분 읽기

1. 개념

Observable 은 값 시퀀스를 Emit 하며, 그 시퀀스가 언제 끝났는지 혹은 왜 멈췄는지를 next, error, complete 세 가지 알림으로 구분하여 알려줍니다. 이 세 알림은 구독자 (subscriber) 가 Observable 을 subscribe 했을 때 즉시 실행되며, 해당 Observable 의 수명 동안 한 번씩만 발생한다는 특징이 있습니다.

2. 왜 사용하는가

Observer 패턴의 표준 구조를 따르기 위해 next 는 데이터 값 전달에, error 는 에러 처리에, complete 는 데이터 송신 종료 신호로 사용됩니다. 이 알림을 통해 프로그램은 비동기 작업이 성공적으로 끝났는지, 네트워크 오류가 발생했는지, 혹은 단순히 더 이상 데이터를 전송할 상태인지 명확하게 파악하고 반응할 수 있습니다.

3. 동작 원리

Observable 의 내부 로직은 보통 생성 후 바로 next 를 Emit 하는 것으로 시작하며, 이후 한 번의 데이터 파이프라인 처리가 끝나면 무조건 complete 가 나옵니다. 만약 그 사이에 예외 (throw) 가 발생하면 complete 대신 error 알림이 우선적으로 전송됩니다. 구독자가 이 세 가지 함수를 호출하는 시점은 Observable 의 실행이 시작되는 순간이며, 한 번 호출되면 해당 알림은 재발생하지 않습니다.

4. 예제

다음 코드는 HTTP 요청 결과를 처리하는 상황을 가정해 봅니다. 먼저 성공적인 값이 들어와 onNext 가 호출되고, 그 후 더 이상 데이터가 없으므로 onComplete 가 실행됩니다. 반면 서버가 응답하지 않을 경우 onError 가 트리거되며, 이 상태에서는 이후의 코드가 실행되지 않습니다.

observable$.subscribe( (value) => { console.log('next:', value); }, (err) => { console.log('error:', err); }, () => { console.log('complete: 작업 종료'); } );

5. 실무 사용 사례

데이터 로딩 시 상태를 관리할 때 유용합니다. complete 알림이 발생했다는 것은 서버로부터 응답을 모두 받거나, 데이터가 없음을 확인받았다는 뜻이므로 로딩 인디케이터를 숨기는 조건으로 활용합니다. 에러 핸들링도 동일하게 적용되어, 특정 API 호출에서 예외가 발생했을 때만 error 핸들러 블록에 코드를 배치하여 사용자에게 알림창을 띄우거나 로깅할 수 있습니다.

6. 주의할 점

complete 는 값이 온 것이 아니라 시퀀스가 끝났다는 상태 신호이므로, 내부적으로 배열 length 를 체크하거나 값 유무를 판단하는 용도로만 절대 쓰지 마세요. 또한 error 가 발생하면 Observability 의 수명이 종료되어 이후의 로직은 더 이상 실행되지 않으므로 반드시 에러 핸들러 내에서 재발생 (retry) 이나 처리를 명시해야 합니다.

7. 핵심 정리

next, error, complete 는 한 번의 구독에서 딱 한 번씩만 발생하며, Observability 의 최종적인 상태를 결정하는 신호입니다. 값의 전달은 next, 에러는 error, 종료는 complete 가 담당하므로 이를 명확히 구분하여 작성해야 복잡한 비동기 흐름도 안정적으로 제어할 수 있습니다.

© 2026 Tyler Song