action
이 하는 역할action
은 React Router에서 특정 라우트에서 폼 제출 또는 데이터 변경 요청(예: DELETE
, POST
, PUT
)이 발생했을 때 실행되는 핸들러입니다.
즉, fetch
요청을 직접 작성하는 대신, useSubmit
훅이나 <Form>
을 사용하여 action
을 호출하면 자동으로 해당 action
함수가 실행됩니다.
action
사용 예제이 코드에서 action
은 이벤트 삭제 (DELETE 요청) 처리를 담당합니다.
export async function action({ request, params }) {
const eventId = params.eventId;
const response = await fetch("http://localhost:8080/events/" + eventId, {
method: request.method, // 보낸 요청의 메서드를 사용 (DELETE)
});
if (!response.ok) {
throw new Response(
JSON.stringify({
message: "Could not delete event.",
}),
{
status: 500,
}
);
}
return redirect("/events"); // 삭제 후 이벤트 목록 페이지로 이동
}
action
실행 흐름EventItem
에서 "Delete" 버튼 클릭 시, startDeleteHandler()
실행 window.confirm("Are you sure?")
에서 확인하면 submit(null, { method: "delete" })
실행 submit
이 실행되면서 해당 라우트(event-detail
의 action
)가 호출됨 action
이 DELETE
요청을 백엔드로 보냄 redirect("/events")
를 반환하여 페이지를 이동시킴 function startDeleteHandler() {
const proceed = window.confirm("Are you sure?");
if (proceed) {
submit(null, { method: "delete" });
}
}
action
이 필요한 이유useEffect
로 fetch
요청을 보내고, useState
로 데이터를 업데이트해야 하지만,action
을 사용하면 라우트 수준에서 데이터를 변경하고 바로 UI를 업데이트할 수 있음 action
을 사용하면 추가적인 상태 관리 없이도 데이터 변경을 처리하고, 페이지 이동을 쉽게 할 수 있음 redirect()
를 사용하여 데이터 변경 후 자동으로 페이지를 이동할 수 있음 POST
, PUT
, DELETE
)을 라우트에서 일괄 처리하여 코드를 구조적으로 관리할 수 있음 loader
vs action
정리기능 | loader | action |
---|---|---|
역할 | 페이지 렌더링 전에 데이터를 불러옴 (GET ) | 폼 제출이나 submit() 을 통해 데이터 변경 요청을 처리 (POST , PUT , DELETE ) |
실행 시점 | 페이지 이동 전에 실행됨 | submit 또는 <Form> 제출 시 실행됨 |
사용 예시 | 이벤트 목록 불러오기 | 이벤트 삭제, 수정, 생성 처리 |
리턴 값 | return response.json(); (데이터 반환) | return redirect(); (리디렉션 가능) |
핵심 기능 | 데이터를 미리 불러와 로딩 없이 페이지 표시 | 데이터를 변경하고, 필요 시 페이지 이동 처리 |
이제 action
을 활용하면 더 깔끔하고 구조적인 React Router 코드를 작성할 수 있습니다! 🚀