React 개발을 하다 보면 데이터를 가져오거나 변경할 때 비동기 작업을 다루는 경우가 많습니다. 특히 API 요청을 보내고 응답을 받아와야 할 때 Promise 를 사용하여 비동기 작업을 처리하게 되는데요. React는 어떤 방식으로 비동기 작업을 다루고 있을까요?
5년차 소프트웨어 엔지니어 현명 님이 주니어 개발자들이 알면 좋을 만한 Promise 사용법과 비동기 작업이 필요한 이유에 대해 자세히 설명해주실 예정이니, Promise 사용에 대해 제대로 알고 싶은 분들은 이번 아티클에 주목해주세요.
Promise 란?
React에서 Promise는 JavaScript의 기능 중 하나로, 비동기 작업을 처리하는 데 사용됩니다. Promise는 어떤 작업이 완료되었을 때 무엇을 할 것인지를 나타내는 객체입니다. 주로 네트워크 요청, 파일 로딩, 데이터베이스 쿼리 등의 비동기 작업을 다룰 때 사용됩니다.
React에서 Promise는 일반적으로 데이터를 가져오거나 변경할 때 사용됩니다. 예를 들어, API 요청을 보내고 응답을 기다릴 때 Promise를 사용하여 비동기적으로 데이터를 가져올 수 있습니다.
React에서는 Promise를 사용하여 비동기 작업의 결과를 처리하고 상태를 업데이트하거나 UI를 업데이트하는 등의 작업을 수행합니다. 주로 fetch() 함수를 사용하여 API 요청을 보내고, 해당 요청의 응답을 처리하기 위해 Promise를 사용하는 것이 일반적입니다.
다음은 React에서 Promise를 사용하여 데이터를 가져오는 간단한 예시입니다.
fetch('https://api.example.com/data') .then(response => response.json()) // Promise를 사용하여 응답을 JSON 형식으로 파싱 .then(data => { // 파싱된 데이터를 처리하거나 상태를 업데이트하는 등의 작업 수행 console.log(data); }) .catch(error => { // 오류 처리 console.error('Error fetching data:', error); });
이 예제에서는 fetch() 함수를 사용하여 API에서 데이터를 가져옵니다. 이 함수는 Promise를 반환하며, 데이터가 성공적으로 가져와 지면 .then() 메서드를 사용하여 응답을 처리하고, 오류가 발생하면 .catch() 메서드를 사용하여 오류를 처리합니다. 그렇다면 비동기 작업이 필요한 이유는 무엇일까요? 비동기 작업이 필요한 이유는 주로 다음과 같습니다.
- 성능 향상
비동기 작업을 사용하면 여러 작업을 동시에 처리할 수 있으므로 전체적인 성능을 향상시킬 수 있습니다. 특히 네트워크 요청이나 파일 로딩과 같은 I/O 작업에서 비동기 작업을 사용하면 응답 대기 시간을 줄일 수 있습니다.
- 사용자 경험 개선
비동기 작업을 사용하면 사용자 인터페이스가 더 반응적이고 빠르게 동작할 수 있습니다. 예를 들어, 웹 페이지에서 비동기적으로 데이터를 가져와서 화면에 표시할 때 페이지의 로딩 시간이 감소하고 사용자가 더 빠르게 상호작용할 수 있습니다.
- 자원 관리
비동기 작업을 사용하면 자원을 효율적으로 관리할 수 있습니다. 특히 멀티스레딩을 통해 여러 작업을 동시에 처리하고 자원을 효율적으로 활용할 수 있습니다.
비동기 작업과 비교하여 동기 작업은 한 번에 하나의 작업만 처리하고, 다른 작업이 완료될 때까지 기다립니다. 동기 작업을 사용하면 작업이 차례대로 실행되므로 성능이 저하될 수 있고, 사용자 경험이 떨어질 수 있습니다. 또한 동기 작업을 사용하면 한 작업이 느리게 실행될 경우 다음 작업도 기다려야 하므로 전반적으로 시스템의 효율성이 떨어질 수 있습니다.
동기 작업 예시
function syncTask() { console.log("동기 작업 시작"); console.log("동기 작업 진행 중..."); console.log("동기 작업 완료"); } console.log("프로그램 시작"); syncTask(); console.log("프로그램 종료");
이 코드에서 syncTask() 함수는 동기적으로 실행되며, 해당 함수의 작업이 완료될 때까지 다음 코드로 진행되지 않습니다. 따라서 출력 결과는 다음과 같습니다.
프로그램 시작 동기 작업 시작 동기 작업 진행 중... 동기 작업 완료 프로그램 종료
비동기 작업 예시
function asyncTask() { console.log("비동기 작업 시작"); setTimeout(() => { console.log("비동기 작업 완료"); }, 2000); // 2초 후에 작업 완료 메시지 출력 } console.log("프로그램 시작"); asyncTask(); console.log("프로그램 종료");
이 코드에서 asyncTask() 함수는 비동기적으로 실행되며, setTimeout() 함수를 사용하여 2초 후에 작업이 완료되었다는 메시지를 출력합니다. 따라서 출력 결과는 다음과 같습니다.
프로그램 시작 비동기 작업 시작 프로그램 종료 비동기 작업 완료 // 2초 후에 출력됨
이번엔 React에서 사용하는 예시를 살펴볼게요.
React에서 비동기 작업을 다루는 일반적인 방법은 useState나 useEffect 훅을 사용하여 상태를 관리하고, 비동기 작업을 처리하는 함수를 호출하는 것입니다. 예를 들어, API에서 데이터를 가져와서 화면에 표시하는 경우를 살펴보겠습니다.
import React, { useState, useEffect } from 'react'; function App() { // 상태 초기화 const [data, setData] = useState(null); const [loading, setLoading] = useState(true); // useEffect를 사용하여 컴포넌트가 마운트될 때 데이터 가져오기 useEffect(() => { // 비동기 작업 시작 fetchData() .then(response => { // 데이터 가져오기 성공 시 상태 업데이트 setData(response); setLoading(false); }) .catch(error => { // 데이터 가져오기 실패 시 에러 처리 console.error('Error fetching data:', error); setLoading(false); }); }, []); // 빈 배열을 전달하여 컴포넌트가 마운트될 때 한 번만 실행되도록 함 // 데이터를 가져오는 비동기 함수 const fetchData = async () => { const response = await fetch('https://api.example.com/data'); const data = await response.json(); return data; }; return ( <div> <h1>React 비동기 작업 예시</h1> {loading ? ( <p>Loading...</p> ) : ( <div> <h2>Data:</h2> <pre>{JSON.stringify(data, null, 2)}</pre> </div> )} </div> ); } export default App;
위의 코드에서 useEffect 훅을 사용하여 컴포넌트가 마운트될 때 한 번만 데이터를 가져오도록 설정합니다. 그리고 fetchData 함수를 사용하여 API에서 데이터를 가져옵니다. 데이터를 가져오는 동안 loading 상태를 true로 설정하여 로딩 상태를 표시하고, 데이터를 성공적으로 가져오면 data 상태를 업데이트합니다. 만약 데이터를 가져오는 과정에서 오류가 발생하면 에러를 처리합니다.
이런 방식으로 React에서는 비동기 작업을 효과적으로 다룰 수 있습니다. 앞으로도 React 개발을 하면서 비동기 작업을 다루는 경우가 많을 겁니다. 이번 아티클에서 배운 Promise와 비동기 작업 처리 방식이 도움됐길 바라며, 이만 마칩니다.
🚢 개발자 이직 준비, 어떻게 시작해야 할지 모르겠나요? 한 단계 더 도약하는 험난한 항해에서 든든한 메이트가 되어드리겠습니다.
성장의 한계를 느끼고 있는 주니어 개발자들은 항해 플러스와 함께 하시면 됩니다. 기본기 역량 강화부터, 커리어 점프시켜 줄 TDD/성능최적화 프로젝트와 이직 코칭까지 한번에 할 수 있습니다. 성장을 향한 강한 의지만 있다면 항해 플러스 10주 성장 코스로 이직을 도전해보세요.
CREDIT
글 | 소프트웨어 엔지니어 김현명
Share article
Subscribe to our newsletter