1일 1CS(Computer Science)

자바스크립트 Promise에 대해서 아는 대로 설명해주세요.

표자 2025. 5. 12. 08:52

Promise란? 🤔

Promise는 비동기 작업의 최종 완료(또는 실패)와 그 결과값을 나타내는 객체입니다. 쉽게 말해 "나중에 완료될 작업"에 대한 약속입니다.

// API에서 데이터를 가져오는 Promise 예시
const fetchUserData = (userId) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/users/${userId}`)
      .then(response => {
        if (response.ok) resolve(response.json());
        else reject(new Error('사용자 정보를 불러올 수 없습니다'));
      })
      .catch(error => reject(error));
  });
};

Promise의 3가지 상태 ⏳

Promise는 항상 다음 세 가지 상태 중 하나입니다:

  1. 대기(Pending) 🕒: 초기 상태, 비동기 작업 진행 중
  2. 이행(Fulfilled) ✅: 작업이 성공적으로 완료됨
  3. 거부(Rejected) ❌: 작업이 실패함

Promise 사용하기 💪

React 컴포넌트에서 Promise를 사용하는 간단한 예시입니다:

// React에서 Promise 사용 예시
function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  
  useEffect(() => {
    fetchUserData(userId)
      .then(data => setUser(data))
      .catch(error => console.error(error))
      .finally(() => setLoading(false));
  }, [userId]);
  
  if (loading) return <div>로딩 중...</div>;
  return <div>안녕하세요, {user.name}님!</div>;
}

Promise 체이닝 ⛓️

여러 비동기 작업을 순차적으로 실행할 때 Promise 체이닝이 유용합니다:

// Next.js API 라우트에서 Promise 체이닝
export default function handler(req, res) {
  validateInput(req.body)
    .then(data => processData(data))
    .then(result => saveToDatabase(result))
    .then(id => res.status(200).json({ success: true, id }))
    .catch(error => res.status(400).json({ error: error.message }));
}

여러 Promise 병렬 처리하기 🔄

여러 작업을 동시에 처리하고 싶을 때는 Promise.all()을 사용합니다:

// DCIM 대시보드를 위한 여러 데이터 동시에 가져오기
const loadDashboardData = async () => {
  try {
    const [servers, networks, power] = await Promise.all([
      fetchServers(),
      fetchNetworks(),
      fetchPowerMetrics()
    ]);
    return { servers, networks, power };
  } catch (error) {
    console.error('대시보드 로딩 실패:', error);
  }
};

Promise의 단점 ⚠️

1. 복잡한 에러 처리

여러 Promise가 중첩되면 에러 처리가 복잡해질 수 있습니다. 각 Promise마다 다른 에러 처리 로직이 필요할 때 특히 그렇습니다.

2. 여전히 존재하는 가독성 문제

Promise가 많아지면 .then()으로 이어지는 체인이 복잡해질 수 있어요:

// 콜백 지옥은 아니지만 여전히 복잡할 수 있음
fetchUser(userId)
  .then(user => fetchPermissions(user.id))
  .then(permissions => fetchResources(permissions))
  .then(resources => processResources(resources))
  .then(result => saveResult(result))
  .catch(error => handleError(error));

async/await으로 개선하기 🌟

Promise의 단점을 극복하기 위해 async/await 문법을 사용할 수 있습니다:

// 같은 로직을 async/await으로 개선
async function handleUserResources(userId) {
  try {
    const user = await fetchUser(userId);
    const permissions = await fetchPermissions(user.id);
    const resources = await fetchResources(permissions);
    const result = await processResources(resources);
    return await saveResult(result);
  } catch (error) {
    handleError(error);
  }
}

결론 🎯

Promise는 JavaScript 비동기 프로그래밍의 핵심 요소입니다. 특히 데이터센터 관리 시스템과 같은 복잡한 애플리케이션에서는 여러 API 호출과 데이터 처리가 필요하므로 Promise를 잘 활용하는 것이 중요합니다.

Next.js, React, Node.js 프로젝트에서 Promise를 잘 활용하면 더 깔끔하고 관리하기 쉬운 코드를 작성할 수 있습니다. 단, 복잡한 비동기 로직에는 async/await을 함께 사용하는 것이 가독성을 높이는 좋은 방법입니다!

 


 

자바스크립트 Promise에 대해서 아는 대로 설명해주세요.

프론트엔드와 관련된 질문이에요.

자바스크립트의 Promise는 비동기 작업을 관리하고, 해당 작업의 성공 또는 실패 결과를 나중에 사용할 수 있도록 하는 객체입니다. 정리해서 말씀드려보자면, Promise는 비동기 작업의 완료 여부를 약속해주는 개념이라고 할 수 있습니다.

자바스크립트는 비동기 처리를 위한 콜백 함수를 많이 사용합니다. 하지만 콜백 함수는 코드가 복잡해짐에 따라 콜백이 중첩되는 "콜백 지옥" 문제를 야기할 수 있습니다. Promise는 이러한 비동기 처리의 가독성을 높이고, 코드의 흐름을 명확하게 관리할 수 있도록 도와주는 방식입니다.

Promise는 다음과 같은 3가지 상태를 가지는데요. 첫번째로는 비동기 작업이 아직 완료되지 않은 초기 상태를 나타내는 Pending, 두번째로는 비동기 작업이 성공적으로 완료되어 값을 반환한 상태인 Fulfilled, 그리고 마지막으로 비동기 작업이 실패하여 오류를 반환한 상태인 Rejected입니다.

Promise 객체는 비동기 작업을 수행할 함수를 인자로 받아서 실행하며, 이 함수는 resolve()와 reject()라는 두 가지 콜백을 받습니다.

resolve()는 비동기 작업이 성공했을 때 값을 전달하여 Promise를 fulfilled 상태로 전환하고, reject()는 비동기 작업이 실패했을 때 오류를 전달하여 Promise를 rejected 상태로 전환합니다.

Pending 상태에서 Fulfilled나 Rejected 상태로 전환되면, 이후에는 다른 상태로 전환되지 않으며, 그 결과 값을 통해 해당 작업의 성공 여부를 알 수 있습니다.

Promise는 코드의 가독성을 높이고, 비동기 작업의 흐름을 제어하는 데에 매우 유용합니다. 특히 여러 개의 Promise를 순차적으로 연결할 수도 있고 Promise.all() 이나 allSettled() 같은 메서드를 통해 병렬로 비동기 작업을 처리할 수도 있습니다.

그럼 Promise의 단점은 없나요? 🤔

Promise는 비동기 작업의 가독성을 높이는데에 도움이 되지만 크게 2가지의 단점이 있습니다.

첫번째로는 복잡한 에러 처리입니다.
Promise는 단일 체인에서는 에러 처리가 간단하지만, 여러 Promise가 중첩되거나 서로 다른 비동기 흐름에서 에러가 발생할 경우 복잡도가 증가할 수 있습니다. 예를 들어, then() 체인 내의 중간 단계에서 오류가 발생하면 catch 블록에서 이를 캐치할 수 있지만, 특정 단계에서만 발생하는 에러를 세밀하게 다루기가 어렵습니다. 따라서 비동기 흐름에서 발생하는 다양한 에러를 모두 처리하려면 코드가 복잡해질 수 있습니다.

두번째로는 콜백 지옥을 완전히 해결하지는 못한다는 점입니다.
Promise는 콜백 지옥 문제를 어느 정도 해결하지만, 비동기 작업이 복잡하게 중첩되면 여전히 콜백과 유사하게 여러 then() 메서드가 연속해서 사용되며 가독성이 떨어질 수 있습니다. 여러 Promise를 순차적으로 실행해야 할 때 then() 체인을 계속 사용하면 코드의 들여쓰기 구조가 복잡해지고 이해하기 어려워지는 문제점이 있습니다. 이는 async/await을 통해 개선할 수 있습니다.

728x90