# AI Agent Networking Lab (ANL) — System Architecture Specification
## 1. System Overview
AI Agent Networking Lab (ANL) 시스템은 연구실의 학술 실적(논문, 특허), 연구 과제, 구성원, 강의, 표준화 기고서 등의 데이터를 효율적으로 관리하고 제공하기 위한 **하이브리드 데이터 아키텍처(Decoupled Static-Export & Headless API Architecture)**로 설계되었습니다.
Next.js 기반의 고성능 정적 웹사이트(SSG)와 Go/Gin 및 SQLite 기반의 독립형 헤드리스(Headless) 백엔드 API 서버를 분리하여, **완벽한 정적 빌드 성능(0 Dynamic Route)**과 **단일 진실 공급원(Single Source of Truth) 기반의 데이터 관리 편의성**을 동시에 달성합니다.
---
## 2. High-Level Architecture Diagram
```mermaid
graph TD
subgraph "Storage & Ingestion Layer"
SEED["Seed Data JSON
(backend/seed/data/*.json)"] -->|cmd/seed| SQLITE[("SQLite Database
(anl.db - WAL Mode)")]
SQLITE -->|cmd/export-content| TS_CONTENT["Static TypeScript Content
(refer_landing_page/content/*.ts)"]
end
subgraph "Backend API Serving Layer (Go / Gin)"
API_MAIN["API Server Binary
(backend/cmd/api)"] --> ROUTER["Gin Engine & Router
(internal/router)"]
ROUTER --> HANDLERS["Domain Handlers
(internal/handlers)"]
HANDLERS --> REPO["Repository Layer
(internal/repository)"]
REPO -->|database/sql + modernc.org/sqlite| SQLITE
end
subgraph "Frontend Presentation Layer (Next.js 14 SSG)"
TS_CONTENT --> NEXT_BUILD["Next.js Static Build Engine
(○ Static / ● SSG)"]
NEXT_BUILD --> SSG_PAGES["Static HTML Routes
(/, /members, /publications, etc.)"]
ADMIN["Future Admin Dashboard
(CRUD Client)"] -.->|REST API /api/v1| ROUTER
CLIENT_BROWSER["End Users / Browsers"] -->|Fast CDN / Nginx Serving| SSG_PAGES
end
```
---
## 3. Core Architectural Principles
### 3.1 Single Source of Truth (SSOT)
- 모든 연구실 데이터(과제, 멤버, 논문, 특허, 강의, 표준화)는 **SQLite 데이터베이스(`anl.db`)**를 단일 원천으로 관리합니다.
- 데이터 갱신 시 `cmd/export-content` 도구를 통해 프론트엔드의 `content/*.ts` 파일로 동기화되어 코드와 데이터의 정합성을 보장합니다.
### 3.2 Zero-CGO Pure Go & Portability
- SQLite 드라이버로 **`modernc.org/sqlite`**를 채택하여 CGO 의존성을 완전히 제거했습니다.
- C 컴파일러 없이도 단일 실행 바이너리(`bin/api`, `bin/seed`, `bin/export-content`)로 컴파일되며, macOS, Linux, Docker 컨테이너 등 어떤 환경에서도 즉시 구동됩니다.
### 3.3 High-Performance Read Optimization (WAL Mode)
- 랜딩페이지 특성상 읽기(Read) 요청이 99% 이상이므로, SQLite 연결 시 **WAL(Write-Ahead Logging)** 모드와 `busy_timeout=5000`을 적용하여 동시 다발적인 읽기 트랜잭션에서 잠금 경합 없는 고속 처리를 보장합니다.
### 3.4 Strict Static Build Compliance (DM-03 / AC-17)
- 프론트엔드 빌드 시 런타임 API 호출 의존성을 배제하여 Next.js 정적 사전 렌더링(`○ Static` / `● SSG`) 원칙을 100% 준수합니다.
---
## 4. Layered Module Structure
```
backend/
├── cmd/
│ ├── api/main.go # Gin HTTP REST API 서버 엔드포인트 (:8080)
│ ├── seed/main.go # SQLite DDL 마이그레이션 및 JSON 시드 데이터 인제스트 도구
│ └── export-content/main.go # SQLite DB 데이터를 프론트엔드 content/*.ts 파일로 내보내는 도구
├── internal/
│ ├── db/
│ │ ├── db.go # SQLite 커넥션 풀 관리 및 PRAGMA 설정 (WAL, foreign_keys)
│ │ └── migrations/ # golang-migrate SQL DDL 스크립트 (000001_init.up.sql / down.sql)
│ ├── models/ # 도메인별 데이터 구조체 모델
│ │ ├── home.go # ResearchProject, ResearchArea, StatsSummary
│ │ ├── members.go # Member, Alumnus
│ │ ├── publications.go # Publication, Patent
│ │ ├── lectures.go # Semester, Course
│ │ └── standardization.go # StandardsBody, StandardProject, StandardDocument
│ ├── repository/ # database/sql 기반 비즈니스 쿼리 계층 (N+1 방지 일괄 쿼리 최적화)
│ ├── handlers/ # Gin HTTP 요청 바인딩 및 JSON 응답 핸들러
│ ├── router/ # API 라우트 등록, CORS 미들웨어 및 통합 테스트
│ └── httpx/ # 표준 JSON 응답 봉투 ({ data: ... } / { error: ... })
├── seed/data/ # 손실 없이 추출된 원본 JSON 데이터셋
└── Makefile # 빌드, 테스트, 시드, 실행 자동화 타겟
```
---
## 5. Data Flow Workflows
### 5.1 Initial Seeding & Database Bootstrap
1. `make seed` 실행
2. `cmd/seed`가 SQLite 데이터베이스 파일(`anl.db`)을 생성
3. 임베디드된 마이그레이션 DDL(`000001_init.up.sql`)을 실행하여 11개 테이블과 인덱스 생성
4. `seed/data/*.json` 파일들을 읽어 트랜잭션 내에서 일괄 삽입
5. 각 테이블별 행(Row) 개수 및 5대 대표 논문(`is_highlight=1`) 정합성을 자동 검증
### 5.2 Content Export & Frontend Build
1. 데이터베이스 변경 후 `make export-content` 실행
2. `cmd/export-content`가 SQLite에서 최신 데이터를 조회
3. `refer_landing_page/content/*.ts` 파일들을 타입 안전한 TypeScript 상수로 덮어쓰기 생성
4. Next.js 빌드(`npm run build`)를 통해 15개 정적 HTML 페이지가 100% SSG로 생성
### 5.3 Live REST API Serving
1. `make run` 또는 `./bin/api` 실행 (기본 포트 `:8080`)
2. 클라이언트가 `/api/v1/*` 엔드포인트로 HTTP GET 요청
3. Gin 라우터가 요청을 파싱하고 적절한 도메인 핸들러로 전달
4. 리포지토리 계층이 파라미터화된 SQL 쿼리로 SQLite 조회 후 일관된 JSON Envelope 형식으로 반환