+ {/* 헤더 */}
+
+
+
Bypass API 카탈로그
+
+ 등록된 Bypass API 목록입니다. Swagger UI에서 직접 테스트할 수 있습니다.
+
+
+
+ Swagger UI
+
+
+
+ {/* 검색 + 필터 + 뷰 전환 */}
+
+
+ {/* 검색 */}
+
+
+
+
+
setSearchTerm(e.target.value)}
+ className="w-full pl-10 pr-4 py-2 border border-wing-border rounded-lg text-sm
+ focus:ring-2 focus:ring-wing-accent focus:border-wing-accent outline-none bg-wing-surface text-wing-text"
+ />
+ {searchTerm && (
+
+ )}
+
+
+ {/* 도메인 드롭다운 필터 */}
+
+
+ {/* 뷰 전환 토글 */}
+
+
+
+
+
+
+ {(searchTerm || selectedDomain) && (
+
+ {filtered.length}개 API 검색됨
+
+ )}
+
+
+ {/* 빈 상태 */}
+ {configs.length === 0 ? (
+
+
등록된 API가 없습니다.
+
관리자에게 문의해주세요.
+
+ ) : filtered.length === 0 ? (
+
+
검색 결과가 없습니다.
+
다른 검색어를 사용해 보세요.
+
+ ) : viewMode === 'card' ? (
+ /* 카드 뷰 */
+
+ {filtered.map((config) => (
+
+
+
+
{config.displayName}
+
{config.domainName}
+
+
+ {config.httpMethod}
+
+
+
+
{config.externalPath}
+ {config.description && (
+
{config.description}
+ )}
+
+ {config.params.length > 0 && (
+
+
Parameters
+
+ {config.params.map((p) => (
+
+ {p.paramName}
+ {p.required && *}
+
+ ))}
+
+
+ )}
+
+
+ ))}
+
+ ) : (
+ /* 테이블 뷰 */
+
+
+
+
+
+ | 도메인명 |
+ 표시명 |
+ HTTP |
+ 외부 경로 |
+ 파라미터 |
+ Swagger |
+
+
+
+ {filtered.map((config) => (
+
+ | {config.domainName} |
+ {config.displayName} |
+
+
+ {config.httpMethod}
+
+ |
+
+ {config.externalPath}
+ |
+
+
+ {config.params.map((p) => (
+
+ {p.paramName}
+ {p.required && *}
+
+ ))}
+
+ |
+
+
+ 테스트 →
+
+ |
+
+ ))}
+
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/src/pages/BypassConfig.tsx b/frontend/src/pages/BypassConfig.tsx
index a1ea498..77446cc 100644
--- a/frontend/src/pages/BypassConfig.tsx
+++ b/frontend/src/pages/BypassConfig.tsx
@@ -41,6 +41,7 @@ export default function BypassConfig() {
const [confirmAction, setConfirmAction] = useState