본문 바로가기
Frontend

콜백 지옥 해결법 - Promise 와 async/await

by 신인프로그래머 2024. 3. 4.

 

 

콜백 지옥 해결법 Promise와 async await

 

콜백 지옥(Callback Hell)은 비동기 JavaScript 코드를 작성할 때 자주 발생하는 문제다

이는 여러 중첩된 콜백 함수가 가독성을 떨어뜨리고 코드 유지 관리를 어렵게 만든다

 

JavaScript에는 이 문제를 해결하는 두 가지 기능, Promise와 async/await가 있다

이들을 활용하면 코드를 훨씬 깔끔하게 유지할 수 있다

 

Promise를 사용한 비동기 통신

Promise는 비동기 작업을 위한 대표적인 해결책으로, 콜백 대신 사용할 수 있다

Promise는 비동기 작업의 성공(resolve) 또는 실패(reject)를 처리하는 객체다

예시: 파일 읽기 작업

콜백 방식

fs.readFile('file1.txt', 'utf8', function(err, data) {
    if (err) {
        console.error(err);
    } else {
        console.log(data);
    }
});

 

Promise 방식

const fsPromises = require('fs').promises;

fsPromises.readFile('file1.txt', 'utf8')
    .then(data => console.log(data))
    .catch(err => console.error(err));

Promise 방식에서 .then()은 비동기 작업이 성공했을 때 실행될 코드를, .catch()는 오류가 발생했을 때 실행될 코드를 정의한다

이를 통해 콜백 지옥을 피할 수 있으며, 코드의 가독성이 크게 향상된다

 

async/await를 사용한 비동기 통신

async/await는 Promise를 더욱 쉽게 사용할 수 있게 해주는 ES2017(ES8)의 기능이다

async 함수는 항상 Promise를 반환하며, await 키워드는 Promise가 해결될 때까지 함수의 실행을 일시 중지시킨다

예시: 여러 파일 순차적으로 읽기

async/await 방식:

const fsPromises = require('fs').promises;

async function readFilesSequentially() {
    try {
        const data1 = await fsPromises.readFile('file1.txt', 'utf8');
        console.log(data1);
        const data2 = await fsPromises.readFile('file2.txt', 'utf8');
        console.log(data2);
        // 추가 파일 처리 가능
    } catch (err) {
        console.error(err);
    }
}

readFilesSequentially();

async/await를 사용하면 비동기 코드를 동기 코드처럼 읽고 쓸 수 있다

이는 코드의 가독성을 크게 향상시키며, 복잡한 비동기 로직을 더 쉽게 구현할 수 있게 한다

 

결론

콜백 지옥은 Promise와 async/await를 사용함으로써 해결할 수 있다

Promise는 비동기 작업을 위한 강력한 추상화를 제공하며,

async/await는 Promise 기반 코드를 더욱 간결하고 읽기 쉽게 만들어 준다.

이러한 기술을 활용하면 복잡한 비동기 로직도 깔끔하고 효율적으로 관리할 수 있다

 

 
 
 
 

'Frontend' 카테고리의 다른 글

함수 선언형과 함수 표현식의 차이  (0) 2024.03.04
var, let, const 차이  (0) 2024.03.04
Promise와 Callback 차이  (0) 2024.03.04
비동기 함수  (0) 2024.03.02
자바스크립트 클로저 Closure  (0) 2024.03.02