From c548c6ce484874d02b8dfb432127b9da5311742e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=ED=95=9C=EB=8F=99=ED=98=84?= <hando1220@ajou.ac.kr>
Date: Sat, 29 Mar 2025 15:28:33 +0900
Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=20=EA=B4=80?=
 =?UTF-8?q?=EB=A0=A8=20=EB=A0=88=EC=9D=B4=EB=B8=94=20=EA=B0=9D=EC=B2=B4=20?=
 =?UTF-8?q?=EB=B6=84=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/pages/Home.tsx         | 18 +++---------------
 src/pages/log/List.tsx     | 36 ++++++++++++------------------------
 src/pages/routing/Edit.tsx |  2 ++
 src/types/log.ts           | 16 ++++++++++++++--
 4 files changed, 31 insertions(+), 41 deletions(-)

diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
index 8c3af39..ec21bf5 100644
--- a/src/pages/Home.tsx
+++ b/src/pages/Home.tsx
@@ -8,7 +8,7 @@ import { Skeleton } from '@/components/ui/skeleton';
 import { Badge } from '@/components/ui/badge';
 import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardDescription } from '@/components/ui/card';
 import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
-import { Log, LogListResponse } from '@/types/log';
+import { Log, LogListResponse, ActionLabels, TypeLabels } from '@/types/log';
 
 interface ProjectInfo {
   routing: number;
@@ -16,18 +16,6 @@ interface ProjectInfo {
   certificate: number;
 }
 
-const ACTION = {
-  CREATE: '생성',
-  UPDATE: '수정',
-  DELETE: '삭제',
-};
-
-const TYPE = {
-  ROUTING: '라우팅',
-  CERTIFICATE: '인증서',
-  FORWARDING: '포워딩',
-};
-
 export default function Home() {
   const { authFetch, selectedProject } = useAuthStore();
   const [logs, setLogs] = useState<Log[] | null>(null);
@@ -184,8 +172,8 @@ export default function Home() {
                     <TableCell>{log.createdAt}</TableCell>
                     <TableCell>
                       <div className="flex items-center gap-2">
-                        <Badge variant="default">{TYPE[log.type]}</Badge>
-                        <Badge variant="secondary">{ACTION[log.action]}</Badge>
+                        <Badge variant="default">{TypeLabels[log.type]}</Badge>
+                        <Badge variant="secondary">{ActionLabels[log.action]}</Badge>
                         <div>{log.description.split('\n').join(' / ')}</div>
                       </div>
                     </TableCell>
diff --git a/src/pages/log/List.tsx b/src/pages/log/List.tsx
index 152ef04..c504bf5 100644
--- a/src/pages/log/List.tsx
+++ b/src/pages/log/List.tsx
@@ -28,7 +28,7 @@ import {
   DropdownMenuTrigger,
 } from '@/components/ui/dropdown-menu';
 import { cn } from '@/lib/utils';
-import { Log, LogListResponse, Action, Type } from '@/types/log';
+import { Log, LogListResponse, Action, Type, ActionLabels, TypeLabels } from '@/types/log';
 
 interface PageInfo {
   first: boolean;
@@ -37,18 +37,6 @@ interface PageInfo {
   totalPages: number;
 }
 
-const ACTION = {
-  CREATE: '생성',
-  UPDATE: '수정',
-  DELETE: '삭제',
-};
-
-const TYPE = {
-  ROUTING: '라우팅',
-  CERTIFICATE: '인증서',
-  FORWARDING: '포워딩',
-};
-
 export default function LogList() {
   const { authFetch, selectedProject } = useAuthStore();
   const [searchParams, setSearchParams] = useSearchParams();
@@ -63,7 +51,7 @@ export default function LogList() {
   useEffect(() => {
     setLogs(null);
 
-    authFetch(`/api/logs?projectId=${selectedProject?.id}&page=${page - 1}&${searchParams.toString().toLowerCase()}`)
+    authFetch(`/api/logs?projectId=${selectedProject?.id}&page=${page - 1}&${searchParams.toString()}`)
       .then((response): Promise<LogListResponse> => {
         if (!response.ok) throw new Error(`로그 목록 조회 실패: (${response.status})`);
 
@@ -114,9 +102,9 @@ export default function LogList() {
                     })
                   }
                 >
-                  <DropdownMenuRadioItem value="ROUTING">라우팅</DropdownMenuRadioItem>
-                  <DropdownMenuRadioItem value="FORWARDING">포워딩</DropdownMenuRadioItem>
-                  <DropdownMenuRadioItem value="CERTIFICATE">인증서</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="routing">라우팅</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="forwarding">포워딩</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="certificate">인증서</DropdownMenuRadioItem>
                 </DropdownMenuRadioGroup>
                 <DropdownMenuSeparator />
                 <DropdownMenuLabel>설정 내용</DropdownMenuLabel>
@@ -131,9 +119,9 @@ export default function LogList() {
                     })
                   }
                 >
-                  <DropdownMenuRadioItem value="CREATE">생성</DropdownMenuRadioItem>
-                  <DropdownMenuRadioItem value="UPDATE">수정</DropdownMenuRadioItem>
-                  <DropdownMenuRadioItem value="DELETE">삭제</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="create">생성</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="update">수정</DropdownMenuRadioItem>
+                  <DropdownMenuRadioItem value="delete">삭제</DropdownMenuRadioItem>
                 </DropdownMenuRadioGroup>
               </DropdownMenuContent>
             </DropdownMenu>
@@ -163,7 +151,7 @@ export default function LogList() {
                       })
                     }
                   >
-                    {TYPE[type]}
+                    {TypeLabels[type]}
                     <X className="cursor-pointer" />
                   </Badge>
                 )}
@@ -179,7 +167,7 @@ export default function LogList() {
                       })
                     }
                   >
-                    {ACTION[action]}
+                    {ActionLabels[action]}
                     <X className="cursor-pointer" />
                   </Badge>
                 )}
@@ -234,8 +222,8 @@ export default function LogList() {
                     <TableCell>{log.createdAt}</TableCell>
                     <TableCell>
                       <div className="flex items-center gap-2">
-                        <Badge variant="default">{TYPE[log.type]}</Badge>
-                        <Badge variant="secondary">{ACTION[log.action]}</Badge>
+                        <Badge variant="default">{TypeLabels[log.type]}</Badge>
+                        <Badge variant="secondary">{ActionLabels[log.action]}</Badge>
                         <div>{log.description.split('\n').join(' / ')}</div>
                       </div>
                     </TableCell>
diff --git a/src/pages/routing/Edit.tsx b/src/pages/routing/Edit.tsx
index 0520a9a..e3d201b 100644
--- a/src/pages/routing/Edit.tsx
+++ b/src/pages/routing/Edit.tsx
@@ -151,6 +151,8 @@ export default function RoutingEdit() {
       if (code == 'DUPLICATED_DOMAIN_NAME') {
         form.setError('domain', { type: 'custom' });
         toast.error('이미 사용중인 도메인입니다');
+      } else if (code == 'NOT_FOUND_FORWARDING') {
+        toast.error('서버 오류가 발생했습니다. 관리자에게 문의하세요.');
       } else {
         toast.error('라우팅 설정 수정에 실패하였습니다');
       }
diff --git a/src/types/log.ts b/src/types/log.ts
index 1139ea8..8e12345 100644
--- a/src/types/log.ts
+++ b/src/types/log.ts
@@ -1,5 +1,17 @@
-export type Action = 'CREATE' | 'UPDATE' | 'DELETE';
-export type Type = 'ROUTING' | 'CERTIFICATE' | 'FORWARDING';
+export type Action = 'create' | 'update' | 'delete';
+export type Type = 'routing' | 'certificate' | 'forwarding';
+
+export const ActionLabels: Record<Action, string> = {
+  create: '생성',
+  update: '수정',
+  delete: '삭제',
+};
+
+export const TypeLabels: Record<Type, string> = {
+  routing: '라우팅',
+  certificate: '인증서',
+  forwarding: '포워딩',
+};
 
 export interface Log {
   id: number;
-- 
GitLab