비동기 프로그래밍에서 'event-driven' 아키텍처란 무엇인가요?
_____A1: 이벤트가 발생(emit)될 때마다 그에 등록된 리스너(핸들러)가 실행되는 방식의 소프트웨어 설계 방식입니다. 애플리케이션의 흐름을 함수 호출이 아닌 “이벤트” 중심으로 제어합니다.
Q2: 비동기 프로그래밍과 event-driven의 관계는?
A2: 비동기 프로그래밍에서는 I/O, 타이머, 사용자 입력 등 외부 동작을 기다리는 동안 블로킹을 피해야 합니다. 이벤트가 발생하면 콜백이나 프로미스가 실행되므로, 비동기 작업과 이벤트 구동 방식이 자연스럽게 어울립니다.
Q3: event-driven 아키텍처의 주요 구성 요소는?
A3:
1. 이벤트 발행자(Emitter): 이벤트를 생성하고 발행하는 주체
2. 이벤트 구독자(Listener/Handler): 특정 이벤트를 감지해 처리하는 함수 또는 모듈
3. 이벤트 버스(Event Bus) 또는 메시지 브로커: 이벤트 발행과 구독을 중개하는 통로
4. 이벤트 루프(Event Loop): 이벤트를 대기·분배하며 비동기 실행을 관리
Q4: 장점은 무엇인가요?
A4:
– 느슨한 결합: 발행자와 구독자가 직접 의존하지 않으므로 모듈화·유지보수 용이
– 확장성: 새로운 이벤트 핸들러를 추가해 기능 확장 가능
– 반응성: I/O 블로킹 없이 사용자 입력·네트워크 이벤트에 즉시 대응
– 재사용성: 동일 이벤트에 여러 핸들러를 연결해 다양한 기능 구현
Q5: 단점이나 주의사항은?
A5:
– 디버깅 어려움: 흐름이 명시적 호출이 아니어서 추적이 까다로움
– 이벤트 폭주(Race Condition), 메모리 누수: 해제되지 않은 리스너가 쌓이면 자원 소모
– 복잡도 상승: 이벤트 간 의존성 관리가 미흡하면 예측 불가능한 동작 발생
Q6: 대표적인 구현 예시는?
A6:
– 브라우저 DOM 이벤트(클릭, 키보드 입력)
– Node.js의 EventEmitter, stream, HTTP 서버
– 프론트엔드 프레임워크(React의 SyntheticEvent, Vue의 $emit/$on)
– 메시지 큐(AMQP, Kafka) 기반 마이크로서비스 간 이벤트 교환
A7: 발행자(Publisher)가 특정 토픽(topic)으로 메시지를 보내면, 해당 토픽에 구독(Subscriber)한 모든 소비자가 메시지를 받는 방식입니다. 단일 이벤트 버스 환경에서 흔히 쓰입니다.
Q8: observer 패턴과의 차이는?
A8: observer(관찰자) 패턴: 객체 간 1:N 일대다 의존성을 관리하며, 상태 변경 시 관찰자에게 직접 알림.
pub/sub 패턴: 메시지 브로커를 통해 간접 연결, 토픽·채널로 새로 구분·확장성 향상.
Q9: 이벤트 흐름 제어 전략은?
A9:
1. 순차 처리(Queue): 한 번에 하나씩 이벤트 소비
2. 병렬 처리(Pool): 워커 풀을 이용해 동시 처리
3. 우선순위 큐: 긴급도에 따라 처리 순서 조정
4. 데바운스/스로틀: 이벤트 빈도가 높을 때 처리율 제어
Q10: 트랜잭션, 일관성 보장은 어떻게?
A10:
– 사가 패턴: 일련의 이벤트 기반 단계를 트랜잭션처럼 묶어 보상 로직 구현
– 이벤트 소싱: 상태 변경을 이벤트로 저장하고 재구성해 일관성 확보
– 커밋 로그+워크플로 엔진: 순서 보장·재시도 로직 제공
Q11: 성능 최적화 팁은?
A11:
– 리스너 최소화: 불필요한 이벤트 구독 제거
– 이벤트 배치 처리: 여러 이벤트를 묶어서 일괄 처리
– 메모리 해제: once 옵션·off() 호출로 리스너 클린업
– 모니터링·로깅: 이벤트 처리 지연 식별 후 병목 해소
Q12: 언제 event-driven 아키텍처를 선택해야 하나요?
A12:
– 비동기 입출력·실시간 처리 요구
– 모듈 간 느슨한 결합과 확장성 중시
– 복잡한 워크플로우·분산 시스템 관리 필요
– 사용자 인터랙션·알림 시스템 구축 시 이상적
작성자:
김은채 [비회원]
| 작성일자: 1년 전
2024-09-12 16:03:43
조회수: 136 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 136 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.