Home / AI / AI 용어사전 / 비동기(Async) — API 응답을 기다리는 동안 코드가 멈추지 않는 이유
TERM
비동기(Async) — API 응답을 기다리는 동안 코드가 멈추지 않는 이유
On this page
AI API를 처음 호출해본 개발자라면 한 번쯤 마주치는 상황이 있다. 응답을 기다리는 동안 화면이 멈추거나, 요청이 쌓이면서 서버가 느려지는 현상이다. 이 문제의 핵심에 비동기(Asynchronous) 처리가 있다.
정의
비동기(Async, Asynchronous)란 특정 작업이 완료될 때까지 기다리지 않고 다음 작업을 계속 진행하는 실행 방식이다. 반대 개념인 동기(Sync, Synchronous)는 작업이 끝날 때까지 블로킹(blocking)한 후 다음 줄로 넘어간다.
웹과 AI 서비스에서 비동기가 필수인 이유는 명확하다. Claude API 응답은 평균 2~10초가 걸린다. 동기 방식이라면 그 시간 동안 서버는 아무것도 못 하고 대기한다. 비동기 방식에서는 API 요청을 보내놓고 다른 사용자 요청을 처리하다가, 응답이 오면 그때 처리한다.
Async/Await 패턴 — 실제 API 호출 예시
현대 JavaScript/Python에서 비동기는 async/await 키워드로 표현한다. 콜백(callback) 지옥이나 Promise 체이닝보다 읽기 쉬운 코드를 작성할 수 있다.
JavaScript — Claude API 비동기 호출
async function askClaude(prompt) {
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: { 'x-api-key': process.env.ANTHROPIC_API_KEY },
body: JSON.stringify({
model: 'claude-sonnet-4-6',
messages: [{ role: 'user', content: prompt }]
})
});
const data = await response.json();
return data.content[0].text;
}await이 붙은 줄에서 JavaScript 엔진은 응답을 기다리는 동안 이벤트 루프로 제어권을 넘긴다. 다른 요청이 있으면 그걸 먼저 처리하고, 응답이 오면 돌아와서 다음 줄을 실행한다.
Python — asyncio 패턴
import asyncio
import anthropic
async def ask_claude(prompt: str) -> str:
client = anthropic.AsyncAnthropic()
message = await client.messages.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
# 여러 요청을 동시에 처리
async def batch_ask(prompts: list[str]):
tasks = [ask_claude(p) for p in prompts]
return await asyncio.gather(*tasks) # 병렬 실행asyncio.gather()는 여러 비동기 함수를 병렬로 실행해 총 대기 시간을 줄인다. 10개 API 요청을 순차로 보내면 10배 시간이 걸리지만, gather로 묶으면 가장 느린 요청 하나의 시간만 걸린다.
비동기가 필요한 상황 vs 동기로 충분한 상황
| 상황 | 권장 방식 | 이유 | |---|---|---| | AI API 호출 (Claude, GPT) | 비동기 | 응답 대기 수 초 — 블로킹 금지 | | 데이터베이스 쿼리 | 비동기 | I/O 대기 시간 | | 파일 읽기/쓰기 (대용량) | 비동기 | 디스크 I/O 블로킹 방지 | | 단순 계산 (수학 연산) | 동기 | CPU 바운드, I/O 없음 | | 설정 파일 한 번 읽기 | 동기 | 빠르고 일회성 |
비동기가 항상 빠른 것은 아니다. CPU를 많이 쓰는 순수 계산 작업은 비동기로 바꿔도 빨라지지 않는다. I/O(네트워크·디스크·DB)가 병목인 경우에만 비동기의 효과가 극대화된다.
바이브코딩에서 자주 만나는 비동기 오류
AI 코드 생성 도구를 쓰다 보면 비동기 관련 오류가 자주 등장한다.
await없이 Promise 반환:const result = fetchData()→ result가 Promise 객체 자체가 됨.await fetchData()로 수정.- async 함수 밖에서 await: 최상위 레벨 await는 ES2022+에서만 가능. 일반 함수 안에서 await 쓰면 SyntaxError.
- 에러 처리 누락:
await호출은try/catch로 감싸지 않으면 Promise rejection이 unhandled 상태로 남는다.
관련 용어
- api — 비동기 방식으로 호출하는 외부 서비스 인터페이스
- event-loop — 비동기를 가능하게 하는 JavaScript 런타임 핵심 메커니즘
- promise — 비동기 결과를 나타내는 JavaScript 객체, async/await의 기반
- webhook — 비동기 이벤트 알림 패턴, 응답을 기다리지 않고 콜백 URL로 수신
- streaming — AI 응답을 토큰 단위로 실시간 수신하는 비동기 스트림 패턴