임동욱 임동욱 08-19
fix: 게시판 쓰기 실패가 잡히지 않아 크래시로 이어지던 문제
등록·수정·답변·삭제 네 곳 모두 Repository 호출을 try/catch 없이 부르고 있었다. 첨부 업로드만
감싸여 있었다. 백엔드가 거절하면 `BackendRequestError`가 Server Action 밖으로 그대로 튀어
프레임워크의 오류 처리로 넘어가고, 화면에는 "Cannot read properties of undefined (reading
'stack')" 같은 엉뚱한 오류가 뜬다 — 사용자는 무엇이 잘못됐는지 알 수 없다.

네 곳을 `runWrite`로 감싸 실패를 폼 상태로 바꾼다. 백엔드가 준 문구를 그대로 보여주고, 그것이
없을 때만 일반 문구로 떨어진다 — 다른 화면(관리자·아이템)이 이미 쓰는 방식이다.

Co-Authored-By: Claude Opus 5 
@3149cbe3cbdf72ee3939423bc1728648cbe37aff
app/(protected)/(basic)/boards/_actions.ts
--- app/(protected)/(basic)/boards/_actions.ts
+++ app/(protected)/(basic)/boards/_actions.ts
@@ -52,6 +52,23 @@
 const OVERSIZE_MESSAGE = `첨부파일은 ${Math.floor(
   MAX_ATTACHMENT_BYTES / (1024 * 1024)
 )}MB 이하만 올릴 수 있습니다.`;
+const SAVE_FAILED_MESSAGE = '저장하지 못했습니다. 잠시 후 다시 시도해 주세요.';
+const DELETE_FAILED_MESSAGE = '삭제하지 못했습니다. 잠시 후 다시 시도해 주세요.';
+
+async function runWrite(
+  write: () => Promise<void>,
+  fallback: string
+): Promise<BoardPostFormState | null> {
+  try {
+    await write();
+    return null;
+  } catch (error) {
+    return {
+      status: 'error',
+      message: error instanceof Error ? error.message : fallback,
+    };
+  }
+}
 
 function readString(formData: FormData, key: string): string {
   const value = formData.get(key);
@@ -136,7 +153,13 @@
     return { status: 'error', errors: validation.errors };
   }
 
-  await createBoardPost(boardType, validation.values);
+  const failure = await runWrite(
+    () => createBoardPost(boardType, validation.values),
+    SAVE_FAILED_MESSAGE
+  );
+  if (failure) {
+    return failure;
+  }
 
   revalidatePath(BOARD_PATHS[boardType]);
   return { status: 'success' };
@@ -173,7 +196,13 @@
     return { status: 'error', errors: validation.errors };
   }
 
-  await updateBoardPost(boardType, bbsId, validation.values);
+  const failure = await runWrite(
+    () => updateBoardPost(boardType, bbsId, validation.values),
+    SAVE_FAILED_MESSAGE
+  );
+  if (failure) {
+    return failure;
+  }
 
   revalidatePath(BOARD_PATHS[boardType]);
   return { status: 'success' };
@@ -213,7 +242,13 @@
     return { status: 'error', errors: validation.errors };
   }
 
-  await saveInquiryAnswer(bbsId, validation.values);
+  const failure = await runWrite(
+    () => saveInquiryAnswer(bbsId, validation.values),
+    SAVE_FAILED_MESSAGE
+  );
+  if (failure) {
+    return failure;
+  }
 
   revalidatePath(BOARD_PATHS.inquiry);
   return { status: 'success' };
@@ -235,7 +270,13 @@
     return { status: 'error', message: INVALID_REQUEST_MESSAGE };
   }
 
-  await deleteBoardPost(bbsId);
+  const failure = await runWrite(
+    () => deleteBoardPost(bbsId),
+    DELETE_FAILED_MESSAGE
+  );
+  if (failure) {
+    return failure;
+  }
 
   revalidatePath(BOARD_PATHS[boardType]);
   return { status: 'success' };
Add a comment
List