TIL

👀Today I Learn

이벤트 기반 프로그래밍이란?

  • 이벤트 기반 프로그래밍(Event-Driven Programming)은 특정 이벤트(사용자 입력, 네트워크 응답, 시스템 인터럽트 등)가 발생했을 때, 이에 반응하는 방식으로 동작하는 프로그래밍 패러다임

이벤트 기반 프로그래밍의 특징

이벤트 발생(Event Triggering)

  • 특정 이벤트가 발생할 때까지 기다렸다가, 이벤트가 발생하면 실행됨.
  • 예) 버튼 클릭, 키보드 입력, 네트워크 요청 완료 등.

이벤트 핸들러(Event Handler)

  • 이벤트가 발생하면 실행되는 함수.
  • 예) 버튼 클릭 시 특정 함수 실행.

비동기적 실행(Asynchronous Execution)

  • 이벤트 기반 프로그래밍은 보통 비동기 처리를 많이 활용.
  • 이벤트가 발생할 때까지 기다리는 것이 아니라, 다른 작업을 하면서 대기함.

이벤트 루프(Event Loop)

  • 이벤트가 발생했는지 감지하는 역할.
  • 지속적으로 실행되며, 발생한 이벤트를 적절한 핸들러에 전달.


이벤트 기반 프로그래밍의 예시

JavaScript에서의 이벤트 기반 프로그래밍

  • JavaScript는 대표적인 이벤트 기반 프로그래밍 언어

      document.getElementById("myButton").addEventListener("click", function() {
          console.log("버튼이 클릭됨!");
      });
    
    • addEventListener를 통해 클릭 이벤트를 감지하고, 이벤트 핸들러가 실행됨.

Python에서 asyncio를 활용한 이벤트 기반 프로그래밍

  • Python의 asyncio 모듈도 이벤트 기반 프로그래밍을 지원

      import asyncio
        
      async def my_async_function():
          print("이벤트 시작!")
          await asyncio.sleep(2)
          print("이벤트 완료!")
        
      asyncio.run(my_async_function())
    
    • asyncio.sleep(2)가 실행될 동안 다른 작업이 가능함.
    • asyncawait을 사용하여 비동기 이벤트 기반 실행을 지원함.


이벤트 루프(Event Loop)란?

  • 이벤트 기반 프로그래밍에서 이벤트 루프(Event Loop)는 중요한 개념
  • 이벤트 루프는 이벤트가 발생할 때까지 기다렸다가, 이벤트가 발생하면 해당 이벤트를 적절한 핸들러에 전달하는 역할을 함
  • 지속적으로 실행되며, 이벤트를 감지하고 처리하는 핵심 구조

이벤트 루프 예제 (Python asyncio)

import asyncio

async def print_message():
    while True:
        await asyncio.sleep(1)
        print("이벤트 루프 실행 중...")

loop = asyncio.get_event_loop()
loop.run_until_complete(print_message())
  • 이 코드는 1초마다 "이벤트 루프 실행 중..."을 출력하면서 계속 실행됨


이벤트 기반 프로그래밍 vs 절차적 프로그래밍

비교 항목 이벤트 기반 프로그래밍 절차적 프로그래밍
실행 흐름 이벤트 발생 시 실행 코드가 순차적으로 실행
사용 사례 UI, 네트워크, 서버, 실시간 시스템 일반적인 로직 실행
주요 개념 이벤트, 핸들러, 이벤트 루프 함수 호출, 변수, 조건문


이벤트 기반 프로그래밍이 많이 사용되는 분야

웹 개발

  • JavaScript를 사용한 프론트엔드 개발 (React, Vue, Angular 등).
  • Django Channels를 이용한 WebSocket 기반 실시간 웹 애플리케이션.

네트워크 프로그래밍

  • 비동기 서버 (예: FastAPI, Node.js, Nginx).
  • 웹소켓(WebSocket)과 같은 실시간 통신 애플리케이션.

게임 개발

  • 사용자의 입력(클릭, 키보드, 마우스 등)에 따라 반응하는 구조.

IoT (사물 인터넷)

  • 센서에서 이벤트가 발생할 때마다 데이터를 처리하는 방식.


이벤트 기반 프로그래밍의 장점과 단점

✅ 장점

  • 높은 응답성: 이벤트 발생 시 즉시 처리하여 빠른 반응 속도 제공.
  • 효율적인 리소스 사용: 비동기적으로 실행 가능하여 CPU 사용률 감소.
  • 실시간 시스템에 적합: 웹소켓, 게임, 네트워크 서버 등에서 강력함.

❌ 단점

  • 디버깅이 어려움: 비동기 코드가 많아지면 실행 흐름이 복잡해질 수 있음.
  • 콜백 헬(Callback Hell): 이벤트 핸들러가 중첩되면 코드가 복잡해짐.
  • 잘못된 이벤트 관리 시 성능 저하: 너무 많은 이벤트를 감지하면 성능 저하 가능.


Django에서 이벤트 기반 프로그래밍 적용

  • Django는 기본적으로 동기적인 프레임워크이지만, Django Channels를 사용하면 비동기 웹소켓 및 이벤트 기반 처리를 지원할 수 있음

Django Channels를 활용한 이벤트 기반 웹소켓 예제

import json
from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.send(text_data=json.dumps({"message": "연결 성공"}))

    async def receive(self, text_data):
        data = json.loads(text_data)
        await self.send(text_data=json.dumps({"message": data["message"]}))
  • connect(): 웹소켓 연결 시 실행.
  • receive(): 클라이언트가 메시지를 보낼 때 실행.
  • send(): 클라이언트에게 메시지를 보낼 때 실행.

  • 이처럼 Django Channels와 비동기 기능을 활용하면 이벤트 기반 프로그래밍을 Django에서도 적용할 수 있음



💡Today I Thought

오늘의 체크리스트

  • 알고리즘 코드카타 1문제
  • SQL 코드카타 2문제
  • 브로셔 작성 마무리
  • 브로셔에 넣을 gif 만들기
  • PickMate FE 미리 만들어두기
  • PickMate 코딩 시작
  • TIL 작성

회고

 오늘은 사실 브로셔만 작성한 거 같다..🥺 왜 나는 대충이 하기싫은지.. 맨날 시간을 왕창 쏟아버리는 거 같다. 조금 효율적으로 시간을 사용해야할텐데ㅜㅜ 이러다가 ML을 완성도 못하고 끝날 것 같은 안좋은 기분이 든다.. 절대 안돼ㅜㅜ 내일 중에 꼭 ML 초반이라도 완성 해놔야겠다.

댓글남기기