자바스크립트 동시성을 활용한 실시간 정산 시스템

개요

실시간 정산 시스템은 많은 비즈니스에서 필수적인 기능이며, 이를 위해 동시성이 필요합니다. 자바스크립트는 싱글 스레드 기반 언어로 알려져 있지만, 비동기 처리를 통해 동시성을 구현할 수 있습니다. 이번 게시물에서는 자바스크립트의 동시성을 활용하여 실시간 정산 시스템을 구현하는 방법에 대해 알아보겠습니다.

비동기 처리와 콜백 함수

자바스크립트에서 비동기 처리는 주로 콜백 함수를 사용하여 구현됩니다. 콜백 함수는 비동기 작업이 완료된 후 호출되는 함수로, 작업이 완료되면 콜백 함수가 실행되어 결과를 처리하는 것입니다. 이를 통해 다른 작업을 하며 작업이 완료될 때까지 기다리지 않고 동시에 작업을 수행할 수 있습니다.

function calculateTotal(orderIds, callback) {
  let total = 0;
  for (const orderId of orderIds) {
    fetchOrder(orderId, (order) => {
      total += order.price;
      if (total == orderIds.length) {
        callback(total);
      }
    });
  }
}

function fetchOrder(orderId, callback) {
  // 주문 정보를 가져오는 비동기 작업
  // ...
  // 작업이 완료되면 콜백 함수 호출
  callback(order);
}

// 사용 예시
const orderIds = [1, 2, 3];
calculateTotal(orderIds, (total) => {
  console.log('Total:', total);
});

위의 예시에서 calculateTotal 함수는 주문 ID 배열을 받아 각 주문 정보를 비동기로 가져와 총 금액을 계산합니다. 주문 정보를 가져오는 비동기 작업은 fetchOrder 함수를 호출하여 처리하며, 작업이 완료되면 콜백 함수가 실행됩니다. 총 금액 계산이 끝나면 결과를 처리하기 위해 마지막으로 전달된 콜백 함수가 호출됩니다.

Promise와 async/await

자바스크립트 ES6부터는 Promise와 async/await을 통해 비동기 처리를 더 간편하게 할 수 있습니다. Promise는 비동기 작업의 결과를 나타내는 객체로, 작업의 성공 또는 실패에 따라 다른 로직을 수행할 수 있습니다. async/await은 비동기 코드를 동기적으로 작성할 수 있도록 도와주는 문법입니다.

function calculateTotal(orderIds) {
  return Promise.all(orderIds.map(fetchOrder))
    .then((orders) => {
      let total = 0;
      for (const order of orders) {
        total += order.price;
      }
      return total;
    });
}

// 사용 예시
const orderIds = [1, 2, 3];
calculateTotal(orderIds)
  .then((total) => {
    console.log('Total:', total);
  });

위의 예시에서 calculateTotal 함수는 Promise.all을 사용하여 각 주문 정보를 비동기로 가져온 후, 총 금액을 계산합니다. fetchOrder 함수는 Promise 객체를 반환하므로, Promise.all을 사용하여 모든 주문 정보를 가져오기를 기다릴 수 있습니다. 마지막으로 then을 통해 총 금액을 처리할 수 있습니다.

async/await을 통해 동일한 작업을 더 간편하게 처리할 수도 있습니다.

async function calculateTotal(orderIds) {
  let total = 0;
  for (const orderId of orderIds) {
    const order = await fetchOrder(orderId);
    total += order.price;
  }
  return total;
}

// 사용 예시
const orderIds = [1, 2, 3];
calculateTotal(orderIds)
  .then((total) => {
    console.log('Total:', total);
  });

위의 예시에서 calculateTotal 함수를 async로 선언하고, await를 통해 비동기 작업의 완료를 기다릴 수 있습니다. 이를 통해 코드를 더 읽기 쉽고 직관적으로 작성할 수 있습니다.

결론

자바스크립트의 동시성을 활용하여 실시간 정산 시스템을 구현할 수 있습니다. 비동기 처리와 콜백 함수, Promise와 async/await을 통해 동시성을 구현하는 방법을 알아보았습니다. 이를 통해 복잡한 비동기 작업을 처리하고, 비즈니스 요구사항에 맞는 실시간 정산 시스템을 구축할 수 있습니다.

참고 자료