서버 액션과 RPC(Remote Procedure Call)
RPC는 원격 프로시저 호출이라는 의미로, 원격에 있는 서버의 함수를 마치 로컬 함수처럼 직접 호출하는 기술입니다.

과거에는 클라이언트가 서버의 기능을 쓰려면 복잡한 API 주소를 외우고, HTTP 통신 규약을 맞추고
데이터를 JSON으로 변환하는 번거로운 과정을 거쳐야 했습니다.
하지만 RPC 아키텍처에서는 이 중간 과정을 싹 다 생략합니다. 곧바로 서버 로직을 수행합니다.
예를 들어, 개발자 입장에서는 그저 saveUser() 라는 함수를 수행했을 뿐인데
내부적으로는 네트워크를 타고 서버로 날아가서 로직이 수행되고 결과가 돌아오는 것입니다.

그리고, Next.js의 서버 액션(Server Actions)이 이 RPC 기술을 웹 프레임워크에 완벽하게 녹여낸 구현체입니다.
API 주소를 만들지 말고, 그냥 서버 함수를 바로 실행하자는 것입니다.
이 기술의 혁신성을 판단하려면, 웹의 역사를 알아볼 필요가 있습니다.
1990년대, 웹 초창기에는 서버에 데이터를 보내는 방법은 HTML의 form 태그를 사용하는 것이었습니다.
사용자가 데이터를 누르면 브라우저가 알아서 서버로 전송시켜 주는 구조였습니다.
하지만, 이 방식에는 치명적인 단점이 있는데, 데이터를 보낼 때마다 화면이 하얗게 변하며 새로고침 되기 때문입니다.
이로 인해 사용자가 입력한 데이터들이 초기화 되는 등 Worst UX를 초래하였습니다.
2010년대에는, 이런 불편함을 해결하기 위해 AJAX와 SPA입니다.
더 이상 페이지 전체를 새로고침 하지 않고 fetch API나 axios 라이브러리를 이용해 백그라운드에서 데이터만 주고받습니다.
하지만 이 방식이 보편화되면서 아주 작은 데이터를 수정하려고 해도 서버에 API 라우트를 따로 만들어야 하고
클라이언트에서는 그 주소를 외워 요청을 보내고, 로딩 상태와 에러 상태를 수동으로 관리해야 하는 번거로움이었습니다.
즉, 보일러플레이트가 폭발적으로 늘어난 것입니다. 즉, 본질적인 데이터 저장보다 통신을 위한 코드가 늘어난 것입니다.
이런 상황에서 Next.js가 놀라운 해답을 내놓았습니다.
바로, RPC 개념을 도입하여 form 태그의 단순했던 철학을 현대 기술에 응용한 것입니다. 이것이 Server Actions입니다.
개발자가 API 정의나, JSON 파싱을 고민하지 않고, 서버 파일에 정의된 함수를 클라이언트 파일로 가져와 실행하는 것입니다.
다음 코드를 보고 생각해보겠습니다.
'use server'use server라고 선언하는 순간 Next.js 프레임워크는 이 함수를 공개 가능한 API 엔드포인트로 자동 변환합니다.
export async function saveUser(formData: FormData) { ... }그리고, 클라이언트에서 이 함수를 호출하면, 마치 로컬 함수를 실행하는 것처럼 보이지만
내부적으로는 네트워크 요청을 날려 서버의 함수를 실행하고, 결과를 받아옵니다.
const username = formData.get('username')물론 실무 환경에서는 위와 같이 넘어온 데이터가 안전한지 실제로 검증해야 합니다. (Validation)
await db.user.create({ name: username })
revalidatePath("/")데이터가 변경된 후에는 강력한 캐시를 무효화하여 화면을 최신 상태로 동기화하는 과정이 수반되어야 합니다.
<form action={saveUser}></form>최종적으로 우리는