Ch.12 React 상태 관리 — 살아 움직이는 UI
이벤트와 폼 처리
onClick은 알겠는데 input 값은 어떻게?
Ch7에서 HTML 폼을 배웠죠? React에서는 폼 데이터를 state로 관리합니다.
사용자 입력을 실시간으로 추적하려면?
Controlled Component — input의 값을 state로 제어하여 React가 모든 데이터를 관리하게 합니다.
핵심 내용
React 이벤트는 camelCase로 작성하고 함수 자체를 전달합니다
import { useState } from "react";
function EventDemo() {
const [message, setMessage] = useState("아직 아무 일도 없음");
// 이벤트 핸들러 함수
const handleClick = () => {
setMessage("버튼이 클릭되었습니다!");
};
const handleMouseEnter = () => {
setMessage("마우스가 올라왔습니다!");
};
const handleDoubleClick = () => {
setMessage("더블클릭 감지!");
};
return (
<div>
<p>{message}</p>
<button onClick={handleClick}>클릭</button>
<button onMouseEnter={handleMouseEnter}>호버</button>
<button onDoubleClick={handleDoubleClick}>더블클릭</button>
</div>
);
}React 이벤트 주의사항 ✅ `onClick={handleClick}` — 함수 참조를 전달 ❌ `onClick={handleClick()}` — 함수를 즉시 실행 (렌더링 시 바로 호출됨!) 인자를 전달하려면: `onClick={() => handleClick(id)}` — 화살표 함수로 감싸기
input의 value를 state로 제어하면 입력값을 완벽하게 관리할 수 있습니다
import { useState } from "react";
function SearchBar() {
const [query, setQuery] = useState("");
const handleChange = (e) => {
setQuery(e.target.value);
};
return (
<div>
<input
type="text"
value={query} // state가 input의 값을 제어
onChange={handleChange} // 타이핑할 때마다 state 업데이트
placeholder="검색어 입력..."
/>
<p>현재 입력: {query}</p>
<p>글자 수: {query.length}</p>
</div>
);
}사용자 타이핑: 키보드로 문자 입력
onChange 발생: e.target.value에 새 값이 담김
setState 호출: setQuery(e.target.value)로 state 업데이트
리렌더링: input의 value가 새 state로 표시
왜 Controlled Component를 사용할까? 1. 입력값 검증: 실시간으로 유효성 검사 가능 (예: 비밀번호 강도) 2. 입력 제한: 숫자만 허용, 최대 길이 제한 등 3. 실시간 검색: 타이핑할 때마다 검색 결과 필터링 4. 다른 UI와 동기화: 미리보기, 글자 수 표시 등
form의 onSubmit에서 preventDefault로 기본 동작을 막습니다
import { useState } from "react";
function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const handleSubmit = (e) => {
e.preventDefault(); // 페이지 새로고침 방지!
// 유효성 검사
if (!email.includes("@")) {
setError("올바른 이메일을 입력하세요");
return;
}
if (password.length < 6) {
setError("비밀번호는 6자 이상이어야 합니다");
return;
}
setError("");
console.log("로그인 시도:", { email, password });
// API 호출...
};
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="이메일"
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="비밀번호"
/>
{error && <p className="error">{error}</p>}
<button type="submit">로그인</button>
</form>
);
}폼 처리 핵심 3단계 1. `e.preventDefault()` — 기본 폼 제출(페이지 새로고침) 방지 2. 유효성 검사 — 입력값이 올바른지 확인 3. 데이터 전송 — API 호출 또는 상태 업데이트 각 input의 value와 onChange를 state에 연결하는 것이 Controlled Form 패턴입니다.
React에서 input의 value를 state로 관리하는 패턴을 무엇이라 하나?
React에서 onClick={handleClick()}으로 이벤트를 연결하면 클릭 시에만 실행된다
form 제출 시 페이지 새로고침을 방지하려면 ___ 를 호출한다
이벤트와 폼 처리 클리어!
정리 노트
React 이벤트와 폼 처리 정리
React 이벤트
- onClick / onChange
- JSX에서 카멜케이스로 이벤트 핸들러 연결
- 합성 이벤트
- React가 브라우저 이벤트를 래핑하여 일관된 API 제공
- 핸들러 함수
- const handleClick = (e) => { ... } — 함수 참조를 전달
Controlled Input
- value + onChange
- input의 value를 state로 제어 — 양방향 바인딩
- 폼 제출
- onSubmit + e.preventDefault()로 새로고침 방지
- 다중 입력
- name 속성 활용하여 하나의 핸들러로 여러 input 관리
Controlled Input은 React가 폼 데이터의 '단일 진실 공급원'이 되는 패턴입니다.
핵심 정리
- 1React 이벤트는 camelCase, 함수 참조를 전달 (괄호 붙이지 않기!)
- 2Controlled Component = value + onChange + state 연결
- 3폼 제출: onSubmit + e.preventDefault() + 유효성 검사
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작