Files
2nd/10_Wiki/Topic_Programming/Frontend/Server_Actions.md
T
Antigravity Agent 9148c358d0 docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를
Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류.

- 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로
  자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거,
  동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거.
- 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming,
  Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business,
  Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로,
  나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는
  title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백).
  원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지.
- 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서.
- 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는
  지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지.
- Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경.
- 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
2026-07-05 00:33:48 +09:00

36 lines
4.2 KiB
Markdown

---
category: Frontend
tags: [auto-wikified, technical-documentation, frontend]
title: Server Actions
description: "Server Actions는 React Server Components(RSC) 아키텍처 환경에서 데이터를 변경(mutate)하기 위해 도입된 기능이다 [1]."
last_updated: 2026-05-04
---
# Server Actions
## 📌 Brief Summary
Server Actions는 React Server Components(RSC) 아키텍처 환경에서 데이터를 변경(mutate)하기 위해 도입된 기능이다 [1]. 코드 상단에 `"use server"` 지시어를 선언하여 서버에서 실행되는 함수를 정의하며, 클라이언트 컴포넌트에서는 이를 일반적인 바닐라 함수처럼 간편하게 호출할 수 있다 [2, 3]. 단일 폼(Form) 제출과 같은 상호작용 시 클라이언트와 서버 간의 단일 왕복(one round trip)만으로 데이터 처리 및 화면 갱신이 가능하여 뛰어난 효율성을 제공한다 [4, 5].
## 📖 Core Content
* **동작 원리 및 선언 방식**
Server Actions는 함수에 `"use server"` 프래그마(pragma)를 선언하여 생성한다 [2]. 클라이언트 컴포넌트는 이 함수를 가져와 버튼 클릭 등의 이벤트 핸들러에서 직접 호출할 수 있으며, 개발자에게는 단순한 함수 호출처럼 보이지만 내부적으로는 프레임워크가 자동으로 생성한 엔드포인트로 네트워크 POST 요청을 보내어 서버에서 코드를 실행한다 [2, 3].
* **상태 갱신 메커니즘**
서버 액션 내에서 데이터베이스 연산(예: SQLite UPDATE)을 수행한 후 `revalidateTag`와 같은 함수를 호출하면, 연관된 데이터의 캐시가 무효화된다 [2, 4]. 이로 인해 변경된 데이터를 기반으로 RSC가 다시 실행되고 업데이트된 마크업이 클라이언트로 전달되며, 이 모든 렌더링 및 통신 과정이 **서버와의 단일 왕복(one round trip) 내에서 완료**된다 [3, 4].
* **최적의 사용 사례**
Server Actions는 폼(form) 요소와 매우 잘 호환되며, 폼의 `action` 속성에 서버 액션을 직접 설정할 수도 있다 [5]. 복잡한 데이터 소스 없이 **단일 폼과 제출 버튼이 있는 페이지 구조에서 가장 뛰어난 성능과 효과**를 발휘한다 [5, 6].
## ⚖️ Trade-offs & Caveats
* **전체 컴포넌트 트리 재렌더링의 비효율성**
서버 액션 실행 후 `revalidateTag`를 호출하면 업데이트된 특정 데이터만 갱신되는 것이 아니라, 캐시에서 해당 태그를 방출함에 따라 **현재 페이지의 전체 컴포넌트 트리가 다시 렌더링되며 모든 데이터를 다시 요청**하게 된다 [4, 7]. 만약 서버 측에 적절한 캐싱 처리가 되어있지 않다면, 서버 액션을 통한 한 번의 왕복 통신이 오히려 `react-query`를 사용한 두 번의 왕복 처리보다 더 오래 걸리는 성능 저하를 초래할 수 있다 [7, 8].
* **직렬 실행(Serial Execution) 제약**
서버 액션은 **한 번에 하나씩만 실행될 수 있다는 치명적인 한계**를 가진다 [9]. 여러 개의 서버 액션을 동시에 시도할 경우 요청이 대기열(Queue)에 쌓이게 되며, 네트워크가 느리거나 불안정한 환경에서는 매우 심각한 성능 지연을 발생시킨다 [9]. 따라서 데이터 소스나 폼이 여러 개 존재하는 복잡한 화면에는 도입하기 적합하지 않다 [6].
* **심각한 보안 취약점 노출 위험 및 유효성 검사 필수**
`"use server"`로 선언된 서버 액션 함수는 로컬 내부 함수처럼 보이지만, **실제로는 인터넷상의 누구나 접근하여 POST 요청을 보낼 수 있는 퍼블릭 HTTP 엔드포인트**로 동작한다 [10]. 개발자가 이를 내부 함수로 착각하여 입력값 유효성 검사를 누락할 경우, 조작된 악성 요청에 의해 인증 없이 원격 코드가 실행되는 'React2Shell (CVE-2025-55182)'과 같은 치명적인 보안 취약점에 노출될 수 있다 [10, 11]. 따라서 기존 Express 라우트 핸들러나 API 엔드포인트를 다룰 때와 동일한 수준의 **엄격한 데이터 검증과 살균(Sanitization) 작업이 반드시 수반**되어야 한다 [10].
---
*Last updated: 2026-05-03*