# π κ²½λΆλνκ΅ AI μμ΄μ νΈ λ€νΈμν¬ μ°κ΅¬μ€ (ANL) 곡μ μΉμ¬μ΄νΈ
> **AI Agent Networking Laboratory (ANL), School of Computer Science and Engineering, Kyungpook National University**
>
> λ³Έ 리ν¬μ§ν 리λ κ²½λΆλνκ΅ μ»΄ν¨ν°νλΆ AI μμ΄μ νΈ λ€νΈμν¬ μ°κ΅¬μ€μ 곡μ μΉμ¬μ΄νΈ λ° λ°μ΄ν° κ΄λ¦¬ λμ보λ μμ€ν
μ
λλ€.
> **Next.js 14+ μ μ μ΅μ€ν¬νΈ(Static Export) & ν΄λΌμ΄μΈνΈ λ λλ§(CSR)**, **Go (Gin) κ³ μ±λ₯ λ¨μΌ ν΅ν© μΉ/REST API μλ²**, **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_App ["Unified Single Container (anl-app:8080)"]
subgraph Go_Gin_Server ["Go Gin Unified Server Engine"]
Router["Static File Server & SPA Fallback (/web)"]
APIRouter["REST API Router (/api/v1) & CORS"]
AuthMW["RequireAdminToken Middleware"]
Handlers["CRUD Handlers (Home, Members, Pubs, Lectures, Standards)"]
Repo["Repository Layer & Transaction Order Normalizer"]
end
subgraph Static_Web ["Static Exported Frontend (/app/web)"]
PublicPages["Public Pages (CSR + SSG Shell)
/, /members, /publications, /lectures, /standardization"]
AdminConsole["Admin Dashboard (/console)
Research Projects, Areas, Members, Pubs, Lectures, Standards"]
API_Client["Origin-Relative API Client (/api/v1)"]
end
subgraph Storage ["Persistent Storage (anl-sqlite-storage / ./volumes/data)"]
SQLiteDB[("SQLite Database
/app/data/anl.db")]
end
end
User -->|HTTP :8080| Router
Admin -->|Bearer Auth :8080| Router
Router --> PublicPages
Router --> AdminConsole
PublicPages --> API_Client
AdminConsole --> API_Client
API_Client -->|Internal Route /api/v1| APIRouter
APIRouter --> AuthMW
AuthMW --> Handlers
Handlers --> Repo
Repo --> SQLiteDB
```
---
## π 4. λλ ν°λ¦¬ ꡬ쑰 (Directory Structure)
```
landing_page/
βββ README.md # [λ³Έ λ¬Έμ] μ’
ν© νλ‘μ νΈ κ°μ΄λ λ° λ°°ν¬/μ΄μ λ¬Έμ
βββ docker-compose.yml # ν΅ν© λ¨μΌ 컨ν
μ΄λ (anl-app) Compose μ€μΌμ€νΈλ μ΄μ
βββ .env.example # νκ²½λ³μ μ€μ ν
νλ¦Ώ
β
βββ backend/ # β‘ [ν΅ν© Go λ°±μλ & μ μ μΉ μλΉ μλ²]
β βββ cmd/ # μ§μ
μ (api: ν΅ν© μλ², seed: μλ, export-content)
β βββ internal/ # λΉμ¦λμ€ λ‘μ§ (handlers, repository, router, config, httpx)
β βββ db/backup/ # πΎ λ°μ΄ν°λ² μ΄μ€ λ°±μ
(anl.db λ°μ΄λ리, anl_dump.sql μ 체 λ€ν)
β βββ seed/data/ # μ΄κΈ° μμ JSON μλ λ°μ΄ν°
β βββ Dockerfile # 3λ¨κ³ ν΅ν© Multi-stage Dockerfile (Node λΉλ + Go λΉλ + Alpine λ°νμ)
β βββ 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 ν
μ€νΈ μ€μνΈ λ° λ°μ΄ν° κ²μ¦ λ¬λ
β βββ next.config.js # output: "export" μ μ μ΅μ€ν¬νΈ μ€μ
β βββ package.json # Next.js, React, Tailwind CSS μμ‘΄μ±
β
βββ .agents/ # π€ λ©ν° μμ΄μ νΈ μ€μΌμ€νΈλ μ΄μ
μ€ν¬ & λ£°μ
(MAM)
βββ .mam/ # β‘ μμ΄μ νΈ μΈμ
DB λ° HERDR 격리 λ μ§μ€νΈλ¦¬
βββ ISL-2026/ # π λ κ±°μ μ€μΈ‘ μλ³Έ HTML/CSS μμΉ΄μ΄λΈ
```
---
## π 5. Docker 컨ν
μ΄λ λ°°ν¬ λ° μ΄μ κ°μ΄λ (Production Deployment)
λ¨μΌ 컨ν
μ΄λ(Single Unified Container)λ₯Ό ν΅ν΄ νλ‘ νΈμλ μ μ μΉ μμ
κ³Ό Go λ°±μλ APIλ₯Ό λμμ λΉλνκ³ λ°°ν¬ν©λλ€.
### 1) μ μ₯μ ν΄λ‘ λ° νκ²½ μ€μ
```bash
# 1. μ μ₯μ ν΄λ‘
git clone <리ν¬μ§ν 리_URL> landing_page
cd landing_page
# 2. νκ²½λ³μ νμΌ μμ±
cp .env.example .env
# (μ ν) .env νμΌμμ κ΄λ¦¬μ ν ν°(ADMIN_TOKEN) λ° ν¬νΈ(APP_PORT) μ€μ
```
### 2) 컨ν
μ΄λ μ΄λ―Έμ§ λΉλ
```bash
# ν΅ν© λ¨μΌ 컨ν
μ΄λ (anl-app) λΉλ
docker compose build
# (μ ν) μΊμ μμ΄ μ 체 μ¬λΉλ μ
docker compose build --no-cache
```
### 3) μλΉμ€ λ°±κ·ΈλΌμ΄λ λ°°ν¬ λ° μ€ν
```bash
# 1. 컨ν
μ΄λ λ°±κ·ΈλΌμ΄λ μ€ν
docker compose up -d
# 2. μ€ν μν λ° ν¬μ€μ²΄ν¬ νμΈ (anl-app)
docker compose ps
# 3. μ€μκ° λ‘κ·Έ λͺ¨λν°λ§
docker compose logs -f
```
### 4) μλΉμ€ μ μ URL
- **π 곡μ ννμ΄μ§**: [`http://localhost:8080`](http://localhost:8080)
- **π κ΄λ¦¬μ λμ보λ**: [`http://localhost:8080/console`](http://localhost:8080/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) π νΈμ€νΈ λλ ν°λ¦¬ λ°μΈλ λ§μ΄νΈ (`./volumes/data`)λ‘ λ³κ²½νλ λ°©λ²
κΈ°λ³Έ λͺ
λͺ
λ λ³Όλ₯¨ λμ νΈμ€νΈ λ‘컬 ν΄λμ SQLite DBλ₯Ό μ§μ λ§μ΄νΈνμ¬ κ΄λ¦¬νκ³ μΆλ€λ©΄:
1. `docker-compose.yml`μ `anl-app` λ³Όλ₯¨ μ€μ μ μμ ν©λλ€:
```yaml
services:
anl-app:
# ...
volumes:
- ./volumes/data:/app/data
```
2. νμΌ λ§¨ μλμ `volumes:` μΉμ
μ μ£Όμ μ²λ¦¬νκ±°λ μ κ±°ν©λλ€.
3. νΈμ€νΈ λλ ν°λ¦¬ μμ± λ° DB λ°°μΉ:
```bash
mkdir -p volumes/data
cp backend/db/backup/anl.db volumes/data/anl.db
```
4. 컨ν
μ΄λ μ¬μμ: `docker compose down && docker compose up -d`
### 6) 컨ν
μ΄λ κ΄λ¦¬ λ° μ€μ§
```bash
# μλΉμ€ μ¬μμ
docker compose restart
# μλΉμ€ μ€μ§ λ° μ»¨ν
μ΄λ μ κ±° (λ°μ΄ν°λ² μ΄μ€ λ³Όλ₯¨μ μμ νκ² λ³΄μ‘΄λ¨)
docker compose down
# (μ£Όμ) λ°μ΄ν°λ² μ΄μ€ λ³Όλ₯¨κΉμ§ μμ ν μμ νκ³ μ΄κΈ°νν λ
docker compose down -v
```
---
## π οΈ 6. λ‘컬 κ°λ° λ° μ€ν κ°μ΄λ (Getting Started)
### π
°οΈ Backend (Go REST API & Web Server) κ°λ° κ°μ΄λ
```bash
cd backend
cp .env.example .env
# λ°μ΄ν°λ² μ΄μ€ μλ λ° λ§μ΄κ·Έλ μ΄μ
μ€ν
make migrate-seed
# λ°±μλ μλ² λ‘컬 ꡬλ (κΈ°λ³Έ ν¬νΈ: 8080)
go run ./cmd/api --db anl.db --admin-token dev_admin_secret_token_12345
```
### π
±οΈ Frontend (Next.js 14) κ°λ° κ°μ΄λ
```bash
cd refer_landing_page
# μ’
μμ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν (Next.js dev μλ²: http://localhost:3000)
npm run dev
# μ μ μ΅μ€ν¬νΈ λΉλ κ²μ¦ (out/ λλ ν°λ¦¬ μμ±)
npm run build
```
---
## π§ͺ 7. νμ§ κ²μ¦ λ° E2E ν
μ€νΈ μ€μνΈ (12 Quality Gates)
```bash
cd refer_landing_page
python3 scripts/run_e2e_tests.py
```
λͺ¨λ 12κ° νμ§ κ²μ΄νΈ(Static Build Completeness, TypeScript, ESLint, SQLite Baseline, Live Unified Go Server Routes, DOM Content, Layout Architecture, WCAG Contrast λ±)κ° 100% 무결νκ² κ²μ¦λ©λλ€.