자바스크립트 제너레이터와 비동기 프로그래밍

소개

자바스크립트는 비동기 프로그래밍을 위한 여러 가지 방법을 제공합니다. 그 중에서도 제너레이터는 비동기 코드를 작성하고 관리하는 데 유용한 도구입니다. 제너레이터를 사용하면 비동기적인 작업을 동기적으로 처리할 수 있어 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

제너레이터란?

제너레이터는 함수의 실행을 일시적으로 멈추고 재개할 수 있는 특별한 종류의 함수입니다. 제너레이터 함수는 function 키워드 뒤에 별표(*)를 붙여서 정의할 수 있습니다. 예를 들어, 다음은 제너레이터 함수를 정의하는 간단한 예입니다.

function* generatorFunction() {
  yield 1;
  yield 2;
  yield 3;
}

const generator = generatorFunction();
console.log(generator.next());  // { value: 1, done: false }
console.log(generator.next());  // { value: 2, done: false }
console.log(generator.next());  // { value: 3, done: false }
console.log(generator.next());  // { value: undefined, done: true }

위의 예제에서 generatorFunction은 숫자 1, 2, 3을 반환하는 제너레이터 함수입니다. yield 키워드는 함수의 실행을 일시적으로 멈추고 값을 반환합니다. generator.next() 메서드를 호출할 때마다 제너레이터 함수의 다음 yield 표현식까지 실행이 진행되며, value 속성에는 yield 표현식의 결과값이, done 속성에는 제너레이터 함수의 실행이 완료되었는지 여부가 담긴 객체가 반환됩니다.

제너레이터를 활용한 비동기 프로그래밍

제너레이터 함수는 비동기 프로그래밍과 함께 사용되면 더욱 강력한 도구가 될 수 있습니다. 제너레이터 함수를 이용하여 비동기 작업을 동기적으로 표현할 수 있으며, 콜백 헬(callback hell)을 피하고 비동기 코드를 더욱 가독성 좋게 작성할 수 있습니다.

다음은 제너레이터를 활용한 간단한 비동기 코드 예제입니다.

function* fetchData() {
  try {
    const response = yield fetch('https://api.example.com/data');
    const data = yield response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

const generator = fetchData();
const result = generator.next();

result.value
  .then(response => generator.next(response))
  .then(response => generator.next(response))
  .catch(error => generator.throw(error));

위의 예제에서 fetchData 제너레이터 함수는 비동기적으로 데이터를 가져오는 작업을 수행합니다. yield 표현식을 이용하여 fetch 함수를 호출하고 그 결과를 받아온 후, 다시 yield 표현식을 이용하여 JSON 데이터를 추출합니다. 마지막으로 데이터를 콘솔에 출력하며, 예외가 발생할 경우 catch 블록으로 이동하여 에러를 처리합니다.

fetchData 제너레이터 함수의 실행은 generator.next()와 함께 시작됩니다. 각 yield 표현식을 처리하기 위해 then 메서드를 이용하여 제너레이터를 재개하고, 예외가 발생한 경우 throw 메서드를 이용하여 제너레이터 함수 안의 catch 블록으로 이동할 수 있습니다.

결론

자바스크립트 제너레이터는 비동기 프로그래밍을 위한 강력한 기능을 제공합니다. 제너레이터를 사용하면 비동기 코드를 동기적으로 표현하고 관리할 수 있으며, 콜백 헬을 피하고 코드의 가독성을 높일 수 있습니다. 제너레이터를 활용하여 비동기 작업을 효과적으로 처리할 수 있도록 공부해보세요!

Happy coding!