"액션은 비동기 함수를 마법으로 만드는 기능이 아니라, 변경 작업의 상태를 React 흐름에 연결하는 약속이야."
폼 액션의 입력과 결과
React 19의 폼 액션에는 함수를 연결할 수 있고, 함수는 보통 FormData를 받아 변경 작업을 수행해. 입력 필드 이름은 문자열이므로 formData.get('title')의 결과를 곧바로 string이라고 단정하지 말고 존재 여부와 타입을 검증해야 해.
액션 함수가 반환하는 상태를 useActionState와 연결하면 이전 상태, 액션, 대기 여부를 한 흐름에서 다룰 수 있어. 상태 타입을 판별 합집합으로 만들면 성공 메시지와 필드 오류를 안전하게 렌더링할 수 있지.
낙관적 UI와 실제 결과
useOptimistic은 서버 응답을 기다리는 동안 예상 결과를 먼저 보여 주는 데 도움을 줘. 하지만 실패했을 때 되돌릴 수 있어야 하고, 같은 항목에 여러 변경이 겹칠 때 식별자가 안정적이어야 해.
낙관적 값은 서버의 진실을 대체하지 않아. 응답이 오면 정식 데이터로 재조정하고, 실패나 권한 거부를 사용자에게 숨기지 마.
서버와 클라이언트 경계
서버 컴포넌트는 비동기 데이터를 읽고 JSX를 만들 수 있지만, 상태 훅과 브라우저 이벤트가 필요한 부분은 클라이언트 경계에 둬. 프레임워크의 'use client' 표시는 그 파일이 만드는 의존 그래프에 영향을 주므로 상위에 무심코 붙이면 브라우저 번들이 커질 수 있어.
서버에서 클라이언트로 넘기는 props는 직렬화 가능한 공개 데이터여야 해. TypeScript가 함수나 클래스 인스턴스의 전송 가능성을 모두 증명해 주지는 않으므로 프레임워크 빌드와 실제 렌더 경로로 확인해야 해.
Action에는 'use server' 지시문을 사용하고, useTransition, useOptimistic, useActionState 같은 훅을 조합해 전환 상태와 낙관적 갱신, 폼 상태를 다룰 수 있어.