# π κ²½λΆλνκ΅ AI μμ΄μ νΈ λ€νΈμν¬ μ°κ΅¬μ€ (ANL) 곡μ μΉμ¬μ΄νΈ
> **AI Agent Networking Laboratory (ANL), School of Computer Science and Engineering, Kyungpook National University**
>
> λ³Έ 리ν¬μ§ν 리λ κ²½λΆλνκ΅ μ»΄ν¨ν°νλΆ AI μμ΄μ νΈ λ€νΈμν¬ μ°κ΅¬μ€μ 곡μ μΉμ¬μ΄νΈ λ° λ°μ΄ν° κ΄λ¦¬ λμ보λ μμ€ν
μ
λλ€.
> μ€μκ° λ°νμ λ°μ΄ν° λκΈ°νλ₯Ό μ§μνλ **Next.js 14+ νλ‘ νΈμλ**, **Go (Gin) κ³ μ±λ₯ RESTful λ°±μλ**, **SQLite νΈλμμ
λ°μ΄ν°λ² μ΄μ€**, κ·Έλ¦¬κ³ **ν΅ν© Docker 컨ν
μ΄λ μ€μΌμ€νΈλ μ΄μ
**μΌλ‘ ꡬμΆλμμ΅λλ€.
---
## π 1. μ°κ΅¬μ€ κ°μ λ° ν΅μ¬ μ°κ΅¬ λΆμΌ (Lab Overview & Research Focus)
- **μ°κ΅¬μ€λͺ
**: AI μμ΄μ νΈ λ€νΈμν¬ μ°κ΅¬μ€ (ANL / AI Agent Networking Laboratory)
- **μμ**: κ²½λΆλνκ΅ ITλν μ»΄ν¨ν°νλΆ
- **μ§λκ΅μ**: κ³ μμ£Ό κ΅μ (Prof. Seok-Joo Koh / `sjkoh@knu.ac.kr`)
- **μ°κ΅¬ ν¨λ¬λ€μ**:
- **Present & Future**: **MCP & SKILL**, **λ©ν°μμ΄μ νΈ μ€μΌμ€νΈλ μ΄μ
(HERDR, crewAI, LangGraph)**, **μ΄μ’
μμ΄μ νΈ μνΈμ΄μ©μ± νμ€ (ACP, A2A)**, λ° **AIoT gRPC/QUIC κ³ μ±λ₯ ν΅μ λ°±λ³Έ**
---
## π‘ 2. ν΅μ¬ μ°κ΅¬ λΆμΌ (Core Research Areas)
### π 1) AI Agent κΈ°λ₯ νμ₯ νλ‘ν μ½ (MCP & SKILL)
- **MCP (Model Context Protocol)**: Anthropic μ μ μ€ν κ·κ²©μΌλ‘ λꡬ, λ°μ΄ν° 리μμ€, ν둬ννΈ νμ€ μΈν°νμ΄μ€ μ°λ
- **SKILL (μμ¨ νμ₯ λꡬ ν¨ν€μ§)**: μ€ν μ½λ + λꡬ λͺ
μΈ + Few-shotμ΄ κ²°ν©λ λͺ¨λν μμ΄μ νΈ κΈ°λ₯ νμ₯
- **CLI μμ¨ μ½λ© μμ΄μ νΈ**: Claude Code, Antigravity CLI λ± ν°λ―Έλ κΈ°λ° μμ¨ μννΈμ¨μ΄ μμ§λμ΄λ§
### π€ 2) λ©ν° μμ΄μ νΈ νμ
λ° μ€μΌμ€νΈλ μ΄μ
(Multi-Agent Orchestration)
- **μ΄μ’
μμ΄μ νΈ κ΅μ°¨ κ²μ¦**: μλ‘ λ€λ₯Έ LLM λͺ¨λΈ(Planner, Creator, Reviewer) κ° λΉν/ν©μ 루νλ‘ λ¬΄κ²°μ± ν보
- **μ€μΌμ€νΈλ μ΄μ
μΈνλΌ μ½μ΄**:
- **HERDR**: κ°μ λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€ 격리 λ° μμ΄μ νΈ μΈμ
TUI κ΄μ
- **LangGraph & crewAI**: μν 보쑴ν μν κ·Έλν, μν κΈ°λ° λΆμ
λ° μμΈ λ‘€λ°± μ²λ¦¬
### π 3) μμ΄μ νΈ μνΈμ΄μ©μ± κ°λ°©ν νμ€ (Agent Interoperability: ACP & A2A)
- **ACP (Agent Communication Protocol)**: IBM Research μ μ μλΉμ€ λ°κ²¬ λ° νμ€ν¬ μμ μ€ν νμ€
- **A2A (Agent-to-Agent Protocol)**: Google/Linux Foundation μ£Όλ μ΄μ’
μμ΄μ νΈ κ° νμ€ λ©μμ§ κ΅ν ν΅μ νμ€
- **Agent Card (`/.well-known/agent-card.json`)**: μμ΄μ νΈ μλ(Capabilities) λ° λ³΄μ μ¬μ νμ€ νλ‘ν
### β‘ 4) μ§λ₯ν μ¬λ¬ΌμΈν°λ· (AIoT) & κ³ μ±λ₯ λ°±λ³Έ (AIoT & gRPC/QUIC)
- **AIoT λΆμ° μμ¨ μ μ΄**: μΌμ κ³μΈ΅κ³Ό μ£μ§ μ°μ° κ³μΈ΅ κ° λ©ν° μμ΄μ νΈ λΆμ° λ°°μΉ
- **gRPC & QUIC μλ°©ν₯ μ€νΈλ¦¬λ°**: HTTP/2 & HTTP/3 κΈ°λ° κ³ μ λ°μ΄λ리 λ©ν°λͺ¨λ¬ μ μ‘
---
## ποΈ 3. μμ€ν
μν€ν
μ² (System Architecture)
```mermaid
graph TD
User["π User / Browser"]
Admin["π Admin User"]
subgraph Docker_Network ["Docker Bridge Network (anl-net)"]
subgraph Frontend_App ["Next.js 14 Frontend (anl-frontend:3000)"]
PublicPages["Public Pages (force-dynamic)
/, /members, /publications, /lectures, /standardization"]
AdminConsole["Admin Dashboard (/console)
Research Projects, Areas, Members, Pubs, Lectures, Standards"]
API_Client["Typed API Client (lib/api.ts, lib/adminApi.ts)"]
end
subgraph Backend_App ["Go Gin Backend API (anl-backend:8080)"]
Router["REST API Router & CORS"]
AuthMW["RequireAdminToken Middleware"]
Handlers["CRUD Handlers (Home, Members, Pubs, Lectures, Standards)"]
Repo["Repository Layer & Transaction Order Normalizer"]
end
subgraph Storage ["Persistent Volume Storage (anl-sqlite-storage)"]
SQLiteDB[("SQLite Database
/app/data/anl.db")]
end
end
User -->|HTTP :3000| PublicPages
Admin -->|Bearer Auth :3000| AdminConsole
PublicPages --> API_Client
AdminConsole --> API_Client
API_Client -->|REST API :8080| Router
Router --> AuthMW
AuthMW --> Handlers
Handlers --> Repo
Repo --> SQLiteDB
```
---
## π 4. λλ ν°λ¦¬ ꡬ쑰 (Directory Structure)
```
landing_page/
βββ README.md # [λ³Έ λ¬Έμ] μ’
ν© νλ‘μ νΈ κ°μ΄λ λ° λ°°ν¬/μ΄μ λ¬Έμ
βββ docker-compose.yml # ν΅ν© Docker Compose λ©ν° μλΉμ€ μ€μΌμ€νΈλ μ΄μ
βββ .env.example # νκ²½λ³μ μ€μ ν
νλ¦Ώ
β
βββ backend/ # β‘ [Go λ°±μλ REST API]
β βββ cmd/ # μ§μ
μ (api: API μλ², seed: μλ, export-content)
β βββ internal/ # λΉμ¦λμ€ λ‘μ§ (handlers, repository, router, config, httpx)
β βββ db/backup/ # πΎ λ°μ΄ν°λ² μ΄μ€ λ°±μ
(anl.db λ°μ΄λ리, anl_dump.sql μ 체 λ€ν)
β βββ seed/data/ # μ΄κΈ° μμ JSON μλ λ°μ΄ν°
β βββ Dockerfile # λ°±μλ κ²½λ Multi-stage Dockerfile (Alpine 3.20)
β βββ Makefile # λΉλ, ν
μ€νΈ, ν¬λ§·, λ°±μ
(make backup-db) νκ²
β βββ go.mod # Go λͺ¨λ μμ‘΄μ± μ μ
β
βββ refer_landing_page/ # π [Next.js 14 νλ‘ νΈμλ & κ΄λ¦¬μ μ½μ]
β βββ app/ # App Router νμ΄μ§ (κ³΅κ° νμ΄μ§ λ° /console κ΄λ¦¬μ λμ보λ)
β βββ components/ # UI μ»΄ν¬λνΈ (Header, Footer, Reveal, Counter, Marquee λ±)
β βββ lib/ # API ν΅μ ν΄λΌμ΄μΈνΈ (api.ts: μ‘°ν, adminApi.ts: CRUD)
β βββ docs/ # λμμΈ μμ€ν
(DESIGN.md: Issue 01 μλν λ¦¬μΌ μ€νμΌ)
β βββ scripts/ # E2E ν
μ€νΈ μ€μνΈ λ° λ°μ΄ν° κ²μ¦ λ¬λ
β βββ Dockerfile # νλ‘ νΈμλ Standalone Multi-stage Dockerfile (Node 20 Alpine)
β βββ next.config.js # output: "standalone" νλ‘λμ
λ²λ€λ§ μ€μ
β βββ package.json # Next.js, React, Tailwind CSS μμ‘΄μ±
β
βββ .agents/ # π€ λ©ν° μμ΄μ νΈ μ€μΌμ€νΈλ μ΄μ
μ€ν¬ & λ£°μ
(MAM)
βββ .mam/ # β‘ μμ΄μ νΈ μΈμ
DB λ° HERDR 격리 λ μ§μ€νΈλ¦¬
βββ ISL-2026/ # π λ κ±°μ μ€μΈ‘ μλ³Έ HTML/CSS μμΉ΄μ΄λΈ
```
---
## π 5. Docker 컨ν
μ΄λ λ°°ν¬ λ° μ΄μ κ°μ΄λ (Production Deployment)
λ€λ₯Έ μν¬μ€ν
μ΄μ
μ΄λ μλ²μμ Dockerλ₯Ό ν΅ν΄ μν΄λ¦μΌλ‘ μ 체 μμ€ν
μ λΉλνκ³ λ°°ν¬νλ λ°©λ²μ
λλ€.
### 1) μ μ₯μ ν΄λ‘ λ° νκ²½ μ€μ
```bash
# 1. μ μ₯μ ν΄λ‘
git clone <리ν¬μ§ν 리_URL> landing_page
cd landing_page
# 2. νκ²½λ³μ νμΌ μμ±
cp .env.example .env
# (μ ν) .env νμΌμμ κ΄λ¦¬μ ν ν°(ADMIN_TOKEN) λ° ν¬νΈ λ³κ²½ κ°λ₯
```
### 2) 컨ν
μ΄λ μ΄λ―Έμ§ λΉλ
```bash
# νλ‘ νΈμλ λ° λ°±μλ μ΄λ―Έμ§ λμ λΉλ
docker compose build
# (μ ν) μΊμ μμ΄ μ 체 μ¬λΉλ μ
docker compose build --no-cache
```
### 3) μλΉμ€ λ°±κ·ΈλΌμ΄λ λ°°ν¬ λ° μ€ν
```bash
# 1. 컨ν
μ΄λ λ°±κ·ΈλΌμ΄λ μ€ν
docker compose up -d
# 2. μ€ν μν λ° ν¬μ€μ²΄ν¬ νμΈ (anl-backend-api λ° anl-frontend-app)
docker compose ps
# 3. μ€μκ° λ‘κ·Έ λͺ¨λν°λ§
docker compose logs -f
```
### 4) μλΉμ€ μ μ URL
- **π 곡μ ννμ΄μ§**: [`http://localhost:3000`](http://localhost:3000)
- **π κ΄λ¦¬μ λμ보λ**: [`http://localhost:3000/console`](http://localhost:3000/console) (λ‘κ·ΈμΈ ν ν°: `.env`μ μ€μ λ `ADMIN_TOKEN`)
- **β‘ λ°±μλ REST API**: [`http://localhost:8080/api/v1`](http://localhost:8080/api/v1)
- **π API ν¬μ€μ²΄ν¬**: [`http://localhost:8080/api/v1/health`](http://localhost:8080/api/v1/health)
### 5) 컨ν
μ΄λ κ΄λ¦¬ λ° μ€μ§
```bash
# μλΉμ€ μ¬μμ
docker compose restart
# μλΉμ€ μ€μ§ λ° μ»¨ν
μ΄λ μ κ±° (λ°μ΄ν°λ² μ΄μ€ λ³Όλ₯¨μ μμ νκ² λ³΄μ‘΄λ¨)
docker compose down
# (μ£Όμ) λ°μ΄ν°λ² μ΄μ€ λ³Όλ₯¨κΉμ§ μμ ν μμ νκ³ μ΄κΈ°νν λ
docker compose down -v
```
---
## π οΈ 6. λ‘컬 κ°λ° λ° μ€ν κ°μ΄λ (Getting Started)
Docker μμ΄ λ‘컬 κ°λ° νκ²½μμ νλ‘ νΈμλμ λ°±μλλ₯Ό κ°κ° μ§μ μ€ννκ³ κ°λ°νλ λ°©λ²μ
λλ€.
### π
°οΈ Backend (Go REST API) κ°λ° κ°μ΄λ
#### μ¬μ μꡬμ¬ν
- **Go 1.22+** (κΆμ₯: Go 1.26+)
- **SQLite 3**
- **Make** λΉλ λꡬ
#### μ€ν μ μ°¨
```bash
# 1. λ°±μλ λλ ν°λ¦¬λ‘ μ΄λ
cd backend
# 2. νκ²½ μ€μ νμΌ λ³΅μ¬
cp .env.example .env
# 3. Go λͺ¨λ μμ‘΄μ± λ€μ΄λ‘λ
go mod download
# 4. λ°μ΄ν°λ² μ΄μ€ λ°±μ
λ³Έ 볡μ (μ΅μ μ€μΈ‘ λ°μ΄ν° 223건 μ μ¬)
sqlite3 anl.db < db/backup/anl_dump.sql
# 5. λ°±μλ API μλ² λΉλ λ° μ€ν (κΈ°λ³Έ ν¬νΈ: http://localhost:8080)
make run
# 6. (λ³λ ν°λ―Έλ) μ λ ν
μ€νΈ λ° μ½λ νμ§ κ²μ¬
make test # μ λ ν
μ€νΈ μ€ν
make fmt-check # gofmt ν¬λ§· κ²μ¬
make vet # go vet μ μ λΆμ
```
---
### π
±οΈ Frontend (Next.js 14+) κ°λ° κ°μ΄λ
#### μ¬μ μꡬμ¬ν
- **Node.js 20+** (LTS)
- **npm 10+**
#### μ€ν μ μ°¨
```bash
# 1. νλ‘ νΈμλ λλ ν°λ¦¬λ‘ μ΄λ
cd refer_landing_page
# 2. μμ‘΄μ± ν¨ν€μ§ μ€μΉ
npm install
# 3. λ‘컬 νκ²½λ³μ νμΌ μ€μ (νμ μ)
# κΈ°λ³Έκ°μΌλ‘ http://localhost:8080/api/v1μ μλ μ°κ²°λ©λλ€.
echo "NEXT_PUBLIC_API_BASE_URL=http://localhost:8080/api/v1" > .env.local
# 4. κ°λ° μλ² μ€ν (κΈ°λ³Έ ν¬νΈ: http://localhost:3000)
npm run dev
# 5. νλ‘λμ
λΉλ λ° νμ
κ²μ¬
npm run lint # ESLint μ μ λΆμ
npx tsc --noEmit # TypeScript μ격 νμ
κ²μ¬
npm run build # Next.js Standalone νλ‘λμ
λΉλ
# 6. μ 체 ν΅ν© E2E ν
μ€νΈ μ€μνΈ μ€ν (Gate 0~11 μλ κ²μ¦)
python3 scripts/run_e2e_tests.py
```
---
## πΎ 7. λ°μ΄ν°λ² μ΄μ€ λ°±μ
λ° λ³΅μ κ°μ΄λ (Database Backup & Restore)
μ°κ΅¬μ€μ μμ€ν λ
Όλ¬Έ, νΉν, λ©€λ², κ°μ, νμ€ν λ°μ΄ν°λ SQLite λ°μ΄ν°λ² μ΄μ€λ₯Ό ν΅ν΄ κ΄λ¦¬λλ©°, μμ¬μ΄ λ°±μ
/볡μ λꡬλ₯Ό μ 곡ν©λλ€.
### 1) λ°±μ
νμΌ κ΅¬μ± (`backend/db/backup/`)
- **`anl.db`**: SQLite λ°μ΄λ리 μ¨λΌμΈ μ€λ
μ· νμΌ
- **`anl_dump.sql`**: μ€ν€λ§ DDL λ° μ 체 11κ° ν
μ΄λΈ λ°μ΄ν° INSERTλ¬Έμ΄ ν¬ν¨λ νμ€ SQL ν
μ€νΈ λ€ν (Git μΆμ κ΄λ¦¬)
### 2) λ°μ΄ν°λ² μ΄μ€ μ¦μ λ°±μ
λͺ
λ Ήμ΄
μΈμ λ μ§ λ°±μλ λλ ν°λ¦¬μμ λͺ
λ Ήμ΄ ν μ€λ‘ μ΅μ μνλ₯Ό λ°±μ
ν μ μμ΅λλ€:
```bash
cd backend
make backup-db
```
### 3) μ κ· νκ²½ λλ Docker 컨ν
μ΄λ 볡μ λ°©λ²
#### π³ Docker λ°°ν¬ νκ²½μμ 볡μ (μΆμ²)
```bash
docker compose exec -T anl-backend sqlite3 /app/data/anl.db < backend/db/backup/anl_dump.sql
```
#### π» λ‘컬 κ°λ° νκ²½μμ 볡μ
```bash
cd backend
sqlite3 anl.db < db/backup/anl_dump.sql
```
---
## π 8. κ΄λ¦¬μ λμ보λ (`/console`) μ¬μ© κ°μ΄λ
μ°κ΅¬μ€ ννμ΄μ§μ λͺ¨λ λ°μ΄ν°λ₯Ό μΉ UIμμ μ€μκ°μΌλ‘ μΆκ°, μμ , μμ ν μ μλ κ΄λ¦¬μ μ½μμ μ§μν©λλ€.
1. **μ μ κ²½λ‘**: [`http://localhost:3000/console/login`](http://localhost:3000/console/login)
2. **κ΄λ¦¬μ μΈμ¦**:
- λ°±μλ `.env` νμΌμ μ μλ `ADMIN_TOKEN` (κΈ°λ³Έκ°: `anl-admin-secret-token-2026`)μ μ
λ ₯νμ¬ λ‘κ·ΈμΈν©λλ€.
- μΈμ¦ ν ν°μ λΈλΌμ°μ μΈμ
μ μ μ₯λλ©°, λͺ¨λ λ³μ‘° μμ²(`POST`, `PUT`, `DELETE`)μ `Authorization: Bearer ` ν€λλ‘ μλ 첨λΆλ©λλ€.
3. **μ 곡 κΈ°λ₯**:
- **μ£Όμ μ°κ΅¬ κ³Όμ (`/console/research-projects`)**: κ³Όμ λͺ
, κΈ°κ°, μ£Όκ΄κΈ°κ΄, μ°κ΅¬λΉ λ± CRUD
- **ν΅μ¬ μ°κ΅¬ λΆμΌ (`/console/research-areas`)**: μ°κ΅¬ λΆμΌ CRUD λ° **μμ λ³κ²½ μ 1..N μλ μ κ·ν & μννΈ**
- **ꡬμ±μ/μ‘Έμ
μ (`/console/members`)**: κ΅μ, μ°κ΅¬μ, μ‘Έμ
μ μΈμ μ¬ν, μ°κ΅¬λΆμΌ, μ·¨μ
μ² CRUD
- **λ
Όλ¬Έ/νΉν μ€μ (`/console/publications`)**: κ΅μΈ/κ΅λ΄ νμ μ§ λ° νμ λν, νΉν μ€μ 223건 CRUD
- **κ°μ μλ£μ€ (`/console/lectures`)**: νκΈ°λ³ κ°μ€ κ³Όλͺ©, κ°μ κ°μ, λ€μ΄λ‘λ λ§ν¬ κ΄λ¦¬
- **νμ€ν 기ꡬ (`/console/standardization`)**: oneM2M, ITU-T λ± κΈ°κ΅¬λ³ νμ€ λ¬Έμ λ²νΈ λ° μν κ΄λ¦¬
---
## π₯ 9. λ©ν° μμ΄μ νΈ μ€μΌμ€νΈλ μ΄μ
νλ‘ν μ½ (MAM)
λ³Έ νλ‘μ νΈλ Multi-Agent Mux (MAM) κΈ°λ°μ μμ¨ μμ΄μ νΈ νμ
루νλ₯Ό ν΅ν΄ κ°λ° λ° μ μ§λ³΄μλ©λλ€.
| μμ΄μ νΈ μΈμ
λͺ
| λ΄λΉ μν (Role) | λꡬ/λ°νμ | μ£Όμ μ무 |
| :--- | :--- | :--- | :--- |
| π§ **`planner-reviewer-claude-01`** | `planner and reviewer` | Claude Code | μν€ν
μ² μ€κ³, ꡬν κ³ν μ립, λ°μ΄ν° λ¬΄κ²°μ± κ²μ¦, μ΅μ’
PASS νμ |
| π¨ **`creator-agy-01`** | `creator` | Antigravity CLI | μ»΄ν¬λνΈ κ°λ°, λ°±μλ API ꡬν, Docker 컨ν
μ΄λν, 리ν©ν λ§ |
| π **`reviewer-cline-01`** | `reviewer` | Cline | μΉ νμ€/SEO κ²μ, νμ
μμ μ±, Docker λ€νΈμν¬/보μ μ¬μΈ΅ μ½λ 리뷰 |
- **μμ¨ λ£¨ν μ€ν**: `bash .agents/skills/multi-agent-mux-loop/scripts/run_loop.sh --all-reviewer --target-agent "creator-agy-01" --task "<μμ
λ΄μ©>"`
- **μΈμ
μν νμΈ**: `bash .agents/skills/multi-agent-mux-status/scripts/status.sh`