| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- maxwidth
- 단어단위로떨어지기
- 그누보드반응형
- 동적객체
- npm start
- MediaQuery
- fontawesome
- 정적객체
- package.json
- legacy-peer
- 웹아이콘
- node 오류
- slickslider
- owlcarousel
- npm install
- vscode git clone
- npm install 문제
- googleicon
- window 정책변경
- XEIcon
- Git clone
- minwidth
- 아이콘사용법
- 글자들여쓰기
- react npm install
- 이미지반응형
- 플러그인
- 의존성문제
- git lab clone
- node설치
- Today
- Total
어쩌다 알게 된 ƪ(•̃͡•̃͡ ƪ
🟦 [React] input, useState는 비동기 처리, useEffect는 동기적 처리 본문
input에 쓰는 글을 console.log로 실시간으로 보고 있는데 비동기 처리에 대한 걸 알았다!
비동기 처리란?
- 비동기 처리(asynchronous processing)는 작업이 시작된 후 그 결과를 기다리지 않고, 다음 작업을 바로 실행하는 프로그래밍 방식
- 비동기 작업은 주로 시간이 걸리는 작업(예: 네트워크 요청, 파일 읽기, 타이머, 상태 업데이트)에서 사용
useState의 변경함수는 바꾸는데 시간이 좀 걸려서 처음 글자는 못 가져 온다고 한다.
이것이 비동기 처리!
코드 👇
import { useState } from 'react'
import './App.css'
function App() {
let [입력값, 입력값변경] = useState('');
return(
<>
<input onChange={(e) => {
입력값변경(e.target.value); ✅
console.log(입력값);}}
/>
</>
)
}
export default App;
결과 👇

📌 발생 순서
1. 사용자가 입력 필드에 값을 입력하면 onChange 이벤트가 발생
2. 이벤트 핸들러가 실행되며 입력값변경(e.target.value)가 호출
3. 입력값변경(e.target.value)를 호출하면 React가 입력값 상태를 업데이트
3-1. 하지만 React 상태 업데이트는 비동기적으로 처리되므로, 상태 값(입력값)은 즉시 변경되지 않음
4. console.log(입력값)은 상태가 업데이트되기 전에 실행되므로 이전 상태 값이 출력
📌 비동기 처리로 발생한 상황
=> console.log(입력값)은 상태가 변경되기 전에 실행되므로 이전 상태 값이 출력
개선 코드1 👇
import { useState } from 'react'
import './App.css'
function App() {
let [입력값, 입력값변경] = useState('');
console.log(입력값); ✅
return(
<>
<input onChange={(e) => {
입력값변경(e.target.value);
}}
/>
</>
)
}
export default App;
결과 👇

👩🏻:
이렇게 쓰면 바로바로 console.log에 찍히긴 하는데 useState 자체가 비동기 방식이라서 그렇게 보일 수 있다고 한다.
당장 해결은 가능하나, 좋은 방법은 아닌 듯?
❗❗
=> 상태 업데이트가 완료되기 전에 console.log가 실행되므로, 항상 이전 상태 값이 출력
=> 실시간으로 변경 값을 알고 싶다면 올바른 방법이 아님
개선 코드2 (useEffect) 사용 👇
import { useState, useEffect } from 'react';
import './App.css';
function App() {
let [입력값, 입력값변경] = useState('');
// 상태가 변경된 이후 실행되는 useEffect
useEffect(() => {
console.log(입력값);
}, [입력값]); // 입력값이 변경될 때마다 실행
return (
<>
<input
onChange={(e) => {
입력값변경(e.target.value); // 상태 업데이트
}}
/>
</>
);
}
export default App;
📌 코드 실행 순서
1. 컴포넌트 렌더링
-> 컴포넌트가 처음 렌더링되면, useState 훅이 호출되어 입력값이라는 상태 변수와 상태를 변경하는 함수인 입력값변경을 반환
2. 사용자 입력(onChange)
3. 상태 업데이트 (입력값 변경)
-> 입력값변경(e.target.value)가 호출되면, React는 상태 업데이트를 비동기적으로 처리 후 상태 값은 바로 변경되지 않고, React가 렌더링을 새로 수행해야 변경된 값이 반영
4. 컴포넌트 재렌더링
-> 상태가 변경되면, React는 다시 컴포넌트를 렌더링 (입력값이 새로운 값으로 갱신)
5. useEffect 실행
-> 렌더링 이후에 실행
-> useEffect의 두 번째 인자인 [입력값] 배열이 있기 때문에 입력값이 변경될 때마다 실행
-> 상태가 변경되어 컴포넌트가 재렌더링되었기 때문에 useEffect가 실행되며, console.log(입력값)이 최신 상태 값을 출력
📌 useEffect를 사용한 상황
=> useState에 의한 상태 변경은 비동기적으로 처리되지만, useEffect로 그 결과를 처리하는 것은 동기적처럼 보이게 됨
❗❗
=> useEffect는 렌더링 이후 실행 -> 입력값이 변경된 후에, 변경된 값을 확실하게 확인 가능!!
=> useEffect는 상태가 변경된 후 추가적인 작업(예: API 호출, 다른 상태 업데이트 등)을 처리하는 데 유용
📌 개선 코드1과 개선 코드 2의 차이점
- 상태 변경 후의 작업이나 최신 상태 값을 처리하고 싶다면 useEffect를 사용하는 것이 더 적합.
- 상태 변경 전의 값을 확인하거나, 상태 업데이트 직후의 값을 바로 처리할 필요가 없다면 let 아래에서 console.log()를 사용할 수 있지만, React의 상태 변경 흐름을 고려하면 useEffect를 사용하는 것이 더 일관되고 안전한 방식
'개발 > 🟦 React' 카테고리의 다른 글
| 🟦 [React] trim(), 기존 useState에 배열 추가하기 2 (1) | 2025.01.31 |
|---|---|
| 🟦 [React] trim(), 기존 useState에 배열 추가하기 (2) | 2025.01.31 |
| [문법] useEffect (2) | 2025.01.20 |
| [문법] .map(), 컴포넌트, props 사용하여 각 동작 제어하기 (3) | 2025.01.17 |
| [문법] 파라미터(props) 사용 (부모 -> 자식) 2 (1) | 2025.01.16 |
