[TIL] 내일배움캠프 117일차_[Django] 이벤트 기반 프로그래밍
👀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)
가 실행될 동안 다른 작업이 가능함.async
와await
을 사용하여 비동기 이벤트 기반 실행을 지원함.
이벤트 루프(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 초반이라도 완성 해놔야겠다.
댓글남기기