자바스크립트 비동기 함수자바스크립트 비동기 함수 만들기자바스크립트 비동기 콜백Async 비동기비동기 함수 뜻

[문서] JavaScript 비동기 프로그래밍 완벽 가이드: 콜백에서 async/await까지

KUKJIN LEE
KUKJIN LEE
2024년 6월 25일
170

비동기 작업은 웹 애플리케이션의 성능을 향상시키고, 사용자 경험을 개선하는 데 중요한 역할을 합니다.

 

1. 비동기 프로그래밍의 필요성

비동기 프로그래밍은 장기 실행 작업이 완료될 때까지 애플리케이션이 응답하지 않는 문제를 해결합니다. 웹 요청, 파일 읽기, 타이머 등 시간이 오래 걸리는 작업을 처리할 때 비동기 프로그래밍이 필요합니다.

 

2. 콜백 함수

콜백 함수는 JavaScript에서 비동기 프로그래밍을 구현하는 가장 기본적인 방법입니다.

하지만 콜백 함수가 중첩된다면 코드가 복잡해지고 가독성이 떨어집니다. 이를 콜백 지옥이라고 합니다.

async/await을 많이 사용하고 있지만, 여전히 콜백 함수를 사용하는 Legacy 코드가 다수 존재하고, DOM 이벤트 리스너 등 여러 상황에서 사용이 필요합니다.

function fetchData(callback) {
    setTimeout(() => {
        callback("Data fetched!");
    }, 2000);
}

fetchData((data) => {
    console.log(data);
});

 

3. 프로미스(Promise)

프로미스는 콜백 지옥 문제를 해결하기 위해 도입된 비동기 프로그래밍 방법입니다.

대기, 이행, 거부를 설정할 수 있고, .then().catch() 메서드를 통해 비동기 작업 완료 후 처리를 정의할 수 있습니다.

 

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 2000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

3-1 Promise 병렬 처리

Promise.all을 사용하면 여러 비동기 작업을 병렬로 처리할 수 있습니다.

async function fetchData1() {
    return new Promise(resolve => setTimeout(() => resolve("Data 1"), 1000));
}

async function fetchData2() {
    return new Promise(resolve => setTimeout(() => resolve("Data 2"), 2000));
}

async function main() {
    try {
        const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
        console.log(data1, data2);
    } catch (error) {
        console.error("Error fetching data:", error);
    }
}

main();

4. async/await

async/await는 비동기 작업을 더욱 간단하고 직관적으로 사용할 수 있게 해줍니다. 또한 비동기 작업을 동기식 코드처럼 작성할 수 있습니다. async 함수는 항상 실행됩니다. 이후 await 키워드가 함수 해결까지 기다립니다.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 2000);
    });
}

async function main() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
}

main();

 

4-1. 에러 핸들링

비동기 프로그래밍에서 에러 핸들링은 중요합니다. try...catch 블록을 사용하여 async/await 코드의 에러를 처리할 수 있습니다.

async function main() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error("Error fetching data:", error);
    }
}

main();

 

JavaScript 비동기 프로그래밍은 복잡해 보일 수 있지만, 콜백 함수, 프로미스, async/await를 잘 이해하면 쉽게 다룰 수 있습니다.

관련 글

TypeScript any 린트 에러(no-explicit-any) 근본적으로 해결하기

TypeScript 프로젝트에서 @typescript-eslint/no-explicit-any 린트 에러는 단순 규칙 비활성화로 해결할 문제가 아닙니다. 눈 앞 문제는 해결할 수 있지만, TypeScript를 사용하는 가장 중요한 이유를 위배하게 됩니다. any 타입은...

2025년 7월 23일269

JSP 주석, 아직도 `` 쓰시나요? 올바른 사용법

코드를 작성하다 보면 주석을 남기는 경우가 많습니다. 하지만 JSP 환경에서 어떤 주석을 사용하냐에 따라 보안 수준과 성능 이 크게 달라집니다. 표준 주석: 서버 사이드 주석 <%-- --%> JSP 페이지 내 개발 관련 주석은 <%-- --%> 를 사용하는게 좋습니다...

2025년 7월 9일144

쉽게 만드는 React Tab 라이브러리 react-tabs

개발자가 커스텀 스타일을 쉽게 적용할 수 있도록 최소한의 스타일만 제공하여 유연한 스타일링 이 가능한 라이브러리입니다. 상태 관리가 내장되어 있어 탭 선택 및 패널 표시 로직을 직접 구현할 필요 없이 간편하게 사용할 수 있습니다. 기본 사용법 먼저, 라이브러리를 설치합...

2025년 6월 17일173

Next.js 환경 변수 NEXT_PUBLIC 접두사 역할

NEXT_PUBLIC 접두사를 붙이면 변수의 접근 범위가 완전히 달라집니다. 이 차이점을 이해하는 것이 안전하고 효율적인 Next.js 애플리케이션을 구축하는 데 중요합니다. NEXT_PUBLIC 접두사가 없는 환경 변수 (서버 전용) NEXT_PUBLIC 접두사 없이...

2025년 6월 13일156