From 5405af7ff3e4cf059949fe3c6163d97df865d3b6 Mon Sep 17 00:00:00 2001 From: RSONE001 Date: Wed, 30 Jul 2025 10:09:34 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=B0=EA=B3=84=20api=20=EB=AF=B8=EB=93=A4?= =?UTF-8?q?=EC=9B=A8=EC=96=B4=20=EC=A0=81=EC=9A=A9=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/middleware.ts | 28 ++++++++++- apps/cs/src/entities/link/api/link-service.ts | 46 +++++++++---------- .../pages/linkParams/ui/link-params-page.tsx | 5 +- .../pages/linkTable/ui/link-table-page.tsx | 2 +- 4 files changed, 54 insertions(+), 27 deletions(-) diff --git a/apps/cs/middleware.ts b/apps/cs/middleware.ts index 79d2c8f65..38d32c79c 100644 --- a/apps/cs/middleware.ts +++ b/apps/cs/middleware.ts @@ -11,6 +11,8 @@ import { const serverApiUrl = process.env.NEXT_PUBLIC_SERVER_API_URL ?? "http://localhost:3000"; +const linkBackendApiHost = process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST ?? "http://localhost:8080"; + export function middleware(req: NextRequest) { const pathname = req.nextUrl.pathname; const searchParams = req.nextUrl.searchParams; @@ -52,6 +54,30 @@ export function middleware(req: NextRequest) { }); } + if (pathname.startsWith("/api/link")) { + const requestHeaders = new Headers(req.headers); + const token = req.cookies.get(CLAIM_NAME)?.value; + const userId = req.cookies.get(AUTH_USER_ID)?.value; + + // /api/link 경로를 제거하고 백엔드 API 경로로 변환 + const apiPath = pathname.replace("/api/link", ""); + const queryParams = searchParams.toString(); + const newUrl = `${linkBackendApiHost}${apiPath}${ + queryParams ? `?${queryParams}` : "" + }`; + + if (token) requestHeaders.set(CLAIM_NAME, token); + if (userId) requestHeaders.set(AUTH_USER_ID, userId); + + logMessages.push(` Link API Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl), { + headers: requestHeaders, + }); + } + if (pathname === "/") { return NextResponse.redirect(new URL("/dashboard", req.url)); } @@ -62,5 +88,5 @@ export function middleware(req: NextRequest) { } export const config = { - matcher: ["/server/:path*", "/attach-service/:path*", "/"], + matcher: ["/server/:path*", "/attach-service/:path*", "/api/link/:path*", "/"], }; diff --git a/apps/cs/src/entities/link/api/link-service.ts b/apps/cs/src/entities/link/api/link-service.ts index c607dd2c7..f0de32760 100644 --- a/apps/cs/src/entities/link/api/link-service.ts +++ b/apps/cs/src/entities/link/api/link-service.ts @@ -20,7 +20,7 @@ import { export class LinkApiService implements LinkService { public async getLinkList(params: LinkSearchParam): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkList`, + `/api/link/getLinkList`, { params } ); return response.data; @@ -28,41 +28,41 @@ export class LinkApiService implements LinkService { public async getLinkInfo(linkSn: string): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkInfo/${linkSn}`, + `/api/link/getLinkInfo/${linkSn}`, ); return response.data; } public async linkQuickStart(linkSn: string): Promise { const response = await axios.patch( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/linkQuickStart/${linkSn}`, + `/api/link/linkQuickStart/${linkSn}`, ); return response.data; } public async updateLinkInfo(data: LinkFormData): Promise { await axios.put( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/updateLinkInfo`, + '/api/link/updateLinkInfo', data, ); } public async insertLinkInfo(data: LinkFormData): Promise { await axios.post( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/insertLinkInfo`, + '/api/link/insertLinkInfo', data, ); } public async deleteLink(linkSn: string): Promise { await axios.delete( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/deleteLink/${linkSn}`, + `/api/link/deleteLink/${linkSn}`, ); } public async getLinkLogList(params: LinkSearchParam): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/selectLinkLoglist`, + '/api/link/selectLinkLoglist', { params } ); return response.data; @@ -70,7 +70,7 @@ export class LinkApiService implements LinkService { public async getLinkStatsList(params: LinkSearchParam): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/selectLinkStats`, + '/api/link/selectLinkStats', { params } ); return response.data; @@ -78,14 +78,14 @@ export class LinkApiService implements LinkService { public async getLinkVrblList(linkSn: string): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkVrblList/${linkSn}`, + `/api/link/getLinkVrblList/${linkSn}`, ); return response.data; } public async insertLinkVrbl(data: LinkVrblFormData): Promise { const response = await axios.post( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/insertLinkVrbl`, + '/api/link/insertLinkVrbl', data, ); @@ -94,7 +94,7 @@ export class LinkApiService implements LinkService { public async deleteLinkVrbl(data: string[]): Promise { await axios.delete( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/deleteLinkVrbl`, + '/api/link/deleteLinkVrbl', { data } @@ -103,35 +103,35 @@ export class LinkApiService implements LinkService { public async getLinkVrblInfo(linkVrblSn: string): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkVrblInfo/${linkVrblSn}`, + `/api/link/getLinkVrblInfo/${linkVrblSn}`, ); return response.data; } public async updateLinkVrblInfo(data: LinkVrblFormData): Promise { await axios.put( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/updateLinkVrblInfo`, + '/api/link/updateLinkVrblInfo', data, ); } public async getLinkTableInfo(linkSn: string): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkTableInfo/${linkSn}`, + `/api/link/getLinkTableInfo/${linkSn}`, ); return response.data; } public async getLinkTableColList(linkSn: string): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkTableColList/${linkSn}`, + `/api/link/getLinkTableColList/${linkSn}`, ); return response.data; } public async getLinkTableColInfo(params: { colSn: string; tblSn:string; }): Promise { const response = await axios.get( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkTableColInfo`, + '/api/link/getLinkTableColInfo', { params } ); return response.data; @@ -139,14 +139,14 @@ export class LinkApiService implements LinkService { public async insertLinkTableCol(data: LinkTableColData): Promise { await axios.post( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/insertLinkTableCol`, + '/api/link/insertLinkTableCol', data ); } public async deleteLinkTableCol(data: string[]): Promise { await axios.delete( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/deleteLinkTableCol`, + '/api/link/deleteLinkTableCol', { data }, @@ -155,35 +155,35 @@ export class LinkApiService implements LinkService { public async updateLinkTableCol(data: LinkTableColData): Promise { axios.put( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/updateLinkTableCol`, + '/api/link/updateLinkTableCol', data, ); } public async insertLinkTableInfo(data: LinkTableFormData): Promise { await axios.post( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/insertLinkTableInfo`, + '/api/link/insertLinkTableInfo', data ); } public async updateLinkTableInfo(data: LinkTableFormData): Promise { await axios.put( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/updateLinkTableInfo`, + '/api/link/updateLinkTableInfo', data ); } public async countLinkTblNm(tblNm: string): Promise<{count: number, tbl_sn: string}> { const response = await axios.get<{count: number, tbl_sn: string}>( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/countLinkTblNm/${tblNm}`, + `/api/link/countLinkTblNm/${tblNm}`, ); return response.data; } public async updateLinkResultCode(linkSn: string): Promise { await axios.patch( - `${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/updateLinkResultCode/${linkSn}`, + `/api/link/updateLinkResultCode/${linkSn}`, ); } } diff --git a/apps/cs/src/pages/linkParams/ui/link-params-page.tsx b/apps/cs/src/pages/linkParams/ui/link-params-page.tsx index b3806e712..d46a9d863 100644 --- a/apps/cs/src/pages/linkParams/ui/link-params-page.tsx +++ b/apps/cs/src/pages/linkParams/ui/link-params-page.tsx @@ -70,7 +70,7 @@ function LinkParamsPage() { // Link 목록 쿼리 const query = useQuery({ - queryKey: [`${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkList`, linkSearchParam], + queryKey: ['api/link/getLinkList', linkSearchParam], queryFn: () => LinkApi.getLinkList({ ...linkSearchParam, page: pagination.pageIndex, @@ -142,9 +142,10 @@ function LinkParamsPage() { const { mutateAsync: deleteLinkVrbl } = useMutation({ mutationFn: async (data: string[]) => await LinkApi.deleteLinkVrbl(data), onSuccess: async () => { - await queryClient.invalidateQueries({ + await queryClient.refetchQueries({ queryKey: ['linkVrblList', selectedLink.linkSn] }); + setSelectedVrblIds([]); alert('삭제되었습니다.'); } diff --git a/apps/cs/src/pages/linkTable/ui/link-table-page.tsx b/apps/cs/src/pages/linkTable/ui/link-table-page.tsx index 11f478b71..cbdf4627a 100644 --- a/apps/cs/src/pages/linkTable/ui/link-table-page.tsx +++ b/apps/cs/src/pages/linkTable/ui/link-table-page.tsx @@ -67,7 +67,7 @@ function LinkTablePage() { }; const query = useQuery({ - queryKey: [`${process.env.NEXT_PUBLIC_LINK_BACKEND_API_HOST}/getLinkList`, linkSearchParam], + queryKey: ['/api/link/getLinkList', linkSearchParam], queryFn: () => LinkApi.getLinkList({ ...linkSearchParam, page: pagination.pageIndex,