자바스크립트 콜백 함수와 비동기 처리

자바스크립트는 단일 스레드 언어로, 한 번에 한 가지 작업만 처리할 수 있습니다. 그러나 웹 애플리케이션에서는 여러 작업이 동시에 발생하고, 이를 처리하기 위해 비동기 처리가 필요합니다. 이러한 비동기 처리를 위해 자바스크립트에서는 콜백 함수(callback function)를 사용합니다.

콜백 함수란?

콜백 함수란, 다른 함수의 인자(parameter)로 전달되는 함수를 말합니다. 비동기 작업이 완료되면, 이 콜백 함수가 호출되어 결과를 전달하거나 처리할 수 있습니다. 이렇게 콜백 함수를 사용하면, 비동기 작업의 완료를 기다리지 않고 다음 작업을 수행할 수 있습니다.

비동기 처리 예시

function fetchData(callback) {
    httpRequest('https://api.example.com/data', function(response) {
        callback(response);
    });
}

function displayData(data) {
    console.log(data);
}

fetchData(displayData);

위 예시에서 fetchData 함수는 비동기로 데이터를 가져오는 작업을 수행합니다. httpRequest 함수는 외부 API에 요청을 보내고, 요청이 완료되면 콜백 함수를 호출하여 데이터를 전달합니다. 이후 전달받은 데이터를 처리하기 위해 displayData 함수가 호출됩니다.

콜백 지옥(callback hell)

콜백 함수를 중첩해서 사용하면 콜백 지옥이라고 불리는 코드 구조가 형성될 수 있습니다. 콜백 지옥은 코드의 가독성을 저하시키고 유지보수를 어렵게 만듭니다.

function fetchData(callback) {
    httpRequest('https://api.example.com/data', function(response) {
        processResponse(response, function(result) {
            displayResult(result, function() {
                // more callbacks...
            });
        });
    });
}

위 예시에서 processResponse 함수와 displayResult 함수도 비동기 작업을 수행하며, 콜백 함수를 인자로 받습니다. 이러한 중첩된 콜백 함수는 코드를 복잡하게 만들고, 에러 처리를 어렵게 합니다.

해결 방법: Promise와 async/await

ES6부터는 Promise와 async/await를 사용하여 비동기 처리를 보다 간결하고 가독성 좋게 작성할 수 있습니다. Promise는 비동기 작업의 상태와 결과를 나타내는 객체이고, async/await는 Promise를 더 쉽게 사용할 수 있게 해주는 문법입니다.

function fetchData() {
    return new Promise(function(resolve, reject) {
        httpRequest('https://api.example.com/data', function(response) {
            resolve(response);
        });
    });
}

async function displayData() {
    const data = await fetchData();
    console.log(data);
}

displayData();

위 예시에서는 fetchData 함수가 Promise 객체를 반환하도록 수정되었습니다. resolve 함수를 호출하여 비동기 작업이 완료되었음을 알립니다. displayData 함수에서는 await 키워드를 사용하여 fetchData 함수의 결과를 기다리고, 데이터를 받아온 뒤 처리합니다.

Promise와 async/await를 사용하면 중첩된 콜백 함수 없이도 비동기 작업을 순차적으로 처리할 수 있으며, 가독성도 향상됩니다.

결론

자바스크립트의 콜백 함수와 비동기 처리는 웹 애플리케이션 개발에서 중요한 개념입니다. 콜백 함수를 이용하여 비동기 작업의 완료를 다룰 수 있으며, Promise와 async/await를 사용하면 보다 효율적이고 가독성 좋은 코드를 작성할 수 있습니다. 올바른 비동기 처리 방법을 활용하여 웹 애플리케이션의 성능과 사용자 경험을 향상시켜보세요.