Sync와 Async: 데이터 처리 모델에 대한 심층 분석

정재현·2023년 8월 9일
0

Development

목록 보기
3/6

0. 배경지식

프론트엔드 개발에는 종종 데이터 처리 모델을 다루고 동기식과 비동기식의 차이점을 이해하는 작업이 포함된다. 이러한 지식은 특히 최신 웹 개발에서 백엔드 시스템을 설계하고 상호 작용하는 방식에 큰 영향을 미칠 수 있다. 또한, SQLAlchemy ORM의 'asyncSession'과 같은 최신 데이터베이스 작업은 더 나은 성능을 위해 비동기 작업의 힘을 활용한다. 이러한 개념에 대해 자세히 알아보겠다.

1. 동기 작업 이해

동기식 작업은 작업이 차례로 완료되는 시퀀스를 의미한다. 이전 작업이 완료될 때까지 한 작업이 시작되지 않는다.

동기식 작업의 주요 특징:

  • 직접 피드백**: 작업은 즉각적인 피드백을 제공한다. 데이터를 요청하고 데이터를 기다린다.
  • 차단**: 피드백을 기다리는 동안 다른 작업을 수행할 수 없다. 이는 특히 피드백에 오랜 시간이 걸리는 경우 비효율성을 초래할 수 있다.
  • 단순성**: 작업이 선형적으로 진행되기 때문에 더 간단하고 직관적으로 이해할 수 있다.

예시:

서버에 데이터를 요청하는 사용자를 생각보면, 사용자의 시스템은 서버가 이 요청에 응답할 때까지 기다리며 다른 작업을 수행하지 않는다.

2. 비동기 작업 이해

비동기 작업을 사용하면 이전 작업이 완료될 때까지 기다리지 않고 작업을 실행할 수 있다. 직접 순서대로 실행되지 않으므로 리소스 활용도를 높일 수 있다.

비동기 작업의 주요 특징:

  • 지연된 피드백**: 데이터를 요청하고 데이터를 기다리지 않고 다른 작업으로 넘어갈 수 있다.
  • 비차단**: 피드백을 기다리는 동안 다른 작업을 자유롭게 수행할 수 있다.
  • 효율성**: 리소스 활용도가 높아져 잠재적인 성능 향상으로 이어진다.
  • 복잡성**: 작업이 엄격한 순서를 따르지 않으므로 이해하고 설계하기가 더 복잡할 수 있다.

예시:

웹 개발에서 사용자가 서버에 요청을 보내면 서버의 응답을 기다리는 동안 다른 작업을 수행하거나 다른 요청을 보낼 수 있다.

3. SQLAlchemy ORM의 asyncSession

널리 사용되는 SQL 툴킷이자 Python용 객체 관계형 매핑(ORM) 라이브러리인 SQLAlchemy는 데이터베이스 쿼리를 보다 효율적으로 만들기 위해 비동기 패러다임을 수용했다.

주요 기능:

  • 비동기 쿼리**: 데이터베이스 쿼리를 비동기적으로 수행할 수 있다. 쿼리가 처리되는 동안 애플리케이션은 다른 작업을 처리할 수 있으므로 전반적인 처리량이 향상된다.
  • 비차단**: 데이터베이스 쿼리 시 애플리케이션 흐름을 차단하는 기존 SQLAlchemy Session과 달리, asyncSession은 애플리케이션이 응답성을 유지하도록 한다.
  • 파이썬의 asyncio**를 활용한다: 내부적으로 asyncSession은 Python의 asyncio 라이브러리를 기반으로 구축되어 호환성과 성능을 보장한다.

사용 예시:

SQLAlchemy에서 asyncSession을 사용하려면:

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "postgresql+asyncpg://user:password@localhost/mydatabase"

# Create an instance of the async engine
engine = create_async_engine(DATABASE_URL, echo=True)

# Create async session
AsyncSessionLocal = sessionmaker(
    bind=engine,
    class_=AsyncSession
)

# Asynchronous query
async with AsyncSessionLocal() as session:
    result = await session.execute("SELECT * FROM users")
    users = result.fetchall()

4. 동기과 비동기의 활용

동기식 및 비동기식 작업의 개념을 아는 것도 중요하지만, 실제 시나리오에서 언제 어느 쪽을 사용해야 하는지를 이해하는 것이 더 중요하다.

동기식 시나리오:

  • 중요 시퀀스**: 계정 액세스 권한을 제공하기 전에 먼저 사용자를 인증해야 하는 경우와 같이 특정 순서대로 작업을 수행해야 하는 경우.
  • 단순성**: 성능과 확장성이 주요 관심사가 아닌 소규모 애플리케이션 또는 스크립트용.
  • 즉각적인 피드백**: 오류 확인이나 데이터 유효성 검사와 같이 즉각적인 피드백이 중요한 작업의 경우.

비동기 시나리오:

  • 입출력 작업**: 데이터베이스, 파일 또는 네트워크 호출에 대한 읽기/쓰기를 포함하는 작업은 비동기화를 통해 상당한 이점을 얻을 수 있다. 이렇게 하면 메인 애플리케이션 스레드가 유휴 상태로 대기하지 않도록 할 수 있다.
  • UI/UX**: 최신 사용자 인터페이스는 일반적으로 비차단 방식으로 설계된다. 사용자가 버튼을 클릭할 때 기다리게 해서는 안 되며, UI는 계속 반응성을 유지해야 한다.
  • 확장성**: 대규모 애플리케이션, 특히 웹 서버는 비동기 작업의 이점을 누릴 수 있다. 리소스를 동등하게 늘리지 않고도 많은 요청을 처리할 수 있다.

5. 파이썬에서 비동기 프로그래밍의 진화

파이썬은 비동기 프로그래밍을 지원하는 데 있어 먼 길을 걸어왔다. 초기에는 파이썬이 주로 동기식 프로그래밍을 지원했지만, 파이썬 3.5에 async/await 구문이 도입되면서 네이티브 코루틴과 비동기 프로그래밍을 위한 전체 에코시스템이 도입되었다.

라이브러리 및 도구:

  • **`동기화``: 이 라이브러리는 파이썬 비동기 프레임워크의 핵심이다. 모든 비동기 애플리케이션의 핵심인 이벤트 루프를 제공한다.
  • asyncpg`**: PostgreSQL 및 SQLAlchemy를 위해 특별히 설계된 비동기 데이터베이스 인터페이스 라이브러리이다.
  • aiohttp`**: 비동기 HTTP 클라이언트/서버 프레임워크.

예시:

aiohttp를 사용하여 비동기 웹 요청을 수행한다:

import aiohttp
import asyncio

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

loop = asyncio.get_event_loop()
html_content = loop.run_until_complete(fetch_url('https://example.com'))

결론

프론트엔드 개발이든 백엔드 데이터베이스 운영이든, 동기식 작업과 비동기식 작업 사이의 선택은 프로젝트의 특정 요구 사항과 과제에 따라 결정된다. 직접성(동기식)과 잠재적인 성능 이점(비동기식) 사이의 장단점을 비교하며 차이점을 이해하는 것이 중요하다.비동기 패러다임을 수용하는 SQLAlchemy와 같은 라이브러리를 통해 비동기 접근 방식이 애플리케이션의 효율성, 응답성 및 확장성을 보장하는 데 점점 더 중요해지고 있음이 분명해졌다. 또한, 도구와 라이브러리가 비동기 작업을 점점 더 많이 지원함에 따라 최신 애플리케이션은 더욱 효율적이고 사용자 친화적으로 발전할 준비가 되어 있다.

profile
BlockChain Engineer

0개의 댓글