임동욱 임동욱 08-20
fix: 공지사항 사용여부·상단고정·앱푸쉬가 저장되지 않던 문제
두 가지가 겹쳐 세 토글이 모두 먹히지 않았다.

1. 폼과 Server Action의 값 규약이 어긋났다. 팝업을 @fox로 옮기며 토글을 value="true"로 두었는데
   게시판 액션의 readBoolean은 'Y'만 참으로 본다 — 켜도 항상 false가 되어 'N'으로 저장됐다.
   꾸미기 아이템 쪽 규약을 그대로 가져온 것이 원인이라 게시판 규약('Y')에 맞췄다.

2. 수정 PUT을 쿼리스트링으로 보내고 있었다. 백엔드 update는 @RequestBody(JSON)라 본문이 비어
   바인딩이 되지 않고, 통과하더라도 전 필드가 null이라 UPDATE의  가드가
   모두 건너뛴다 — 수정으로는 어떤 값도 바뀌지 않았다. 1:1문의 답변 저장도 같은 경로였다.
   등록 POST는 컨트롤러가 form 바인딩이라 그대로 둔다.

검증 — 팝업 FormData 실측: 기본 상태 isVisible='Y'(켜짐)·isPinned/isPushEnabled 없음(꺼짐),
두 토글을 켜면 셋 다 'Y'로 실린다(액션의 'Y' 규약과 일치).

TODO(백엔드): 앱푸쉬는 이 수정으로도 저장되지 않는다 — PUSH_YN이 MngrBbsMapper.xml의
INSERT·UPDATE·SELECT 어디에도 없다.

Co-Authored-By: Claude Opus 5 
@0822da2d51ea083be9c46dcb2ce31e84dd98a2f2
app/(protected)/(basic)/boards/_components/board-post-form-modal.tsx
--- app/(protected)/(basic)/boards/_components/board-post-form-modal.tsx
+++ app/(protected)/(basic)/boards/_components/board-post-form-modal.tsx
@@ -193,7 +193,7 @@
             <FoxToggleSwitch
               size="md"
               name="isPinned"
-              value="true"
+              value="Y"
               label={isPinned ? '고정' : '미고정'}
               checked={isPinned}
               onChange={setIsPinned}
@@ -237,7 +237,7 @@
           <FoxToggleSwitch
             size="md"
             name="isVisible"
-            value="true"
+            value="Y"
             label={isVisible ? '노출' : '미노출'}
             checked={isVisible}
             onChange={setIsVisible}
@@ -250,7 +250,7 @@
             <FoxToggleSwitch
               size="md"
               name="isPushEnabled"
-              value="true"
+              value="Y"
               label={isPushEnabled ? '발송' : '미발송'}
               checked={isPushEnabled}
               onChange={setIsPushEnabled}
lib/data/repositories/board-post-repository.ts
--- lib/data/repositories/board-post-repository.ts
+++ lib/data/repositories/board-post-repository.ts
@@ -311,8 +311,7 @@
 
   const result = await backendFetch<null>(`${BOARD_BASE_PATH}/${bbsId}`, {
     method: 'PUT',
-    // 수정은 컨트롤러가 `@ParameterObject`라 쿼리스트링으로 받는다(본문이 아니다).
-    query: buildWriteParams(boardType, input),
+    body: buildWriteParams(boardType, input),
     accessToken: accessToken ?? undefined,
     cache: 'no-store',
     // 쓰기 API는 성공해도 `data: null`을 돌려준다(ApiResponseVO.success(null)).
@@ -342,16 +341,16 @@
 ): Promise<void> {
   const accessToken = await getSessionAccessToken();
 
-  const query: Record<string, string> = {
+  const payload: Record<string, string> = {
     stngId: BOARD_SETTING_IDS.inquiry,
     ansSttsCd: input.answerStatusCode,
   };
-  if (input.answerContent) query.ansCn = input.answerContent;
-  if (input.attachmentId) query.atchFileId = input.attachmentId;
+  if (input.answerContent) payload.ansCn = input.answerContent;
+  if (input.attachmentId) payload.atchFileId = input.attachmentId;
 
   const result = await backendFetch<null>(`${BOARD_BASE_PATH}/${bbsId}`, {
     method: 'PUT',
-    query,
+    body: payload,
     accessToken: accessToken ?? undefined,
     cache: 'no-store',
     // 쓰기 API는 성공해도 `data: null`을 돌려준다(ApiResponseVO.success(null)).
Add a comment
List