"비동기 프로그래밍 입문" 강의를 듣던 중, Promise와 async/await를 통해 비동기 작업을 다루는 방법을 듣게 되었는데 다루는 방법은 알고 있었지만, 원론적인 작동 방식이 궁금하다는 생각이 들었다. 그래서 React에서 비동기 작업이 어떻게 처리되는지, 호출 스택, 이벤트 루프, 백그라운드, 태스크 큐를 중심으로 정리 해본다.

비동기 작업의 처리 메커니즘을 그림으로 표현한 것이다.
용어 마다 개념을 알아보자.
코드예시를 통해 좀 더 알아보자!
import React, { useEffect, useState } from "react";
import axios from "axios";
const App = () => {
const [todo, setTodo] = useState({ title: "" });
const [todos, setTodos] = useState(null);
const [targetId, setTargetId] = useState(null);
const [editTodo, setEditTodo] = useState({ title: "" });
const fetchTodos = async () => {
const { data } = await axios.get("http://localhost:4000/todos");
setTodos(data);
};
const onSubmitHandler = (todo) => {
axios.post("http://localhost:4000/todos", todo);
};
const onClickDeleteButtonHandler = (todoId) => {
axios.delete(`http://localhost:4000/todos/${todoId}`);
};
const onClickEditButtonHandler = (todoId, edit) => {
axios.patch(`http://localhost:4000/todos/${todoId}`, edit);
};
useEffect(() => {
fetchTodos();
}, []);
return (
<>
<form
onSubmit={(e) => {
e.preventDefault();
onSubmitHandler(todo);
}}
>
<div>
<input
type="text"
placeholder="수정하고싶은 Todo ID"
onChange={(ev) => {
setTargetId(ev.target.value);
}}
/>
<input
type="text"
placeholder="수정값 입력"
onChange={(ev) => {
setEditTodo({
...editTodo,
title: ev.target.value,
});
}}
/>
<button
type="button"
onClick={() => onClickEditButtonHandler(targetId, editTodo)}
>
수정하기
</button>
</div>
<input
type="text"
onChange={(ev) => {
const { value } = ev.target;
setTodo({
...todo,
title: value,
});
}}
/>
<button>추가하기</button>
</form>
<div>
{todos?.map((todo) => (
<div key={todo.id}>
{todo.id} : {todo.title}
<button
type="button"
onClick={() => onClickDeleteButtonHandler(todo.id)}
>
삭제하기
</button>
</div>
))}
</div>
</>
);
};
export default App;
React에서 비동기 작업이 어떻게 처리되는지, 전체적인 코드 흐름을 통해 알아보자.
fetchTodos 함수
const fetchTodos = async () => {
const { data } = await axios.get("http://localhost:4000/todos");
setTodos(data);
};
나머지 onSubmitHandle, onClickDeleteButtonHandler, onClickEditButtonHandler함수의 비동기적 처리 방법은 동일하므로 생략한다.