-
-
-
-
-
- {lectures.map((l, i) => {
- const a = accent[l.accent];
- return (
-
-
-
-
- {l.code}
-
-
- {String(i + 1).padStart(2, "0")}
-
-
-
- {l.ko}
- {l.en}
-
-
- {l.level}
-
-
-
- {l.desc}
-
-
-
- );
- })}
+ {/* Recent 3 Semesters */}
+
+
+
+
+ Recent Courses ({recentSemesters.length} Semesters)
+
+
+ 최근 개설 강의
+
+
+
+ {recentSemesters.map((sem, idx) => (
+
+
+
+
+ {sem.term} {sem.year}
+
+
+ Latest
+
+
+
+
+
+
+
+ Course Count: {sem.courses.length}
+
+
+ ))}
+
- >
+
+ {/* Older Semesters (Native
/ progressive disclosure) */}
+
+
+
+
+
+ 이전 전체 강의 이력 ({olderSemesters.length}개 학기) 열람하기
+
+
+ 2016 Fall ~ 2024 Spring 학기별 개설 교과목 이력
+
+
+
+ 전체 보기 ▾
+ 접기 ▴
+
+
+
+
+ {olderSemesters.map((sem, idx) => (
+
+
+
+ {sem.term} {sem.year}
+
+
+ {sem.courses.length} Courses
+
+
+
+
+
+ ))}
+
+
+
+
);
}
diff --git a/refer_landing_page/app/members/page.tsx b/refer_landing_page/app/members/page.tsx
index 5389a1e..f70045d 100644
--- a/refer_landing_page/app/members/page.tsx
+++ b/refer_landing_page/app/members/page.tsx
@@ -1,174 +1,213 @@
-import type { Metadata } from "next";
-import PageHeader from "@/components/PageHeader";
-import Reveal from "@/components/Reveal";
-import SectionLabel from "@/components/SectionLabel";
-import Counter from "@/components/Counter";
-
-export const metadata: Metadata = {
- title: "구성원 (Members)",
- description: "AI 에이전트 네트워크 연구실 (ANL) 지도교수 및 대학원·학부 연구원 소개 (placeholder).",
-};
-
-// CUSTOMIZATION HOOK: replace placeholder member data below.
-const advisor = {
- ko: "고석주 교수",
- en: "Prof. Seok-Joo Koh",
- role: "지도교수 · Principal Investigator",
- desc: "QUIC/gRPC/A2A 에이전트 통신, 멀티에이전트 오케스트레이션, MCP & SKILL 확장, 네트워크 프로토콜. (sjkoh@knu.ac.kr)",
- fields: ["Agent Communication (A2A)", "Multi-Agent Orchestration", "QUIC & gRPC Transport"],
-};
-
-const groups = [
- {
- ko: "박사과정 연구원",
- en: "Ph.D. Students",
- accent: "vermillion" as const,
- members: [
- { name: "연구원 A (placeholder)", topic: "QUIC 기반 멀티에이전트 오케스트레이션" },
- { name: "연구원 B (placeholder)", topic: "메타버스 공통 정보 모델 (MCM)" },
- ],
- },
- {
- ko: "석사과정 연구원",
- en: "M.S. Students",
- accent: "cobalt" as const,
- members: [
- { name: "연구원 C (placeholder)", topic: "oneM2M 적합성 검증" },
- { name: "연구원 D (placeholder)", topic: "QUIC 스트림 다중화 성능 분석" },
- { name: "연구원 E (placeholder)", topic: "W3C WoT Thing Description 매핑" },
- ],
- },
- {
- ko: "학부 연구원",
- en: "Undergraduate Researchers",
- accent: "ink" as const,
- members: [
- { name: "연구원 F (placeholder)", topic: "테스트베드 개발" },
- { name: "연구원 G (placeholder)", topic: "데이터 시각화" },
- ],
- },
-];
-
-// CUSTOMIZATION HOOK: headcount figures (animated counters).
-const figures = [
- { value: 1, label: "지도교수 · Principal Investigator" },
- { value: 5, label: "대학원 연구원 · Graduate Members" },
- { value: 2, label: "학부 연구원 · Undergraduates" },
-];
-
-const accentText: Record
= {
- vermillion: "text-vermillion",
- cobalt: "text-cobalt",
- ink: "text-ink",
-};
+import React from "react";
+import { activeMembers, alumni } from "../../content/members";
export default function MembersPage() {
- return (
- <>
-
+ const professor = activeMembers.find((m) => m.degree === "Professor");
+ const phdStudents = activeMembers.filter(
+ (m) => m.degree === "PhD" || m.degree === "PhDCandidate" || m.degree === "PhDStudent"
+ );
+ const msStudents = activeMembers.filter(
+ (m) => m.degree === "MSCandidate" || m.degree === "MSStudent"
+ );
- {/* ============ HEADCOUNT FIGURES ============ */}
-
-
- {figures.map((f, i) => (
-
-
-
- ))}
+ return (
+
+ {/* Header */}
+
+
+
+
+ People & Researchers
+
+
+ 연구실 구성원
+
+
+ 지도교수와 재학 연구원 16명, 그리고 IT 산업체 및 학계에서 활약하고 있는 60명의 졸업생 인벤토리입니다.
+
- {/* ============ PRINCIPAL INVESTIGATOR ============ */}
-
-
-
-
-
+ {/* Professor Section */}
+
+
+ Faculty
+
-
-
-
- {advisor.role}
- {advisor.ko}
-
- {advisor.en}
-
-
- {advisor.desc}
-
-
-
-
-
-
- {advisor.fields.map((field, i) => (
-
-
- {String(i + 1).padStart(2, "0")}
-
-
- {field}
-
-
- ))}
-
-
+
+
+
+
+ {professor?.ko || "고석주"} 교수
+
+
+ {professor?.en || "Seok-Joo Koh"}, Professor
+
+
+
+ 경북대학교 컴퓨터학부 교수 · AI 에이전트 네트워크 연구실 (ANL) 지도교수.
+ QUIC/gRPC 통신, A2A/ACP 프로토콜, MCP & SKILL 아키텍처 및 에이전트 오케스트레이션 연구를 총괄하고 있습니다.
+
+
+
+
+
+ Affiliation & Office
+
+
Kyungpook National University
+
IT Building #5 Room 527
+
Daegu, Republic of Korea
- {/* ============ RESEARCH GROUPS ============ */}
-
-
-
-
-
+ {/* Active Researchers Section */}
+
+
+
+
+ Active Researchers ({activeMembers.length} Members)
+
+
+ 재학 연구원
+
+
+
- {groups.map((g, gi) => (
-
-
-
-
{g.ko}
-
- {g.en}
+ {/* Ph.D. Candidates / Students */}
+
+
+ Ph.D. Course ({phdStudents.length})
+
+
+ {phdStudents.map((mem, idx) => (
+
+
+
+ {mem.ko}
+
+
+ {mem.degree}
-
-
-
- {g.members.map((m, mi) => (
-
-
-
- {String(gi + 1).padStart(2, "0")}.{String(mi + 1).padStart(2, "0")}
-
-
-
{m.name}
-
- {m.topic}
-
-
-
-
- ))}
+
{mem.en}
+ {mem.affiliation && (
+
+ with {mem.affiliation}
+
+ )}
-
- ))}
+ ))}
+
+
+
+ {/* M.S. Candidates / Students */}
+
+
+ M.S. Course ({msStudents.length})
+
+
+ {msStudents.map((mem, idx) => (
+
+
+
+ {mem.ko}
+
+
+ {mem.degree}
+
+
+
{mem.en}
+ {mem.affiliation && (
+
+ with {mem.affiliation}
+
+ )}
+
+ ))}
+
- >
+
+ {/* Alumni Section (Native / progressive disclosure) */}
+
+
+
+
+ Alumni Inventory ({alumni.length} Graduates)
+
+
+ 졸업생 목록
+
+
+
+
+
+
+
+
+ 전체 졸업생 {alumni.length}명 열람하기
+
+
+ 2007년부터 2026년까지 수여된 박사(Ph.D.) 및 석사(M.S.) 졸업생 이력
+
+
+
+ 전체 보기 ▾
+ 접기 ▴
+
+
+
+
+ {alumni.map((alum, idx) => (
+
+
+
+ {alum.ko} ({alum.en})
+
+
+ {alum.degree}
+
+
+
+ {alum.graduatedAt}
+ {alum.major && {alum.major} }
+
+ {alum.currentPosition && (
+
+ {alum.currentPosition}
+
+ )}
+
+ ))}
+
+
+
+
);
}
diff --git a/refer_landing_page/app/page.tsx b/refer_landing_page/app/page.tsx
new file mode 100644
index 0000000..f7d4991
--- /dev/null
+++ b/refer_landing_page/app/page.tsx
@@ -0,0 +1,215 @@
+import React from "react";
+import HeroComposition from "./_components/HeroComposition";
+import { DirectionsBlock } from "./_components/DirectionsBlock";
+import { publications } from "../content/publications";
+
+const PILLARS = [
+ {
+ no: "01",
+ en: "AI Agent Engineering",
+ ko: "AI 에이전트 3대 핵심 엔지니어링",
+ theme: "vermillion" as const,
+ topics: [
+ "프롬프트 엔지니어링 (System Prompt Optimization)",
+ "맥락 엔지니어링 (Dynamic Context & Memory Packaging)",
+ "하네스 엔지니어링 (Agent Control Loop & Sandbox Isolation)",
+ ],
+ desc: "AI 에이전트의 구동 성능과 안전성을 좌우하는 프롬프트·맥락·하네스 3대 핵심 엔지니어링 기술을 연구합니다.",
+ },
+ {
+ no: "02",
+ en: "MCP & SKILL Architecture",
+ ko: "AI Agent 기능 확장 프로토콜",
+ theme: "cobalt" as const,
+ topics: [
+ "Model Context Protocol (MCP) 서버/클라이언트 아키텍처",
+ "SKILL 도구 캡슐화 및 재사용 패키징",
+ "CLI 에이전트 인터페이스 제어 및 웹 가동 제어",
+ ],
+ desc: "에이전트가 외부 도구 및 시스템과 표준화된 방식으로 연동할 수 있도록 MCP와 SKILL 패키징 기술을 개발합니다.",
+ },
+ {
+ no: "03",
+ en: "Multi-Agent Orchestration",
+ ko: "멀티 에이전트 협업 및 오케스트레이션",
+ theme: "vermillion" as const,
+ topics: [
+ "HERDR 백그라운드 프로세스 컨테이너 격리 제어",
+ "crewAI 기반 역할 분담 및 태스크 위임 체계",
+ "LangGraph 순환 상태 그래프 기반 워크플로우 제어",
+ ],
+ desc: "다중 에이전트 환경에서 독립적인 역할 분담과 선순환 오케스트레이션을 보장하는 자율 협업 플랫폼을 연구합니다.",
+ },
+ {
+ no: "04",
+ en: "A2A & ACP Open Protocols",
+ ko: "에이전트 상호운용성 개방형 표준",
+ theme: "cobalt" as const,
+ topics: [
+ "Agent-to-Agent (A2A) 프로토콜 규격 정의 및 검증",
+ "Agent Communication Protocol (ACP) 메시지 교환 규격",
+ "Agent Card (/.well-known/agent-card.json) 메타데이터 검증",
+ ],
+ desc: "서로 다른 프레임워크 기반의 에이전트 간의 상호운용성을 보장하는 국제 표준 개방형 통신 프로토콜을 구현합니다.",
+ },
+ {
+ no: "05",
+ en: "High-Performance Networking Backbone",
+ ko: "AIoT & 고성능 통신 백본",
+ theme: "vermillion" as const,
+ topics: [
+ "gRPC / QUIC 양방향 스트리밍 에이전트 백본 통신",
+ "Protocol Buffers (Protobuf) 직렬화 통신 최적화",
+ "MQTT / CoAP 엣지 메시 통신망 통합",
+ ],
+ desc: "초저지연 양방향 스트리밍 통신 인프라를 바탕으로 고성능 에이전트 백본 네트워크를 설계하고 실증합니다.",
+ },
+];
+
+export default function HomePage() {
+ const pubCount = publications.length;
+
+ return (
+
+ {/* Hero Section */}
+
+
+
+
+ Kyungpook National University · AI Agent Networking Lab (ANL)
+
+
+
+
+
+
+ 에이전트 네트워크의
+ 미래를 짓다
+
+
+ AI 에이전트 네트워크 연구실(ANL)은 에이전트 엔지니어링, MCP/SKILL 아키텍처,
+ 멀티 에이전트 오케스트레이션, A2A/ACP 개방형 표준, gRPC/QUIC 고성능 통신 백본의
+ 5대 연구 기둥을 중심으로 지능형 자율 에이전트 네트워크를 연구합니다.
+
+
+ {/* Metrics Row (Derived from data array, AC-13) */}
+
+
+
+ {PILLARS.length}
+
+
+ Core Pillars
+
+
+
+
+ {pubCount}
+
+
+ Publications
+
+
+
+
+ 2026
+
+
+ Issue Static
+
+
+
+
+
+
+
+
+
+
+
+ {/* 5 Pillars Magazine Spread Grid */}
+
+
+
+
+ Research Pillars
+
+
+ 5대 핵심 연구 기둥
+
+
+
+ Magazine Layout 01–05
+
+
+
+
+ {PILLARS.map((pillar, idx) => {
+ const isVermillion = pillar.theme === "vermillion";
+ const colSpan = idx < 3 ? "lg:col-span-2" : "lg:col-span-3";
+
+ return (
+
+
+
+
+ [{pillar.no}]
+
+
+ {pillar.en}
+
+
+
+
+ {pillar.ko}
+
+
+
+ {pillar.desc}
+
+
+
+ {pillar.topics.map((topic, tIdx) => (
+
+
+ {topic}
+
+ ))}
+
+
+
+
+ ANL Core Spec
+
+ Pillar #{pillar.no}
+
+
+
+ );
+ })}
+
+
+
+ {/* Directions Block */}
+
+
+ );
+}
diff --git a/refer_landing_page/app/publications/[category]/page.tsx b/refer_landing_page/app/publications/[category]/page.tsx
new file mode 100644
index 0000000..3f6b346
--- /dev/null
+++ b/refer_landing_page/app/publications/[category]/page.tsx
@@ -0,0 +1,146 @@
+import React from "react";
+import { notFound } from "next/navigation";
+import { CategoryNav } from "../_components/CategoryNav";
+import { publications, patents } from "../../../content/publications";
+import { PUB_CATEGORIES } from "../../../content/categories";
+import { PubCategory } from "../../../content/types";
+
+interface PageProps {
+ params: {
+ category: string;
+ };
+}
+
+// SSG static pre-rendering (● SSG) for Next.js 14
+export function generateStaticParams() {
+ return PUB_CATEGORIES.map((cat) => ({
+ category: cat.slug,
+ }));
+}
+
+export default function PublicationCategoryPage({ params }: PageProps) {
+ const { category } = params;
+ const currentCat = PUB_CATEGORIES.find((c) => c.slug === category);
+
+ if (!currentCat) {
+ notFound();
+ }
+
+ const slug = category as PubCategory;
+
+ let records: any[] = [];
+ if (slug === "patent") {
+ records = patents.map((p) => ({
+ title: p.title,
+ inventors: p.inventors,
+ appNo: p.applicationNo,
+ appDate: p.applicationAt,
+ regNo: p.registrationNo,
+ regDate: p.registrationAt,
+ country: p.country,
+ publishedAt: p.publishedAt,
+ isPatent: true,
+ }));
+ } else {
+ records = publications
+ .filter((p) => p.category === slug)
+ .map((p) => ({
+ title: p.title,
+ venue: p.venue,
+ volume: p.volume,
+ publishedAt: p.publishedAt,
+ kci: p.kci,
+ isPatent: false,
+ }));
+ }
+
+ return (
+
+ {/* Header */}
+
+
+
+
+ Publications Category
+
+
+
+ {currentCat.label}
+
+
+ {currentCat.desc} — 총 {records.length}건의 실데이터 카탈로그입니다.
+
+
+
+ {/* Category Nav */}
+
+
+ {/* Record List Section */}
+
+
+
+ Showing {records.length} Pre-rendered Records
+
+
+ SSG ● Static HTML
+
+
+
+ {records.length === 0 ? (
+
+
+ 현재 등록된 실적이 0건입니다.
+
+
+ (D-01 카테고리 정류 확정 후 후속 배치가 수행됩니다)
+
+
+ ) : (
+
+ {records.map((rec, idx) => (
+
+
+
+ {rec.title}
+
+
+ {rec.publishedAt}
+
+
+
+ {rec.isPatent ? (
+
+
발명자: {rec.inventors}
+
+ 출원번호: {rec.appNo} ({rec.country}, {rec.appDate})
+
+ {rec.regNo && (
+
+ 등록번호: {rec.regNo} ({rec.regDate})
+
+ )}
+
+ ) : (
+
+
{rec.venue}
+
+ {rec.volume}
+ {rec.kci && (
+
+ KCI 등재
+
+ )}
+
+
+ )}
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/refer_landing_page/app/publications/_components/CategoryNav.tsx b/refer_landing_page/app/publications/_components/CategoryNav.tsx
new file mode 100644
index 0000000..05477dc
--- /dev/null
+++ b/refer_landing_page/app/publications/_components/CategoryNav.tsx
@@ -0,0 +1,45 @@
+import React from "react";
+import Link from "next/link";
+import { PUB_CATEGORIES } from "../../../content/categories";
+import { PubCategory } from "../../../content/types";
+
+interface CategoryNavProps {
+ currentCategory?: PubCategory;
+ totalCount?: number;
+}
+
+export function CategoryNav({ currentCategory, totalCount }: CategoryNavProps) {
+ return (
+
+
+
+ All Overview {!currentCategory && totalCount ? `(${totalCount})` : ""}
+
+
+ {PUB_CATEGORIES.map((cat) => {
+ const isActive = currentCategory === cat.slug;
+ return (
+
+ {cat.label}
+
+ );
+ })}
+
+
+ );
+}
diff --git a/refer_landing_page/app/publications/page.tsx b/refer_landing_page/app/publications/page.tsx
index 4ae2363..37d0d63 100644
--- a/refer_landing_page/app/publications/page.tsx
+++ b/refer_landing_page/app/publications/page.tsx
@@ -1,173 +1,138 @@
-import type { Metadata } from "next";
-import PageHeader from "@/components/PageHeader";
-import Reveal from "@/components/Reveal";
-import SectionLabel from "@/components/SectionLabel";
-import Counter from "@/components/Counter";
-import Marquee from "@/components/Marquee";
+import React from "react";
+import Link from "next/link";
+import { CategoryNav } from "./_components/CategoryNav";
+import { publications, patents } from "../../content/publications";
+import { PUB_CATEGORIES } from "../../content/categories";
-export const metadata: Metadata = {
- title: "논문 (Publications)",
- description: "AI 에이전트 네트워크 연구실 (ANL)의 대표 논문 목록 (placeholder).",
-};
+export default function PublicationsIndexPage() {
+ const allRecords = [
+ ...publications.map((p) => ({ ...p, type: "paper" as const })),
+ ...patents.map((p) => ({
+ category: "patent" as const,
+ title: p.title,
+ venue: `발명자: ${p.inventors} (출원번호: ${p.applicationNo})`,
+ volume: p.registrationNo ? `등록번호: ${p.registrationNo}` : `출원국가: ${p.country}`,
+ publishedAt: p.publishedAt,
+ type: "patent" as const,
+ })),
+ ];
-// CUSTOMIZATION HOOK: replace placeholder publications below.
-const publications = [
- {
- year: "2025",
- type: "Journal",
- title:
- "메타버스 상호운용을 위한 공통 정보 모델 설계 및 oneM2M 매핑 (Design of a Common Information Model for Metaverse Interoperability over oneM2M)",
- authors: "Hong G., Researcher A., et al.",
- venue: "한국통신학회논문지 (J-KICS), Vol. 50, No. 3",
- },
- {
- year: "2025",
- type: "Conference",
- title:
- "QUIC-based Orchestration Architecture for Low-Latency Multi-Agent Communication",
- authors: "Researcher B., Hong G.",
- venue: "IEEE International Conference on Communications (ICC)",
- },
- {
- year: "2024",
- type: "Journal",
- title:
- "W3C WoT Thing Description를 활용한 이종 메타버스 자산의 의미 보존 변환 (Semantic-Preserving Mapping of Cross-Platform Metaverse Assets Using W3C WoT)",
- authors: "Researcher C., Hong G., et al.",
- venue: "정보과학회논문지 (KIISE Transactions), Vol. 51, No. 11",
- },
- {
- year: "2024",
- type: "Conference",
- title:
- "Stream Multiplexing Strategies for Agent Message Routing over QUIC",
- authors: "Researcher D., Researcher B., Hong G.",
- venue: "ACM/IEEE Symposium on Edge Computing (SEC)",
- },
- {
- year: "2023",
- type: "Conference",
- title:
- "oneM2M 기반 IoT 디바이스 상호운용성 적합성 검증 프레임워크 (A Conformance Testing Framework for oneM2M-based IoT Interoperability)",
- authors: "Researcher E., Hong G.",
- venue: "한국정보과학회 학술발표회 (KSC)",
- },
-];
+ // Sort by publishedAt descending
+ const sortedRecords = [...allRecords].sort(
+ (a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime()
+ );
-// CUSTOMIZATION HOOK: venue ticker.
-const venueTicker = [
- "J-KICS",
- "IEEE ICC",
- "KIISE TRANSACTIONS",
- "ACM/IEEE SEC",
- "KSC",
- "oneM2M",
- "W3C WoT",
- "IETF QUIC",
-];
+ const recentRecords = sortedRecords.slice(0, 10);
-// Accent per publication type, drawn from the editorial palette.
-const typeAccent: Record = {
- Journal: { text: "text-vermillion", rule: "bg-vermillion" },
- Conference: { text: "text-cobalt", rule: "bg-cobalt" },
-};
+ const getCategoryCount = (slug: string) => {
+ if (slug === "patent") return patents.length;
+ return publications.filter((p) => p.category === slug).length;
+ };
-// Derived figures.
-const journalCount = publications.filter((p) => p.type === "Journal").length;
-const confCount = publications.filter((p) => p.type === "Conference").length;
-const figures = [
- { value: publications.length, label: "전체 논문 · Total Publications" },
- { value: journalCount, label: "저널 · Journal" },
- { value: confCount, label: "학회 · Conference" },
-];
-
-export default function PublicationsPage() {
return (
- <>
-
+
+ {/* Header */}
+
+
+
+
+ Research Output & Patents
+
+
+
+ 연구 실적 개요
+
+
+ 국제·국내 우수 학술지 및 학술대회 논문 148건과 특허 75건 등 총 {allRecords.length}건의 실측 연구 성과 카탈로그입니다.
+
+
- {/* Venue marquee band */}
-
-
-
+ {/* Category Nav */}
+
- {/* ============ FIGURES ============ */}
-
-
- {figures.map((f, i) => (
-
-
-
-
{f.label}
+ {/* Category Cards Overview */}
+
+
+ 카테고리별 실적 분류
+
+
+ {PUB_CATEGORIES.map((cat) => {
+ const count = getCategoryCount(cat.slug);
+ return (
+
+
+
+
+ Category
+
+
+ {count}건
+
+
+
+ {cat.label}
+
+
+ {cat.desc}
+
+
+
+
+ SSG Pre-rendered
+
+
+ 목록 보기 ({count}) ↗
+
+
-
+ );
+ })}
+
+
+
+ {/* Recent 10 Highlight Records */}
+
+
+
+ 최신 성과 하이라이트 (Top 10)
+
+
+ Total {allRecords.length} Records
+
+
+
+
+ {recentRecords.map((rec, idx) => (
+
+
+
+ {rec.title}
+
+
+ {rec.publishedAt}
+
+
+
+ {rec.venue}
+
+ {rec.volume && (
+
+ {rec.volume}
+
+ )}
+
))}
-
- {/* ============ PUBLICATION LIST ============ */}
-
-
-
-
-
-
-
- {publications.map((p, i) => {
- const accent = typeAccent[p.type] ?? {
- text: "text-ink",
- rule: "bg-ink",
- };
- // Reveal `as="li"` keeps the direct-child contract (HTML spec:
- // may only contain /