사건 기반 프로그래밍
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
사건 기반 프로그래밍은 프로그램의 흐름과는 별개로 발생하는 사건인 이벤트를 기반으로 동작하는 프로그래밍 패러다임이다. 이벤트가 발생하면 미리 정의된 이벤트 핸들러가 실행되어 특정 작업을 수행하며, 규칙형과 절차형 두 가지 방식으로 구현될 수 있다. 이러한 방식은 GUI를 사용하는 운영체제나 응용 소프트웨어, 네트워크 서버 등 다양한 분야에서 활용되며, 애플리케이션 구조의 블랙 박스화와 코드량 감소, 가시성 향상 등의 장점을 제공한다. 플럭스 패턴과 커맨드 패턴과 같은 구현 패턴이 존재한다.
더 읽어볼만한 페이지
- 이벤트 (컴퓨팅) - 메시지 큐
메시지 큐는 프로세스나 스레드 간 비동기 통신을 제공하여 송신자와 수신자가 동시에 상호 작용할 필요 없이 메시지를 교환하도록 하며, 메시지는 수신자가 검색할 때까지 저장되고 시스템 장애 시 복원력을 제공하지만 보안 취약점, 특정 기업 종속성 등의 논란도 존재한다. - 이벤트 (컴퓨팅) - 비동기 입출력
비동기 입출력은 입출력 완료를 기다리지 않고 다른 작업을 처리하는 방식으로, 완료 시 콜백이나 시그널을 통해 결과를 알려주어 효율적인 자원 활용과 성능 향상을 가져다준다. - 프로그래밍 패러다임 - 지식 표현
지식 표현은 컴퓨터가 인간의 지식을 이해하고 활용하도록 정보를 구조화하는 기술이며, 표현력과 추론 효율성의 균형, 불확실성 처리 등을 핵심 과제로 다양한 기법과 의미 웹 기술을 활용한다. - 프로그래밍 패러다임 - 의도적 프로그래밍
의도적 프로그래밍은 프로그래머의 의도를 명확히 포착하고 활용하여 소프트웨어 개발 생산성을 향상시키기 위한 프로그래밍 패러다임으로, 트리 기반 저장소를 사용해 코드 의미 구조를 보존하고, WYSIWYG 환경에서 도메인 전문가와 협업하며, 코드 상세 수준 조절 및 자동 문서화를 통해 가독성과 유지보수성을 높이는 데 중점을 둔다.
사건 기반 프로그래밍 | |
---|---|
개요 | |
개념 | 사건(event)의 발생에 따라 프로그램의 흐름을 제어하는 프로그래밍 패러다임이다. |
특징 | 프로그램의 응답성을 향상시킨다. 비동기적인 이벤트 처리를 가능하게 한다. 사용자 인터페이스 프로그래밍에 적합하다. |
작동 방식 | 이벤트 감지: 프로그램은 특정 이벤트(마우스 클릭, 키보드 입력, 메시지 수신 등)를 감지하기 위해 대기한다. 이벤트 처리기 호출: 이벤트가 발생하면 해당 이벤트에 연결된 이벤트 처리기(함수 또는 메서드)가 호출된다. 이벤트 루프: 이벤트 감지 및 이벤트 처리기 호출을 반복하는 메커니즘이다. |
관련 용어 | |
이벤트 | 프로그램 내에서 발생하는 특정한 사건 또는 상태 변화. |
이벤트 처리기 | 특정 이벤트에 대한 응답으로 실행되는 코드 블록. |
이벤트 루프 | 이벤트 발생을 감시하고 해당 이벤트 처리기를 호출하는 메커니즘. |
콜백 함수 | 특정 이벤트가 발생했을 때 시스템에 의해 호출되는 함수. |
활용 분야 | |
사용자 인터페이스 (UI) 프로그래밍 | GUI (Graphical User Interface) 애플리케이션 웹 애플리케이션 (JavaScript, AJAX) |
게임 개발 | 사용자 입력 처리 게임 로직 |
실시간 시스템 | 센서 데이터 처리 제어 시스템 |
분산 시스템 | 메시지 기반 통신 비동기 작업 처리 |
장점 | |
응답성 향상 | 이벤트 기반 시스템은 이벤트가 발생할 때만 코드를 실행하므로, 시스템의 응답성을 향상시킬 수 있다. |
비동기 처리 | 이벤트 기반 시스템은 비동기적인 이벤트 처리를 지원하므로, 긴 시간이 걸리는 작업을 백그라운드에서 처리할 수 있다. |
모듈성 | 이벤트 기반 시스템은 이벤트 처리기를 모듈화하여 관리할 수 있으므로, 코드의 유지보수성을 향상시킬 수 있다. |
단점 | |
복잡성 증가 | 이벤트 기반 시스템은 여러 이벤트 처리기가 동시에 실행될 수 있으므로, 코드의 복잡성이 증가할 수 있다. |
디버깅 어려움 | 이벤트 기반 시스템은 이벤트의 발생 순서에 따라 결과가 달라질 수 있으므로, 디버깅이 어려울 수 있다. |
구현 방법 | |
이벤트 루프 직접 구현 | 특정 언어나 프레임워크의 지원 없이 이벤트 루프를 직접 구현하는 방식이다. |
프레임워크 활용 | GUI 프레임워크 (예: Qt, GTK) 웹 프레임워크 (예: Node.js, Spring WebFlux) 게임 엔진 (예: Unity, Unreal Engine) |
프로그래밍 언어 지원 | |
지원 언어 | C++ C# JavaScript Java Python Node.js PHP Swift Kotlin |
2. 특징
이벤트 기반 프로그래밍은 크게 규칙형(선언형)과 절차형으로 나눌 수 있다. 규칙형은 ECA 규칙(event-condition-action rule영어)에 따라 작동하며, 반응형 프로그래밍과 유사하다. 절차형은 이벤트 핸들러(event handler영어)를 시스템 또는 애플리케이션 프레임워크에 등록하여 콜백 방식으로 작동한다.
일반적으로 그래픽 사용자 인터페이스(GUI)를 사용하는 운영체제나 응용 소프트웨어에서 이벤트 기반 프로그래밍을 이용하며, 마우스나 키보드 조작 같은 사용자 입력, 시스템 상태 변화 등에 대한 처리를 통일적으로 기술할 수 있다.
이벤트 기반 프로그래밍의 장점은 필요한 이벤트 핸들러에만 처리를 작성하면 되므로, 애플리케이션 프레임워크를 통해 프로그램 구조를 블랙 박스화하고 재사용하기 쉬워져 코드량이 줄어들고 가시성이 좋아진다는 것이다.
2. 1. 규칙형 (선언형) 이벤트 기반 프로그래밍
규칙형(선언형) 이벤트 기반 프로그래밍에서는 규칙의 조건부가 충족되어 지정된 이벤트가 발생하면 해당 규칙이 실행된다. 이러한 규칙을 ECA 규칙(event-condition-action rule영어)이라고 한다. 예를 들어 환율 변환의 경우 다음과 같은 규칙을 준비해 둘 수 있다.- 프로그램 시작 직후 → '''환산 전 금액'''을 1로 설정한다.
- 환산 전 통화 단위와 변환 후 통화를 "선택"한다 → '''환산 전 금액'''과 각 통화를 환율 변환 서비스에 보낸다.
- 서비스에서 환율을 "받아온다" → '''환산 전 금액'''과 환율로부터 환산식을 조립한다.
- 입력란에 환산 전 통화의 금액을 "입력"한다 → 입력된 금액을 '''환산 전 금액'''으로 설정한다.
- '''환산 전 금액'''이 "설정된다" → 환산식을 사용하여 환산 결과를 제시한다.
이렇게 규칙을 설정하면 사용자는 다음과 같은 이점을 누릴 수 있다.
- 통화 단위만 선택하고 금액이 미입력된 경우, 예를 들어 1엔당 얼마인지 얻을 수 있다.
- 금액만 변경함으로써, 선택해둔 통화 간 환산을 연달아 할 수 있다.
- 금액을 그대로 둔 채, 통화를 선택할 때마다 즉시 환산된다.
- 입력을 "확정"하는 불필요한 단계를 생략할 수 있다(실시간성).
여기서 언급한 예는 데이터나 상태의 변화에 반응하여 처리가 시작되는 반응형 프로그래밍(Reactive_programming)이라고 불린다.
2. 2. 절차형 이벤트 기반 프로그래밍
절차형 이벤트 기반 프로그래밍에서는 먼저 각 이벤트에 대응하는 처리를 기술한 절차(서브루틴, 함수 또는 메서드)를 시스템 또는 애플리케이션 프레임워크에 등록한다. 이 절차는 이벤트 핸들러(event handler영어)라고 불리며, 이벤트가 발생했을 때 시스템 또는 애플리케이션 프레임워크에 의해 호출(콜백)된다. 이벤트 대기 중(아이들링 시)의 처리는 시스템에 맡긴다.일반적으로 그래픽 사용자 인터페이스(GUI)를 사용하는 운영체제나 응용 소프트웨어에서는 이벤트 기반 프로그래밍을 이용한다. 마우스 조작이나 키보드 조작과 같은 사용자 입력, 시스템 상태의 변화 및 변경과 같은 각 이벤트에 대한 처리를 통일적으로 기술할 수 있다.
이벤트 기반 프로그래밍을 수행하는 장점은 애플리케이션을 생성할 때, 필요한 이벤트 핸들러에만 처리를 작성하면 된다는 것이다. 이벤트를 대기하는 프로그램 구조 자체는 어떤 애플리케이션도 거의 공통적이며, 결과적으로 애플리케이션 프레임워크에 의한 프로그램 구조의 블랙 박스화 및 재사용이 용이해지고, 애플리케이션 프로그래머가 작성해야 하는 코드량이 줄어든다. 처리의 기술을 핸들러별로 나누기 때문에 프로그램의 가시성도 좋아진다.
3. 용어 및 개념
많은 프로그래밍 프레임워크는 응용 프로그램에서 이벤트를 검색/디스패치하는 이벤트 루프를 자체적으로 처리하고, 사용자는 이벤트 처리기에 대한 코드만 제공하면 된다.
RPG는 IBM의 초기 프로그래밍 언어로서, 1960년대 디자인 컨셉이 위에 논의된 이벤트 기반 프로그래밍과 유사하다. RPG는 사이클 초기에 설정된 '지표'(플래그)에 따라 계산이 응답하는 내장된 메인 I/O 루프( "프로그램 사이클"이라고 함)를 제공한다. 실제 로직은 이벤트 처리 루틴에 포함되어 있다. 이 루틴은 메인 프로그램이 응답할 이벤트들을 처리한다. 예를 들어, GUI 프로그램에서 명령 버튼을 마우스 왼쪽 버튼으로 한 번 클릭하면 다른 창을 열거나, 데이터베이스에 데이터를 저장하거나, 응용 프로그램을 종료하는 루틴이 실행될 수 있다. 많은 IDE는 프로그래머에게 GUI 이벤트 템플릿을 제공하여 프로그래머가 이벤트 코드 작성에 집중할 수 있도록 한다.
순차적인 프로그램에서는 일반적으로 기록을 추적하는 것이 간단하다. 이벤트 처리기는 외부 이벤트에 대한 응답으로 실행되므로, 어떤 순서로 호출되더라도 작동하도록 처리기를 올바르게 구조화하려면 이벤트 기반 프로그램에서 특별한 주의와 계획이 필요할 수 있다.
이벤트 처리기를 작성하는 것 외에도, 이벤트가 발생했을 때 올바른 함수가 호출되도록 이벤트 처리기를 이벤트에 바인딩해야 한다. UI 이벤트의 경우, 많은 IDE가 이 두 단계를 결합한다. 버튼을 더블 클릭하면 편집기가 사용자가 버튼을 클릭했을 때 연관된 (비어있는) 이벤트 처리기를 생성하고, 이벤트 처리기를 편집할 수 있도록 텍스트 창을 연다.
- 이벤트: "키보드 키를 눌렀다", "시계가 특정 시각이 되었다" 등 프로그램 흐름과는 별개로 발생하는 사건. 또는 해당 사건에 관한 정보를 포함하는 메시지를 가리킨다. →이벤트 (프로그래밍)
- 이벤트 핸들러: 이벤트가 발생했을 때 실행해야 하는 서브루틴을 의미한다. 이벤트 훅, 이벤트 리스너 등의 명칭으로도 불린다.
- 트리거: 이벤트를 발생시키는 계기. 프로그램 내부에서 이벤트를 발생시키는 것을 "이벤트를 트리거한다"고 표현하기도 한다.
- 이벤트 디스패처: 발생한 이벤트를 이벤트 핸들러로 분배하는 기능.
- 이벤트 큐: 여러 이벤트가 연속적으로 발생했을 경우, 해당 이벤트들을 대기열로 보관하는 데이터 구조. 이벤트 발생 간격이 짧아 다음 이벤트가 발생하기 전에 이벤트 핸들러의 처리가 완료되지 못할 경우 버퍼로 사용된다. →메시지 큐
- 이벤트 루프: 이벤트를 대기하는 루프를 갖는 구조. 이벤트 루프 내에 이벤트 디스패처를 갖는 구조가 일반적이다. 메시지 루프, 메시지 펌프라고도 불린다.
4. 응용 분야
대부분의 GUI 아키텍처는 사건 기반 프로그래밍을 사용한다.[2] 윈도우는 이벤트 루프를 가지고 있다. 자바 AWT 프레임워크는 이벤트 디스패칭 스레드라고 하는 단일 스레드에서 모든 UI 변경 사항을 처리한다. 마찬가지로, 자바 프레임워크 JavaFX의 모든 UI 업데이트는 JavaFX Application Thread에서 발생한다.[3]
대부분의 네트워크 서버와 Node.js와 같은 프레임워크 또한 사건 기반이다.[4]
일반적으로 그래픽 사용자 인터페이스(GUI)를 사용하는 운영체제나 응용 소프트웨어에서는 이벤트 기반 프로그래밍을 이용한다. 마우스 조작이나 키보드 조작과 같은 사용자 입력, 시스템 상태의 변화 및 변경과 같은 각 이벤트에 대한 처리를 통일적으로 기술할 수 있다.
이벤트 기반 프로그래밍을 수행하는 장점은 애플리케이션을 생성할 때, 필요한 이벤트 핸들러에만 처리를 작성하면 된다는 것이다. 이벤트를 대기하는 프로그램 구조 자체는 어떤 애플리케이션도 거의 공통적이며, 결과적으로 애플리케이션 프레임워크에 의한 프로그램 구조의 블랙 박스화 및 재사용이 용이해지고, 애플리케이션 프로그래머가 작성해야 하는 코드량이 줄어든다. 처리의 기술을 핸들러별로 나누기 때문에 프로그램의 가시성도 좋아진다.
5. 구현 패턴
실제 로직은 이벤트 처리 루틴에 포함되어 있다. 이 루틴은 메인 프로그램이 응답할 이벤트들을 처리한다. 예를 들어, GUI 프로그램에서 명령 버튼을 마우스 왼쪽 버튼으로 한 번 클릭하면 다른 창을 열거나, 데이터베이스에 데이터를 저장하거나, 응용 프로그램을 종료하는 루틴이 실행될 수 있다. 많은 IDE는 프로그래머에게 GUI 이벤트 템플릿을 제공하여 프로그래머가 이벤트 코드 작성에 집중할 수 있도록 한다.
순차적인 프로그램에서는 일반적으로 기록을 추적하는 것이 간단하다. 이벤트 처리기는 외부 이벤트에 대한 응답으로 실행되므로, 어떤 순서로 호출되더라도 작동하도록 처리기를 올바르게 구조화하려면 이벤트 기반 프로그램에서 특별한 주의와 계획이 필요할 수 있다.
이벤트 처리기를 작성하는 것 외에도, 이벤트가 발생했을 때 올바른 함수가 호출되도록 이벤트 처리기를 이벤트에 바인딩해야 한다. UI 이벤트의 경우, 많은 IDE가 이 두 단계를 결합한다. 버튼을 더블 클릭하면 편집기가 사용자가 버튼을 클릭했을 때 연관된 (비어있는) 이벤트 처리기를 생성하고, 이벤트 처리기를 편집할 수 있도록 텍스트 창을 연다.
규칙형(선언형) 이벤트 기반 프로그래밍에서는 규칙의 조건부가 충족되어 지정된 이벤트가 발생하면 해당 규칙이 실행된다. 이러한 규칙을 ECA 규칙(event-condition-action rule영어)이라고 한다. 예를 들어 환율 변환의 경우 다음과 같은 규칙을 설정할 수 있다.
규칙 |
---|
프로그램 시작 직후 → 환산 전 금액을 1로 설정한다. |
환산 전 통화 단위와 변환 후 통화를 "선택"한다 → 환산 전 금액과 각 통화를 환율 변환 서비스에 보낸다. |
서비스에서 환율을 "받아온다" → 환산 전 금액과 환율로부터 환산식을 조립한다. |
입력란에 환산 전 통화의 금액을 "입력"한다 → 입력된 금액을 환산 전 금액으로 설정한다. |
환산 전 금액이 "설정된다" → 환산식을 사용하여 환산 결과를 제시한다. |
위와 같은 규칙을 통해 사용자는 다음과 같은 이점을 얻을 수 있다.
- 통화 단위만 선택하고 금액을 입력하지 않으면 1엔당 환산 금액을 알 수 있다.
- 금액만 변경하면 선택한 통화 간 환산을 연속적으로 수행할 수 있다.
- 금액을 그대로 두고 통화를 선택할 때마다 즉시 환산 결과를 확인할 수 있다.
- 입력 "확정"과 같은 불필요한 단계를 거치지 않아도 된다(실시간성).
이는 데이터나 상태 변화에 반응하여 처리가 시작되는 반응형 프로그래밍()의 예시이다.
절차형 이벤트 기반 프로그래밍에서는 먼저 각 이벤트에 대응하는 처리를 기술한 절차(서브루틴, 함수 또는 메서드)를 시스템 또는 애플리케이션 프레임워크에 등록한다. 이 절차는 이벤트 핸들러(event handler영어)라고 불리며, 이벤트가 발생했을 때 시스템 또는 애플리케이션 프레임워크에 의해 호출(콜백)된다. 이벤트 대기 중(아이들링)의 처리는 시스템에 맡긴다.
일반적으로 그래픽 사용자 인터페이스(GUI)를 사용하는 운영체제나 응용 소프트웨어에서는 이벤트 기반 프로그래밍을 이용한다. 마우스 조작이나 키보드 조작과 같은 사용자 입력, 시스템 상태의 변화 및 변경과 같은 각 이벤트에 대한 처리를 통일적으로 기술할 수 있다.
이벤트 기반 프로그래밍을 사용하면 애플리케이션을 생성할 때 필요한 이벤트 핸들러에만 처리를 작성하면 된다는 장점이 있다. 이벤트 대기를 위한 프로그램 구조는 대부분의 애플리케이션에서 공통적이므로, 애플리케이션 프레임워크를 통해 프로그램 구조를 블랙 박스화하고 재사용하기 쉬워진다. 결과적으로 애플리케이션 프로그래머가 작성해야 하는 코드량이 줄어들고, 핸들러별로 처리를 나누어 기술하므로 프로그램의 가시성이 향상된다.
이벤트로 구동되는 처리는 이벤트 핸들러에 기술되지만, 그 구현 방법은 개발자에게 달려있다. 처리의 특성(실행 내용, 규모, 복잡성)에 따라 다양한 이벤트 핸들러 구현 패턴이 존재한다.
5. 1. 플럭스 패턴 (Flux Pattern)
플럭스(Flux)는 액션을 통한 브로드캐스트형 메시지 전달에 의한 패턴이다. 상태 관리를 스토어에 위임하고, 이벤트 핸들러는 액션 발화에 특화된다. 이벤트 측과 상태 관리(비즈니스 로직) 측을 느슨한 결합으로 만들 수 있다는 장점이 있다. 또한 액션 메시지를 보존·기록하여 다룰 수 있다.UI 관련 구현으로는 Redux가 사실상의 표준이다.[6]
5. 2. 커맨드 패턴 (Command Pattern)
커맨드 패턴은 객체 지향 프로그래밍을 사용한 패턴이다. 실제 처리를 커맨드 객체에 위임하고, command.Execute (커맨드 실행) 인터페이스를 이벤트 핸들러 내에서 호출함으로써, 이벤트 핸들러 측과 처리 측을 느슨한 결합으로 만들 수 있는 장점을 가진다. 또한 커맨드 객체를 보존·기록하여 다룰 수 있다.[6]6. IBM RPG와의 관계
IBM의 초기 프로그래밍 언어인 RPG는 1960년대 디자인 컨셉이 사건 기반 프로그래밍과 유사하다. RPG는 사이클 초기에 설정된 '지표'(플래그)에 따라 계산이 응답하는 내장된 메인 I/O 루프("프로그램 사이클"이라고 함)를 제공했다.[1]
7. 장점
절차형 이벤트 기반 프로그래밍에서는 먼저 각 이벤트에 대응하는 처리를 기술한 절차(서브루틴, 함수 또는 메서드)를 시스템 또는 애플리케이션 프레임워크에 등록한다. 이 절차는 이벤트 핸들러(event handler영어)라고 불리며, 이벤트가 발생했을 때 시스템 또는 애플리케이션 프레임워크에 의해 호출(콜백)된다. 이벤트 대기 중(아이들링 시)의 처리는 시스템에 맡긴다.
일반적으로 그래픽 사용자 인터페이스(GUI)를 사용하는 운영체제나 응용 소프트웨어에서는 이벤트 기반 프로그래밍을 이용한다. 마우스 조작이나 키보드 조작과 같은 사용자 입력, 시스템 상태의 변화 및 변경과 같은 각 이벤트에 대한 처리를 통일적으로 기술할 수 있다.
이벤트 기반 프로그래밍의 장점은 애플리케이션을 생성할 때 필요한 이벤트 핸들러에만 처리를 작성하면 된다는 것이다. 이벤트를 대기하는 프로그램 구조 자체는 어떤 애플리케이션이나 거의 공통적이며, 결과적으로 애플리케이션 프레임워크에 의한 프로그램 구조의 블랙 박스화 및 재사용이 용이해지고, 애플리케이션 프로그래머가 작성해야 하는 코드량이 줄어든다. 또한, 처리 기술을 핸들러별로 나누기 때문에 프로그램의 가시성도 좋아진다.
참조
[1]
서적
Domain-Driven Design with Java - A Practitioner's Guide
Packt Publishing
[2]
뉴스
Who Moved My State?
http://www.ddj.com/c[...]
2018-01-28
[3]
웹사이트
Concurrency in JavaFX
https://docs.oracle.[...]
Oracle
2018-01-04
[4]
문서
Event-Driven Programming in Node.js
https://www.digitalo[...]
[5]
웹사이트
https://www.tc3.co.j[...]
[6]
웹사이트
Related Libraries {{!}} Flux
https://facebook.git[...]
Meta
2019-07-27
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com