# 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 형식으로 반환