Files
landing_page/REQUIREMENTS.md
T

620 lines
51 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📐 요구사항 명세서 (Requirements Specification)
## 경북대학교 AI 에이전트 네트워크 연구실 (ANL) 공식 홈페이지
| 항목 | 내용 |
| :--- | :--- |
| **문서 ID** | `REQ-ANL-WEB-001` |
| **버전** | `1.4` |
| **작성일** | 2026-07-30 |
| **작성자** | claude (`canary-projects-landing-page-creator-claude`) · Role: planner |
| **상태** | 초안 (Draft) — §12 미결 결정(D-01) 확정 후 `승인(Approved)`으로 전환 |
| **대상 독자** | General Manager, Developer Team Leader(Agy), Reviewer Team Leader(Cline), 지도교수 |
| **선행 문서** | [`README.md`](./README.md), [`.agents/MULTI_AGENT_RULES.md`](./.agents/MULTI_AGENT_RULES.md), [`refer_landing_page/docs/DESIGN.md`](./refer_landing_page/docs/DESIGN.md) |
| **적용 범위** | `refer_landing_page/` (Next.js 14 App Router 애플리케이션) 전체 |
> **본 문서의 성격**: 코드를 포함하지 않는 **명세 문서**입니다. 데이터 스키마와 인터페이스 정의에 한해 TypeScript 타입 표기를 사용하나, 이는 계약(contract) 기술을 위한 것이며 구현 코드가 아닙니다.
---
## 1. 원본 요구사항 (사용자 제공 · 정본)
> 아래는 사용자가 직접 작성한 요구사항 원문이며, **본 명세서 전체의 정본(normative source)** 이다.
> 이하 모든 절은 이 원문을 구체화한 것이며, 원문과 충돌하는 서술이 있다면 **원문이 우선**한다.
```
- 홈페이지 상단 탭은 다음과 같음
- Home: 연구실 소개, 연구실 주요 연구 분야 소개, 오시는길
- Members: 기존 정보 그대로 보존되어야 함
- Publications: 기존 정보 그대로 보존되어야 하며, 다음 카테고리로 구분되어야 함
- International Conference
- International Journal & Conference
- Domestic Journal & Conference
- Patent
- Lectures: 기존 정보 그대로 보존되어야 함
- Standardization: 기존 정보 그대로 보존되어야 함
```
### 1.1 원문에서 도출되는 최상위 원칙
| ID | 원칙 | 근거 문구 |
| :--- | :--- | :--- |
| **PR-01** | **무손실 보존 (Lossless Preservation)** — 레거시 `ISL-2026/`의 레코드는 **한 건도 누락되지 않고**, 문구·표기·순서가 임의로 변형되지 않은 채 이관되어야 한다 | "기존 정보 그대로 보존되어야 함" (4회 반복) |
| **PR-02** | **상단 탭 5종 고정** — Home / Members / Publications / Lectures / Standardization | "홈페이지 상단 탭은 다음과 같음" |
| **PR-03** | **Home 3구성** — 연구실 소개 · 주요 연구 분야 소개 · 오시는 길 | Home 항목 |
| **PR-04** | **Publications 4분류** — 원문에 명시된 4개 카테고리 라벨을 그대로 사용한다 | Publications 항목 |
> ⚠️ **PR-01의 해석**: "그대로 보존"은 **데이터의 무손실**을 의미하며, *레거시의 시각적 표현을 그대로 복제하라는 뜻이 아니다.* 표현은 신규 디자인 시스템(§8)을 따르되, **레코드 단위의 정보량은 100% 보존**한다. 점진적 노출(더 보기·접기)은 전체 레코드가 접근 가능한 한 허용된다(§9.4 참조).
---
## 2. 개요 및 배경 (Overview & Background)
### 2.1 목적
경북대학교 컴퓨터학부 연구실이 **사물인터넷 표준 연구실 (IoT Standards Laboratory, ISL)** 에서 **AI 에이전트 네트워크 연구실 (AI Agent Networking Laboratory, ANL)** 로 연구 정체성을 전환함에 따라, 공식 홈페이지를 다음 두 축으로 재구축한다.
1. **정체성 전환 (Identity Transformation)** — 연구실 명칭·연구 서사·시각 언어를 ANL 및 5대 핵심 연구 기둥 기준으로 전면 교체한다.
2. **실데이터 마이그레이션 (Data Migration)** — 레거시 사이트 `ISL-2026/`에 축적된 **실측 연구 실적 총 223건**(국제 논문 68 · 국내 논문 80 · 특허 75)과 **표준화 문서 약 55건**을 신규 애플리케이션의 타입 안전한 데이터 구조로 무손실 이관한다(PR-01).
### 2.2 현재 상태 (As-Is)
| 자산 | 경로 | 상태 |
| :--- | :--- | :--- |
| 레거시 공식 홈페이지 | `ISL-2026/` | 정적 HTML. **실데이터 원본(Single Source of Truth)** |
| 신규 프로토타입 | `refer_landing_page/` | Next.js 14.2.35 / React 18 / TS 5 / Tailwind 3. 라우트 5종 구현, **콘텐츠는 대부분 placeholder** |
| 연구 자산 | `multi-agent-orchestration/` | 5대 연구 기둥의 근거 자료 (SLIDE.md, chapters/, lecture_summary.md) |
**완료된 선행 작업** (커밋 `e35b46d``315ba9e``cdd0db3`, 3차 교차 리뷰 `[VERDICT: PASS]`)
- 연구실 명칭 ANL 전환: Header / Footer / `metadata` / `package.json`(`anl-landing`) / `docs/DESIGN.md` / `tailwind.config.ts`
- `/intro` 커버 스프레드를 5대 연구 기둥 3+2 매거진 조판으로 재구성
- 강조색 시맨틱 계약 재정의: `vermillion` = Agent Eng / Orchestration (홀수), `cobalt` = MCP / A2A Protocol (짝수)
- 빌드 게이트 정비: `.eslintrc.json` 도입, lint / tsc / build 3종 통과
**미해결 상태**
- **`/`(루트) 라우트 부재** — `app/page.tsx`가 없어 사이트 루트 직접 접근 시 404. PR-02의 `Home` 탭이 존재하지 않는다.
- `/members`, `/publications`, `/lectures`, `/standardization` 본문이 전부 가상의 placeholder (`연구원 A (placeholder)`, 가상 논문, 실재하지 않는 oneM2M/OMA LwM2M 기여 내역)
- 레거시 실데이터 **223건 + 표준 문서 약 55건 전량 미이관** — PR-01 미충족
---
## 3. 이해관계자 및 역할 (Stakeholders & Roles)
| 주체 | 역할 | 본 명세서에 대한 책임 |
| :--- | :--- | :--- |
| 지도교수 (고석주 교수) | 콘텐츠 소유자 | 실데이터 정확성 최종 확인, §12 D-01·D-02·D-03 결정 |
| General Manager | 오케스트레이터 | 잡 분배, 마일스톤 게이팅, 미결 결정 에스컬레이션 |
| **Agy** (`creator`) | 개발 팀장 | §6·§7 구현, 데이터 추출·이관, 컴포넌트 개발 |
| **Cline** (`reviewer`) | 리뷰어 팀장 | §9 비기능 요구사항 검수 (UI/UX 반응형, SEO, 접근성) |
| **Claude** (`planner and reviewer`) | 기획·리뷰어 팀장 | 본 명세서 작성·유지, 데이터 무결성 교차 검증, 최종 Verdict |
---
## 4. 정보 구조 (Information Architecture)
### 4.1 사이트맵
```
/ Home [🆕 신규] 연구실 소개 · 주요 연구 분야(5대 기둥) · 오시는 길
├── /members Members 지도교수 · 재학 연구원 16명 · 졸업생 60명
├── /publications Publications 전체 목록 (총 223건)
│ ├── /publications/intl-conf International Conference
│ ├── /publications/intl-journal-conf International Journal & Conference
│ ├── /publications/domestic-journal-conf Domestic Journal & Conference
│ └── /publications/patent Patent
├── /lectures Lectures 2016 Fall ~ 2026 Spring, 약 20개 학기
└── /standardization Standardization 표준화 기구 6곳 · 표준 문서 약 55건
```
### 4.2 IA 설계 결정
| ID | 결정 | 근거 |
| :--- | :--- | :--- |
| **IA-01** | 현행 `/intro`의 커버 스프레드를 **`/`(Home)으로 승격**한다 | PR-02가 상단 탭에 `Intro`를 포함하지 않으며, PR-03의 "연구실 소개"가 Home의 구성 요소로 명시되어 있다. `/intro`를 별도 유지하면 Home과 콘텐츠가 중복된다. **부수 효과로 기존 `/` 404 결함이 해소된다.** |
| **IA-02** | `/intro`**`/`로 308 영구 리다이렉트**한다 | 3차에 걸친 리뷰 리포트·문서가 `/intro`를 참조하고 있어 링크 안정성이 필요하다. `next.config.js``redirects()`로 처리하며 별도 페이지 파일을 남기지 않는다. |
| **IA-03** *(v1.1 개정)* | Publications 4개 카테고리는 **라우트 세그먼트 `/publications/[category]` + `generateStaticParams()`** 로 구현한다. `/publications`는 전체 목록 기본 화면으로 유지한다 | **v1.0에서 "단일 라우트 + `?cat=` 쿼리"였으나 §8.5의 실측 검증 결과에 따라 개정.** 세그먼트 방식은 카테고리별 완전한 정적 HTML 4개를 빌드 타임에 생성해 **공유 링크가 필터 상태를 포함한 문서를 그대로 제공**하며(AC-05 취지 충족), 뒤로/앞으로 가기·프리페치·스크롤 복원이 Next 라우터에서 기본 제공된다. 슬러그를 카테고리 레지스트리에서 도출하므로 **라벨 변경이 레지스트리 한 곳 수정으로 끝난다는 v1.0의 근거는 그대로 유지**된다(→ D-01 리스크 완화 불변). 상단 탭은 5종 그대로이므로 **PR-02와 충돌하지 않는다**(하위 라우트일 뿐 최상위 탭이 아니다). |
| **IA-04** | 내비게이션 항목은 **PR-02의 5개로 고정**한다 | `components/Header.tsx`의 데스크톱 내비가 5개 항목 기준으로 조판되어 있다. 항목 증감 시 헤더 레이아웃 재설계가 선행되어야 한다. |
---
## 5. 콘텐츠 정본: 핵심 연구 분야
PR-03의 "연구실 주요 연구 분야 소개"에 해당하는 콘텐츠다. `README.md` §2를 **정본(canonical)** 으로 하며, UI의 모든 연구 서술은 여기서 파생되어야 한다. 어휘를 임의로 변형하지 않는다.
| # | 분야 (KO) | 분야 (EN) | 핵심 키워드 | 강조색 |
| :-: | :--- | :--- | :--- | :--- |
| 1 | AI Agent 기능 확장 프로토콜 | Extensibility & Protocol | MCP, SKILL, CLI 코딩 에이전트 | `vermillion` |
| 2 | 멀티 에이전트 협업 및 오케스트레이션 | Multi-Agent Systems | HERDR, crewAI, LangGraph | `cobalt` |
| 3 | 에이전트 상호운용성 개방형 표준 | Interoperability Standards | A2A, ACP, Agent Card | `vermillion` |
| 4 | AIoT & 고성능 통신 백본 | High-Performance Backbone | gRPC/QUIC, Protobuf, MQTT/CoAP | `cobalt` |
**R-5.1** 강조색은 §8.3의 홀수/짝수 규칙을 따른다. 분야 순서를 변경하면 색 배정도 함께 갱신해야 한다.
**R-5.2** 핵심 연구 분야 서술 전문(全文)은 Home에만 두고, 타 페이지에는 요약 키워드만 노출한다. 동일 문장을 여러 페이지에 중복 하드코딩하지 않는다.
**R-5.3** 레거시 `introduction.html`의 구 연구 분야(QUIC, CoAP, IVI, VLC/OWC, mSCTP, SCTP, Mobility Management, Tabu Search 등)는 **Home의 연구 분야 소개에서 제외**한다. 단, 이들 주제로 산출된 논문·특허·표준은 PR-01에 따라 실적 페이지에 **전량 보존**된다.
---
## 6. 페이지별 상세 요구사항
> 각 항목의 `[MUST]` / `[SHOULD]` / `[MAY]`는 RFC 2119 수준을 따른다.
### 6.1 Home (`/`) — 🆕 신규 라우트
PR-03에 따라 **연구실 소개 · 주요 연구 분야 소개 · 오시는 길** 3개 블록을 필수 포함한다.
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| H-01 | `app/page.tsx`를 신규 생성하고, 현행 `app/intro/page.tsx`의 섹션 구성(커버 스프레드 → 지표 카운터 → Mission 풀쿼트 → 핵심 연구 분야 → Focus Areas)을 이관한다 | MUST |
| H-02 | 커버 히어로는 현행 확정 카피를 유지한다: 킥커 `경북대학교 컴퓨터학부 · AI Agent Networking Lab (ANL)`, 헤드라인 `에이전트 네트워크의 / 미래를 짓다`, 디스플레이 `Agents / in Motion` | MUST |
| H-03 | **[연구실 소개]** 연구실 개요·지도교수·비전을 서술하는 블록을 배치하고, 상세는 `/members`로 연결한다 | MUST |
| H-04 | **[주요 연구 분야]** §5의 핵심 연구 분야 전문을 매거진 조판으로 노출한다 | MUST |
| H-05 | **[오시는 길]** 아래 §6.1.1 요구사항을 충족하는 블록을 배치한다 | MUST |
| H-06 | 지표 카운터는 **데이터 배열에서 도출된 값**만 사용한다. 근거 없는 홍보성 수치(가동률·만족도 등) 게시 금지 | MUST |
| H-07 | H-06의 권장 지표: `연구 분야` = 4, `누적 연구 실적` = 논문+특허 합계(223), `Issue · 발행` = 2026(static) | SHOULD |
| H-08 | 대표 실적 하이라이트 — 최신 국제 저널 3건을 `/publications`로 연결 | SHOULD |
| H-09 | 표준화 기여 요약 밴드 — 기구 6곳 약칭 `Marquee` + `/standardization` 연결 | SHOULD |
| H-10 | `HeroComposition` SVG는 현행(A2A 노드 메시 × QUIC/gRPC 스트림)을 그대로 재사용한다 | MUST |
| H-11 | `/intro``/` 308 리다이렉트를 `next.config.js`에 등록한다 (IA-02) | MUST |
| H-12 | `components/Header.tsx`의 브랜드 링크 `href``/intro``/`로 바꾸고, 내비 배열 첫 항목을 `Home`(`/`)으로 교체한다 | MUST |
#### 6.1.1 오시는 길 (Directions) 세부 요구사항
레거시 `index.html`에 주소가 **HTML 주석 처리된 상태**로 존재한다. 이를 복원해 사용한다.
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| H-13 | 소재지를 표기한다: **경북대학교 IT대학 5호관(415동) 527호** / *School of Computer Science and Engineering, Kyungpook National University* | MUST |
| H-14 | 연락처를 표기한다: `sjkoh@knu.ac.kr` (지도교수). 전화·팩스는 **레거시에 존재하지 않으므로 창작하지 않는다** | MUST |
| H-15 | 소속 기관 링크를 제공한다: KNU(`knu.ac.kr`), 컴퓨터학부(`cse.knu.ac.kr`), IT대학(`it.knu.ac.kr`) | MUST |
| H-16 | 지도 표현 방식은 §12 **D-03**의 결정을 따른다. 외부 지도 스크립트를 임의로 도입하지 않는다(R-9.13 최소 의존성 원칙과 충돌) | MUST |
| H-17 | 주소는 시맨틱 `<address>` 요소로 마크업한다 | MUST |
| H-18 | 대중교통·주차 안내는 **레거시에 데이터가 없으므로 이번 범위에서 제외**한다. 필요 시 지도교수 확인 후 별도 잡으로 추가 | MUST |
### 6.2 Members (`/members`) — PR-01 적용
**레거시 실측**: 재학 16명(교수 1 · Ph.D. 1 · Ph.D. Candidate 4 · Ph.D. Student 5 · M.S. Candidate 3 · M.S. Student 2), 졸업생 60명(2007~2026).
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| M-01 | 현행 placeholder(`연구원 A~G`) 전량을 `ISL-2026/member.html` 실데이터로 교체한다. **재학 16명 + 졸업생 60명 = 76명 전원 보존** | MUST |
| M-02 | 지도교수 피처 스프레드: `고석주 교수 / Prof. Seok-Joo Koh`, 이메일 `sjkoh@knu.ac.kr`, 개인 홈페이지(`ISL-2026/sjkoh/`) 및 GitHub(`github.com/sjkoh12`) 링크 | MUST |
| M-03 | 재학 연구원을 **학위 과정별로 그룹핑**하고, 레거시의 `Candidate`/`Student` 구분을 보존한다 | MUST |
| M-04 | 소속 학과가 컴퓨터학부와 다른 연구원(정보보호학과·정보과학과·과학기술학과·ICT융합학과·컴퓨터학부 등 8명)은 **소속 표기를 함께 노출**한다 | MUST |
| M-05 | 졸업생 60명을 **졸업 연도 역순**으로 게시하고, 학위·졸업시점·전공·현 소속을 표기한다 | MUST |
| M-06 | 졸업생 목록은 최근 3년을 기본 노출하고 나머지는 `더 보기`로 확장한다. **확장 시 60명 전원이 노출되어야 한다** (PR-01) | SHOULD |
| M-07 | 이름 표기 형식을 통일한다: `한글명 (Romanized Name)`. 외국인 연구원(Hoang Anh Dang 등)은 원문 그대로 표기 | MUST |
| M-08 | 인원 통계 카운터는 배열 길이에서 도출한다 (H-06 원칙 동일 적용) | MUST |
| M-09 | 개인 이메일·연락처는 **지도교수 외 게시하지 않는다** | MUST |
| M-10 | 졸업생의 현 소속 문구(`He is now with ...`)는 레거시 원문 정보를 보존하되, 국문 페이지 맥락에 맞게 소속명만 추출해 표기해도 무방하다 | SHOULD |
### 6.3 Publications (`/publications`) — PR-01 + PR-04 적용
**레거시 실측**: `paper-international.html` 68건(저널 67 + 학술대회 1) · `paper-domestic.html` 80건(KCI 등재 48) · `patent.html` 75건 = **총 223건**.
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| P-01 | PR-04의 **4개 카테고리 라벨을 그대로** 사용한다: `International Conference` / `International Journal & Conference` / `Domestic Journal & Conference` / `Patent` **(→ §12 D-01: 카테고리 1·2 범위 중첩 확인 필요)** | MUST |
| P-02 | 카테고리는 **레지스트리 상수 1곳**에 정의하고, 개별 레코드는 `category` 판별 필드만 갖는다. 라벨 변경·교체가 레지스트리 수정만으로 완결되어야 한다 | MUST |
| P-03 | **223건 전량 보존** — 어떤 카테고리에도 배정되지 않아 누락되는 레코드가 있어서는 안 된다. 분류 판정이 모호한 레코드는 임의 폐기하지 말고 D-01 확정 시까지 보류 목록으로 보고한다 | MUST |
| P-04 | 레거시 `paper-international.html`은 저널과 학술대회 논문이 **혼재**되어 있다(학술대회 1건 확인: `International Conference on ICTC`, 2023). 이관 시 게재처 문자열로 판별해 분류한다 | MUST |
| P-05 | 기본 정렬은 **발행 연월 내림차순**, 동일 연월 내에서는 레거시 게시 순서를 보존한다 | MUST |
| P-06 *(v1.1 개정)* | 카테고리 필터 UI를 제공한다. 필터 상태는 **URL 경로**(`/publications/<slug>`)에 반영되어 **공유 가능한 링크**가 되어야 한다. 슬러그는 §7.2 `PubCategory` 값을 그대로 사용한다. 구현 방식은 **§8.5의 렌더링 제약을 반드시 따른다** | MUST |
| P-06a *(v1.1 신설)* | 카테고리 내비게이션은 `next/link``<Link>`로 구현한다. `window.history.pushState` 직접 호출·`useSearchParams()` 사용 금지 (§8.5 R-8.11~8.14) | MUST |
| P-07 | 전체 223건을 단일 화면에 일괄 렌더하지 않는다. **연도별 그룹 헤더 + 지연 확장** 또는 페이지네이션으로 초기 렌더 부하를 제한하되, 전 레코드가 접근 가능해야 한다 (§9.4) | MUST |
| P-07a *(v1.1 신설)* | 레코드 목록 자체는 **서버 컴포넌트에서 정적 HTML로 렌더**되어야 한다. 목록 데이터를 클라이언트 컴포넌트 내부나 `<Suspense>` 경계 안쪽에 두어 정적 문서에서 누락시켜서는 안 된다 (§8.5 R-8.15). 근거: JS 미실행 환경·크롤러에서도 PR-01의 전 레코드가 문서에 존재해야 한다 | MUST |
| P-08 | 국내 논문의 `(KCI)` 등재 표시를 **배지로 보존**한다 (48건) | MUST |
| P-09 | 특허 레코드는 다음을 모두 보존한다: 발명자 목록, 출원번호·출원일, 등록번호·등록일(있는 경우), 국가(한국/US). **출원/등록 상태를 구분 표기**한다 | MUST |
| P-10 | 파생 통계 카운터: 카테고리별 건수를 배열에서 도출해 표기 | SHOULD |
| P-11 | DOI·원문 링크는 **레거시에 존재하지 않으므로 이번 범위에서 제외**한다. 스키마에 선택 필드로 예약만 한다 | MUST |
| P-12 | 저자명·논문 제목·게재처 표기는 **레거시 원문을 그대로 보존**한다. 임의 축약·재배열·번역 금지 (PR-01) | MUST |
| P-13 | 국문·영문 제목이 혼재하는 국내 논문 목록에서 언어를 통일하지 않는다 (PR-01) | MUST |
### 6.4 Lectures (`/lectures`) — PR-01 적용
**레거시 실측**: 2016 Fall ~ 2026 Spring, 약 20개 학기, 과목명 + 학수번호 형식.
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| L-01 | 현행 placeholder 3건(`사물인터넷 개론`, `메타버스 상호운용성과 표준` 등)을 실제 강의 이력으로 교체한다. **전 학기 전 과목 보존** | MUST |
| L-02 | **학기별(Spring/Fall + 연도) 그룹핑**을 레거시 구조 그대로 보존한다 | MUST |
| L-03 | 최근 3개 학기를 기본 노출하고 이전 이력은 `전체 이력 보기`로 확장한다. **확장 시 전 학기가 노출되어야 한다** (PR-01) | SHOULD |
| L-04 | 과목 레코드: 학수번호(`COMP 0414` 등), 과목명(EN), 학부/대학원 구분 | MUST |
| L-05 | 과목명 한글 번역은 **레거시에 없으므로 신규 창작하지 않는다.** 영문 원문을 정본으로 노출한다 (→ §12 D-02) | MUST |
| L-06 | `Fall 2023 — No Class (Sabbatical)`과 같은 비강의 학기도 이력에 보존한다 (PR-01) | MUST |
| L-07 | 동일 과목이 여러 분반(`ITEC 401003`, `ITEC 401004`)으로 개설된 경우 분반을 합치지 않고 보존한다 (PR-01) | MUST |
### 6.5 Standardization (`/standardization`) — PR-01 적용
**레거시 실측**: 기구 6곳 / 표준 문서 약 55건 / 활동 기간 2000~현재.
| 기구 | 활동 기간 | 주요 산출물 | 구분 |
| :--- | :--- | :--- | :--- |
| IEC TC100 (Multimedia Systems and Equipment) | 2018 ~ 현재 | IEC 63614(Metaverse) 4건, IEC 63478(QoE, **WG11 Convenor**) 3건, IEC 63479(Infotainment) 3건, IEC 63246(CCIS) 4건 | 국제 |
| ISO/IEC JTC1/SC41 (IoT and Digital Twin) | 2020 ~ 현재 | ISO/IEC TR 30189 2건 | 국제 |
| ITU-T SG20 (IoT Services based on VLC) | 2018 ~ 2020 | Y.4465, Y.4474 | 국제 |
| ITU-T SG13 (Mobility Management) | 2002 ~ 2012 | Q.Sup52, Q.1706~1709, Y.2052, Y.2809 등 7건 | 국제 |
| ISO/IEC JTC1/SC6 WG7 (Network and Transport) | 2000 ~ 2014 | ECTP(14476), RMCP(16512), MMC(24793), FN-PSR(29181) 계열 다수 | 국제 |
| TTA/PG425 (가시광 통신 기반 사물인터넷) | 2018 ~ 2020 | TTAK.KO-10.1158 part1~3 | 국내 |
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| S-01 | 현행 4개 기구(`oneM2M`, `W3C WoT`, `IETF QUIC`, `OMA LwM2M`)는 **실제 기여 이력이 아닌 placeholder**이므로 전량 교체한다 | MUST |
| S-02 | **국제 표준화 / 국내 표준화** 2개 섹션으로 구분한다 (레거시 구조 보존) | MUST |
| S-03 | 기구별 카드에 활동 기간과 역할(예: `WG11 Convenor`, `WG30(TA17)`)을 명시한다 | MUST |
| S-04 | 표준 문서는 기구 → 워킹그룹/프로젝트 → 문서의 **3단 계층**으로 표현하고, 문서 55건 전량을 보존한다 | MUST |
| S-05 | 문서 상태(`IS` / `TS` / `TR` / `CDV` / `WDTR` / `In Progress`)를 배지로 구분 노출한다 | MUST |
| S-06 | `In Progress` 문서(IEC WDTR 63614-4, IEC CDV 63478-3, ISO/IEC CDTR 30189-2)는 **진행 중임이 시각적으로 명확**해야 한다 | MUST |
| S-07 | 기구 카드 강조색은 §8.3 홀수/짝수 교차 규칙을 따른다 | MUST |
| S-08 | 카운터는 기구 수·문서 수를 배열에서 도출한다 | MUST |
| S-09 | 5대 연구 기둥 중 **기둥 4(A2A/ACP 개방형 표준)** 와의 연결 서술을 도입부에 배치해, 과거 표준화 역량이 신규 연구 방향으로 이어짐을 드러낸다 | SHOULD |
---
## 7. 데이터 모델 및 마이그레이션 명세
### 7.1 데이터 배치 원칙
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| DM-01 | 콘텐츠 데이터는 페이지 컴포넌트에서 분리해 **`content/` 디렉터리의 타입 지정 모듈**로 이관한다 (`content/members.ts`, `content/publications.ts`, `content/lectures.ts`, `content/standards.ts`) | MUST |
| DM-02 | 각 모듈은 명시적 TypeScript 인터페이스를 export 한다. `any` 사용 금지 | MUST |
| DM-03 *(v1.1 문구 정정)* | 데이터는 **빌드 타임 정적 상수**로 유지한다. 런타임 fetch·외부 API·DB를 도입하지 않는다. 전 라우트가 **빌드 타임 정적 프리렌더**(`○ Static` 또는 `● SSG`)를 유지해야 하며, `ƒ Dynamic` 라우트가 발생해서는 안 된다 (§8.5 R-8.16) | MUST |
| DM-04 | 각 페이지 상단의 `// CUSTOMIZATION HOOK` 주석 규약(`DESIGN.md` "콘텐츠 우선" 원칙)은 `content/` 모듈로 이전하되 **규약 자체는 유지**한다 | MUST |
### 7.2 스키마 정의 (계약)
```ts
// content/members.ts
type Degree = "Professor" | "PhD" | "PhDCandidate" | "PhDStudent" | "MSCandidate" | "MSStudent";
interface Member {
ko: string; // "최동규" (외국인 연구원은 원문 표기)
en: string; // "Dong-Kyu Choi"
degree: Degree;
affiliation?: string; // 컴퓨터학부 외 소속일 때만 (M-04)
}
interface Alumnus {
ko: string;
en: string;
degree: "PhD" | "MS";
graduatedAt: string; // "2026-08" (ISO 8601 부분 표기)
major?: string; // "Computer Science and Engineering"
currentPosition?: string; // "Daegu Catholic University (대구가톨릭대학교) as Professor"
}
// content/publications.ts
// PR-04의 4개 카테고리. 라벨 문자열은 레지스트리에서만 정의한다 (P-02).
type PubCategory =
| "intl-conf" // International Conference
| "intl-journal-conf" // International Journal & Conference
| "domestic-journal-conf" // Domestic Journal & Conference
| "patent"; // Patent
interface Publication {
category: PubCategory; // P-02: 판별 필드
title: string; // P-12: 원문 보존
authors?: string; // P-12: 원문 보존
venue?: string; // 저널/학술대회명
volume?: string; // "Vol. 23, pp. 4490~4505"
publishedAt: string; // "2026-04" (P-05 정렬 키)
kci?: boolean; // P-08
doi?: string; // P-11: 예약 필드, 현재 미사용
}
interface Patent {
category: "patent";
title: string;
inventors: string; // "고석주, 정중화, 남혜빈, 최동규"
applicationNo: string; // "2023-0180751"
applicationAt: string; // "2023-12-13"
registrationNo?: string; // "2963109"
registrationAt?: string; // "2026-05-06"
country: string; // "한국" | "US"
publishedAt: string; // 정렬 키 (= applicationAt 의 연월)
}
// content/lectures.ts
interface Semester {
term: "Spring" | "Fall";
year: number;
courses: { code: string; en: string; note?: string }[]; // L-05, L-06, L-07
}
// content/standards.ts
type DocStatus = "IS" | "TS" | "TR" | "CDV" | "WDTR" | "InProgress";
interface StandardsBody {
org: string; // "IEC TC100"
full: string; // "Multimedia Systems and Equipment"
scope: "international" | "domestic"; // S-02
period: string; // "2018 ~ Present"
role?: string; // "WG11 Convenor"
projects: {
wg: string; // "WG12"
name: string; // "Multimedia Systems and Equipment for Metaverse (IEC 63614)"
documents: { title: string; ref: string; status: DocStatus; publishedAt?: string }[];
}[];
}
```
### 7.3 마이그레이션 절차
| ID | 요구사항 | 수준 |
| :--- | :--- | :-- |
| MG-01 | 추출은 **재현 가능한 스크립트**로 수행하고, 스크립트를 `scripts/` 하위에 커밋한다. 수작업 복사·붙여넣기 금지 | MUST |
| MG-02 | 추출 후 **건수 대조 검증**을 수행한다. 기대값: 국제 68 / 국내 80 / 특허 75 / 표준 문서 55 / 재학 16 / 졸업생 60 / 학기 약 20 | MUST |
| MG-03 | 한글·특수문자(`~`, `·`, `‧`, `o`, 전각 기호) 인코딩 손실이 없어야 한다. 레거시 파일에 **BOM(``)이 존재**하므로 제거한다 | MUST |
| MG-04 | 날짜는 전부 **ISO 8601**로 정규화한다 (`2026년 6월``2026-06`, `April 2026``2026-04`, `2023.12.13``2023-12-13`) | MUST |
| MG-05 | 레거시에 없는 정보를 **추정·창작하지 않는다.** 누락 필드는 optional로 두고 UI에서 조건부 렌더한다 (PR-01) | MUST |
| MG-06 | 이미지 자산은 실제 사용분만 `public/`으로 이관한다. 원본 총량 11.6MB(`image/` 3.4MB + `assets/` 8.2MB)를 무조건 복사하지 않는다 | MUST |
| MG-07 | 이관 이미지는 WebP 변환 및 `next/image` 적용 | SHOULD |
| MG-08 | 마이그레이션 완료 후 렌더 HTML 전수 스캔으로 **구 정체성 잔재 0건**을 확인한다 (검사어: `사물인터넷 표준`, `IoT Standards`, `MCM`, `메타버스 상호운용성`, `홍길동`, `placeholder`). 단, **논문·특허 제목에 포함된 도메인 용어는 실데이터이므로 예외**로 취급한다 | MUST |
> ⚠️ **MG-08의 중요한 예외**: 레거시 실적에는 `사물인터넷`, `메타버스`, `oneM2M` 등이 **논문 제목·표준 문서명으로 실재**한다(예: IEC 63614 *Multimedia Systems and Equipment for Metaverse*). 이는 **구 정체성 잔재가 아니라 보존해야 할 실데이터**다(PR-01). 잔재 검사는 **연구실 정체성 서술 영역**(Header/Footer/metadata/Home 소개문)에 한정해 적용한다.
---
## 8. 디자인 시스템 준수 규격
정본은 [`refer_landing_page/docs/DESIGN.md`](./refer_landing_page/docs/DESIGN.md)("Issue 01")이며, 본 절은 **위반 시 리뷰에서 반려되는 항목**만 발췌한다.
### 8.1 색상 토큰 (변경 금지)
| 토큰 | 값 | 용도 |
| :--- | :--- | :--- |
| `ink` / `ink-soft` / `ink-mute` | `#0A0A0A` / `#262420` / `#6B655B` | 본문·괘선 |
| `ivory` / `paper` / `line` | `#F5F1E8` / `#ECE6D6` / `#D8D1C0` | 종이 배경 / 인셋 / 헤어라인 |
| `vermillion` / `vermillion-dark` | `#D9342B` / `#A8231C` | 강조 (Hot) |
| `cobalt` / `cobalt-dark` | `#1B3A8A` / `#122863` | 강조 (Cool) |
**R-8.1** 신규 색 토큰 추가 금지. 색상 값 변경 시 `tailwind.config.ts``app/globals.css``:root` CSS 변수를 **반드시 함께** 수정한다.
**R-8.2** `brand` / `accent` 별칭은 레거시 호환 전용이며 신규 코드에서 사용 금지.
### 8.2 타이포그래피 · 유틸리티 클래스
**R-8.3** 지정 서체만 사용한다 — 영문 디스플레이 `Fraunces`(`font-display`), 국문 헤드라인 `Noto Serif KR`(`headline-ko`), 본문 산세리프 `Pretendard`/`Inter`(`font-sans`).
**R-8.4** 기존 유틸리티 클래스를 우선 사용한다: `.container-content`, `.display`, `.display-sm`, `.headline-ko`, `.kicker`, `.pull-quote`, `.reveal`. 동등 기능의 임의 클래스 신설 금지.
### 8.3 강조색 시맨틱 계약
**R-8.5** `vermillion` = Agent Engineering / Orchestration(홀수 항목), `cobalt` = MCP / A2A Protocol(짝수 항목). 목록 렌더 시 인덱스 기반 교차 배정을 따른다.
### 8.4 컴포넌트 재사용
**R-8.6** 기존 7종을 우선 재사용한다: `Header`, `Footer`, `PageHeader`, `SectionLabel`, `Reveal`, `Counter`, `Marquee`. 신규 컴포넌트는 기존 조합으로 구현 불가함을 리뷰에서 입증한 경우에만 추가한다.
**R-8.7** `PageHeader``index` prop은 IA 순서를 따른다 — Home 1 / Members 2 / Publications 3 / Lectures 4 / Standardization 5.
**R-8.8 [중요 제약]** `Counter`**정수 전용**이다. 내부에서 `Math.round()`로 표시값을 산출하므로 소수를 넘기면 반올림된 값이 표시되고, `prefers-reduced-motion` 경로에서는 반올림이 적용되지 않아 **모션 설정에 따라 값이 달라진다**. 소수 지표가 필요하면 `Counter`의 소수 대응 확장을 선행 과제로 처리한다.
**R-8.9** 그리드에서 `gap-px bg-line` 헤어라인 기법은 **테두리 없는 카드** 전용이다. `border border-ink`를 가진 카드에는 `bg-line`을 함께 걸지 않는다.
**R-8.10** 항목 수가 열 수로 나누어떨어지지 않는 그리드는 `col-span`으로 마지막 행을 채운다. 빈 트랙이 배경색 블록으로 노출되어서는 안 된다 (5개 항목 → `lg:grid-cols-6` 기준 2/2/2 · 3/3 조판이 확립된 패턴).
### 8.5 Next.js 렌더링 제약 *(v1.1 신설)*
> **출처**: 개발 팀장(Agy)의 기술 이의제기(Job `175860e4`)를 계기로, 본 프로젝트의 실제 환경(**Next.js 14.2.35**, `refer_landing_page/`)에서 4가지 구현 방식을 **직접 빌드해 실측**한 결과다. 추정이 아닌 재현된 관측치이며, 프로브 라우트는 검증 후 전량 삭제해 저장소에 남기지 않았다.
#### 실측 결과표
| # | 구현 방식 | 빌드 결과 | 정적 HTML에 담기는 내용 |
| :-: | :--- | :--- | :--- |
| 1 | Client Component에서 `useSearchParams()`**`<Suspense>` 없음** | ❌ **빌드 실패**<br>`useSearchParams() should be wrapped in a suspense boundary at page "/…"``Export encountered errors` | — |
| 2 | `useSearchParams()`**`<Suspense>` 있음** | ✅ **`○ (Static)`** | 경계 **안쪽**은 fallback만 저장됨.<br>경계 **바깥**의 서버 렌더 콘텐츠는 **정상 프리렌더됨** |
| 3 | Client `useState` + `window.history.pushState` | ✅ **`○ (Static)`** | 클라이언트 **초기 상태만** 저장됨 (`cat=all`). 공유 링크 진입 시 마운트 후 보정 → **비필터 상태가 먼저 표시됨** |
| 4 | Server Component의 **`searchParams` prop** 사용 | ⚠️ **`ƒ (Dynamic)`** — 정적 생성 탈락 | 매 요청 서버 렌더 |
| 5 | `[category]` 세그먼트 + `generateStaticParams()` | ✅ **`● (SSG)`** — 카테고리별 HTML **4개 생성** | **카테고리 값이 HTML에 그대로 포함됨** (`cat=patent`) |
#### 도출 규칙
**R-8.11 [금지]** Server Component 페이지에서 **`searchParams` prop을 사용하지 않는다.** 실측 #4에서 확인된 대로 해당 라우트가 `ƒ (Dynamic)`으로 전환되어 DM-03·NF-03을 직접 위반한다. **본 프로젝트에서 정적 생성을 깨뜨리는 유일하게 확인된 경로다.**
**R-8.12 [금지]** `useSearchParams()``<Suspense>` 경계 없이 호출하지 않는다. 실측 #1에서 프로덕션 빌드가 중단됨을 확인했다.
**R-8.13 [제한적 허용]** `useSearchParams()` + `<Suspense>` 조합은 정적 생성을 깨뜨리지 **않는다**(실측 #2에서 `○ Static` 유지 확인). 다만 경계 안쪽 콘텐츠가 정적 HTML에서 누락되므로, **필터 컨트롤 등 소규모 UI에 한해** 사용하고 레코드 목록에는 사용하지 않는다(R-8.15).
**R-8.14 [금지]** 라우팅 목적의 `window.history.pushState` 직접 호출을 하지 않는다. Next 라우터를 우회하므로 **뒤로/앞으로 가기 시 URL만 바뀌고 UI가 갱신되지 않으며**, 이를 보정하려면 `popstate` 리스너를 직접 등록·해제해야 한다. 카테고리 이동은 `next/link`로 처리한다(P-06a).
**R-8.15 [필수]** 대량 레코드(Publications 223건, Alumni 60명, 표준 문서 55건)는 **서버 컴포넌트에서 정적 HTML로 렌더**한다. 클라이언트 상태나 `<Suspense>` 경계 안쪽에 넣어 정적 문서에서 누락시키지 않는다. 실측 #2에서 **경계 바깥 서버 렌더 콘텐츠는 프리렌더된다**는 점이 확인되었으므로, 목록은 바깥에 두고 인터랙션만 안쪽에 두는 분리가 가능하다.
**R-8.16 [표기]** `generateStaticParams()`를 사용하는 라우트는 빌드 리포트에서 `○ (Static)`이 아니라 **`● (SSG)`** 로 표기된다. **두 표기 모두 "빌드 타임 정적 프리렌더"이며 요구사항을 충족한다.** 수용 기준의 판정은 §10 AC-17의 개정된 문구를 따른다.
---
## 9. 비기능 요구사항 (Non-Functional Requirements)
### 9.1 빌드 품질 게이트 — 병합 필수 조건
| ID | 요구사항 | 검증 명령 |
| :--- | :--- | :--- |
| NF-01 | ESLint 경고·오류 0건 | `npm run lint` |
| NF-02 | TypeScript 오류 0건 | `npx tsc --noEmit` |
| NF-03 *(v1.1 문구 정정)* | 프로덕션 빌드 성공. 전 라우트가 빌드 타임 정적 프리렌더(`○ Static` 또는 `● SSG`)이며 **`ƒ Dynamic` 라우트가 0건**이어야 한다 | `npm run build` |
| NF-04 | `package.json``package-lock.json` 정합. 의존성 추가 시 lockfile 동시 커밋 | `npm install --package-lock-only` 후 diff 확인 |
### 9.2 SEO
**R-9.1** 전 라우트에 고유한 `metadata.title` / `metadata.description`을 정의한다. 타이틀 템플릿은 현행 `%s | ANL · 경북대학교`를 유지한다.
**R-9.2** Open Graph(`og:title`, `og:description`, `og:image`, `og:type`, `og:locale=ko_KR`) 및 Twitter Card 메타를 추가한다.
**R-9.3** 시맨틱 HTML5 요소(`<main>`, `<article>`, `<section>`, `<nav>`, `<address>`, `<time>`)를 사용한다. 논문·특허 날짜는 `<time dateTime>`으로 표기한다.
**R-9.4** `app/sitemap.ts``app/robots.ts`를 추가한다.
**R-9.5** 지도교수 및 연구실 정보에 `Person` / `ResearchOrganization` JSON-LD 구조화 데이터를 삽입한다. *(SHOULD)*
### 9.3 접근성 (Accessibility)
**R-9.6** WCAG 2.1 AA 색 대비를 충족한다. 특히 `ink-mute`(`#6B655B`) on `ivory`(`#F5F1E8`) 조합은 소형 텍스트 사용 시 대비 실측 후 적용한다.
**R-9.7** 장식용 SVG·요소는 `aria-hidden`, 의미 전달 SVG는 `role="img"` + `aria-label`을 갖는다.
**R-9.8** `prefers-reduced-motion: reduce`에서 `Reveal`·`Counter`·`Marquee`의 모션이 비활성화되어야 한다(현행 구현 유지).
**R-9.9** 키보드 내비게이션으로 전 인터랙티브 요소(필터, 확장 토글, 링크)에 도달 가능하고 포커스 링이 보여야 한다.
**R-9.10** 필터·확장 토글은 `aria-expanded` / `aria-controls`를 갖는다.
### 9.4 성능
**R-9.11** 초기 렌더 DOM 노드 수를 제한한다. Publications 223건, Alumni 60명, Lectures 약 20학기는 **전량 즉시 렌더 금지**(P-07, M-06, L-03). 단 **PR-01에 따라 전 레코드가 사용자 조작으로 도달 가능**해야 한다.
**R-9.12** 라우트별 First Load JS는 현행 수준(공유 87.3 kB + 라우트별 1 kB 내외)에서 **+30 kB를 초과하지 않는다.**
**R-9.13** 신규 런타임 의존성 추가 시 사전 승인을 받는다. 현행 의존성은 `next` / `react` / `react-dom` 3종뿐이며 이 최소 구성을 유지한다.
### 9.5 반응형
**R-9.14** 지원 브레이크포인트는 Tailwind 기본값 `sm`(640px) / `lg`(1024px)이며, 검수 기준 뷰포트는 **360 / 768 / 1024 / 1440 px** 4종이다.
**R-9.15** 어느 뷰포트에서도 가로 스크롤이 발생하지 않아야 한다.
**R-9.16** 긴 국문 제목의 줄바꿈은 `break-keep`을 적용한다.
### 9.6 콘텐츠 무결성
**R-9.17 [최우선]** 사이트에 게시되는 모든 수치·실적·인물 정보는 `ISL-2026/` 실데이터 또는 `README.md` 정본에서 **출처를 추적할 수 있어야 한다.** 근거 없는 홍보성 지표 게시를 금지한다.
**R-9.18** 실명·실제 이메일이 게시되는 페이지이므로, 추정 정보를 사실처럼 표기하지 않는다. 불확실한 항목은 노출하지 않는다.
**R-9.19** 문서(`README.md`, `docs/DESIGN.md`)와 코드의 서술이 어긋나서는 안 된다. 마이그레이션이 미완인 영역은 문서에 **미완임을 명시**한다(문서가 코드보다 앞서 나가지 않는다).
---
## 10. 수용 기준 (Acceptance Criteria)
병합 승인은 아래 전 항목 충족 시에만 이루어진다.
**기능 (PR-02·PR-03)**
- [ ] AC-01 `/` 접근 시 Home이 정상 렌더되고 404가 발생하지 않는다
- [ ] AC-02 Home에 **연구실 소개 · 주요 연구 분야 · 오시는 길** 3개 블록이 모두 존재한다
- [ ] AC-03 `/intro` 접근 시 `/`로 308 리다이렉트된다
- [ ] AC-04 상단 탭 5종(Home/Members/Publications/Lectures/Standardization)이 전부 정상 라우팅된다
- [ ] AC-05 *(v1.1 개정)* Publications 4개 카테고리가 각각 고유 URL(`/publications/<slug>`)을 가지며, **해당 URL로 직접 진입했을 때 정적 HTML이 이미 해당 카테고리 상태를 담고 있다**(비필터 상태가 먼저 보였다가 바뀌는 현상이 없어야 한다)
- [ ] AC-06 Lectures가 학기별 그룹으로 렌더되고 최근 3개 학기가 기본 노출된다
**데이터 무손실 (PR-01)**
- [ ] AC-07 건수 대조 통과: 국제 68 / 국내 80 / 특허 75 / 표준 문서 44 / 재학 16 / 졸업 60 / 강의 45학기
- [ ] AC-08 Publications 223건 중 **어느 카테고리에도 배정되지 않은 레코드가 0건**이다
- [ ] AC-09 확장 UI 조작 시 졸업생 60명·전 학기 강의·전 논문이 모두 도달 가능하다
- [ ] AC-10 한글·특수문자 인코딩 손실 0건, BOM 제거 확인
- [ ] AC-11 날짜 전 항목 ISO 8601 정규화 확인
- [ ] AC-12 **연구실 정체성 서술 영역**에서 금지어 0건 (`사물인터넷 표준`, `IoT Standards`, `MCM`, `메타버스 상호운용성`, `placeholder`) — 논문·표준 제목의 도메인 용어는 예외(MG-08)
- [ ] AC-13 전 카운터 수치가 데이터 배열에서 도출됨을 코드로 확인
- [ ] AC-14 *(v1.1 신설)* JS를 비활성화한 상태에서 `/publications/<slug>` 문서에 해당 카테고리 레코드가 **전부 포함**되어 있다 (R-8.15 · PR-01)
**품질 게이트**
- [ ] AC-15 `npm run lint` 통과 (경고 0)
- [ ] AC-16 `npx tsc --noEmit` 통과
- [ ] AC-17 *(v1.1 개정)* `npm run build` 성공. 빌드 리포트에 **`ƒ (Dynamic)` 라우트가 0건**이고 전 라우트가 `○ (Static)` 또는 `● (SSG)`이다 — `●`도 빌드 타임 정적 프리렌더이므로 충족으로 판정한다 (§8.5 R-8.16)
- [ ] AC-18 First Load JS 증가분 ≤ 30 kB
- [ ] AC-19 4종 뷰포트에서 가로 스크롤 없음
- [ ] AC-20 신규 Tailwind 반응형 유틸리티가 빌드 CSS에 실제 생성됨을 확인 (JIT 누락 시 빌드는 성공하나 조판이 무너짐)
- [ ] AC-21 *(v1.1 신설)* `generateStaticParams()`로 카테고리별 정적 HTML 4개가 실제 생성됨을 `.next/server/app/publications/` 파일 목록으로 확인
- [ ] AC-22 *(v1.1 신설)* 소스 전역에 `searchParams` prop 사용·`useSearchParams()` 호출·라우팅 목적 `pushState` 호출이 **0건**임을 grep으로 확인 (§8.5 R-8.11·8.12·8.14)
**문서**
- [ ] AC-23 `README.md`·`docs/DESIGN.md` 서술이 구현 결과와 일치
- [ ] AC-24 마이그레이션 스크립트가 `scripts/`에 커밋됨
---
## 11. 구현 계획 (Implementation Plan)
### 11.1 단계별 작업 분해
| Phase | 작업 | 산출물 | 담당 | 선행 조건 |
| :-- | :--- | :--- | :--- | :--- |
| **P0** | D-01(Publications 카테고리 1·2 중첩) 확정 | 결정 기록 | GM ← 지도교수 | — |
| **P1** | 레거시 데이터 추출 스크립트 작성 및 `content/*.ts` 생성 | 4개 데이터 모듈 + 추출 스크립트 | Agy | P0 |
| **P1-R** | 건수·인코딩·날짜 정규화 교차 검증 (AC-07~11) | 검증 리포트 | Claude | P1 |
| **P2** | Home 신설(소개·연구 분야·오시는 길) + `/intro` 리다이렉트 + Header 내비 갱신 | `app/page.tsx`, `next.config.js` | Agy | P1-R |
| **P3** | Members / Lectures 실데이터 반영 | 2개 라우트 | Agy | P1-R |
| **P4** | Publications — `/publications` + `[category]` 세그먼트 4종 (§8.5 렌더링 제약 준수, 대량 데이터 처리 포함) | 1개 라우트 + 4개 세그먼트 | Agy | P1-R |
| **P5** | Standardization 3단 계층 뷰 | 1개 라우트 | Agy | P1-R |
| **P6** | 자산 이관·최적화 (MG-06·07) | `public/` | Agy | P2~P5 |
| **P7** | SEO·접근성·반응형 검수 (§9.2·9.3·9.5) | 검수 리포트 | Cline | P6 |
| **P8** | 최종 교차 리뷰 및 Verdict | 리뷰 리포트 | Claude | P7 |
**병렬 가능**: P3 / P4 / P5는 P1-R 완료 후 상호 독립이므로 동시 진행 가능하다. **P2는 `Header.tsx`를 수정하므로 P3~P5와 파일 충돌 가능성이 있어 먼저 완료할 것을 권장한다.**
### 11.2 잡 분할 권고
Publications(P4)는 데이터 규모(223건)와 필터·점진적 노출 요구로 인해 타 라우트 대비 작업량이 크다. **P4를 단독 잡으로 분리**하고 P3·P5를 묶는 편이 리뷰 단위로 적절하다.
### 11.3 리뷰 프로토콜
`.agents/MULTI_AGENT_RULES.md` §3에 따라 Phase 완료 시마다 리뷰 사이클을 돌린다. 리뷰어는 `NOT PASS`**사유와 검증된 개선 방향을 반드시 함께** 제시하고, 개발 팀장은 부당하다고 판단하는 지적에 대해 근거를 갖춰 반박한다.
---
## 12. 리스크 및 미결 결정 (Risks & Open Decisions)
### 12.1 미결 결정 등록부
| ID | 결정 사항 | 상태 | 기본값(잠정) | 영향 |
| :--- | :--- | :--- | :--- | :--- |
| **D-01** | Publications 카테고리 1(`International Conference`)과 2(`International Journal & Conference`)의 **범위 중첩** 해소 | 🔴 **미결** | 원문 라벨 그대로 사용 | P-01. IA-03·P-02 설계에 의해 **구현 차단 요인은 아니며**, 레지스트리 상수 1곳 수정으로 교체 가능. *(v1.1 보완: 라우트 세그먼트 방식에서도 슬러그를 레지스트리에서 도출하므로 동일하게 1곳 수정으로 끝난다. 단 슬러그 변경은 URL 변경을 수반하므로 **확정은 P4 착수 전이 바람직**하다.)* |
| **D-02** | 강의 과목명 한글 병기 여부 | 🟡 미결 | 영문 원문만 노출 (L-05) | Lectures 표기. 병기 시 지도교수 확인 필요 |
| **D-03** | 오시는 길의 지도 표현 방식 | 🟡 미결 | 주소 텍스트 + 캠퍼스 링크 (지도 임베드 없음) | H-16. 외부 지도 스크립트는 R-9.13 최소 의존성 원칙과 충돌 |
| **D-04** | 졸업생 기본 노출 범위(N년) | 🟢 위임 | 최근 3년 | M-06. 구현자 재량 |
| **D-05** | 연구실 GitHub 조직명(`github.com/iot-standards-laboratory`) 개명 여부 | 🟡 미결 | 현행 URL 유지 | 조직명이 구 정체성. 개명 시 기존 링크 무효화 위험 |
#### D-01 상세
PR-04에 명시된 4개 라벨 중 **1번과 2번의 범위가 논리적으로 중첩**된다. `International Journal & Conference`가 국제 저널과 국제 학술대회를 모두 포함한다면, `International Conference`는 그 부분집합이 되어 동일 레코드가 두 카테고리에 해당하게 된다.
**레거시 데이터 구조와의 대조**:
| 레거시 파일 | 실제 내용 | PR-04 라벨과의 대응 |
| :--- | :--- | :--- |
| `paper-international.html` | 국제 저널 67 + 국제 학술대회 1 = 68 | `International Journal & Conference`에 정확히 대응 |
| `paper-domestic.html` | 국내 논문 80 (KCI 48) | `Domestic Journal & Conference`에 정확히 대응 |
| `patent.html` | 특허 75 | `Patent`에 정확히 대응 |
| — | **대응 원본 없음** | `International Conference` ← ⚠️ |
**권고안 (A안)** — 국제 실적을 저널/학술대회로 분리:
`International Journal` / `International Conference` / `Domestic Journal & Conference` / `Patent`
→ 1번 라벨이 `Journal`의 오기라는 가정. 레거시 국제 목록을 게재처로 분리하면 저널 67 / 학술대회 1이 되어 **학술대회 카테고리가 1건으로 빈약해지는 점**을 함께 확인해야 한다.
**대안 (B안)** — 원문 라벨을 그대로 두고 1번을 국내외 통합 학술대회 카테고리로 재정의:
`International Conference`에 미수록 학술대회 논문을 지도교수로부터 확보해 채운다.
**리뷰어 판단**: 어느 안이든 **P-02의 레지스트리 설계로 인해 구현 착수를 막지 않는다.** P1 단계에서는 레거시 3개 원본을 그대로 3개 카테고리에 적재하고, D-01 확정 후 4번째 카테고리 분리를 적용하는 순서를 권고한다. 단 **P-03(레코드 무손실)** 은 어느 안에서도 반드시 지켜져야 한다.
### 12.2 리스크
| ID | 리스크 | 영향 | 완화 방안 |
| :--- | :--- | :--- | :--- |
| R-01 | 레거시 HTML의 비정형 마크업으로 추출 정확도 저하 | **PR-01 위반** (데이터 누락·오배치) | MG-01 스크립트화 + MG-02 건수 대조 + P1-R 독립 검증 |
| R-02 | 223건 일괄 렌더로 초기 로드 지연 | 성능 저하 | P-07 점진적 노출, R-9.11·9.12 예산 명시 |
| R-03 | Tailwind JIT이 동적 조립 클래스를 인식하지 못함 | **빌드는 성공하나 조판이 조용히 붕괴** | 클래스는 완전한 문자열 리터럴로 작성. AC-20으로 빌드 CSS 실측 검증 |
| R-08 *(v1.1 신설)* | Publications 필터 구현이 정적 생성을 깨뜨림 | `ƒ Dynamic` 전환 → DM-03·NF-03 위반, 또는 빌드 중단 | §8.5 실측 규칙 R-8.11~8.16 준수. AC-17·AC-21·AC-22로 검증 |
| R-09 *(v1.1 신설)* | 레코드 목록이 클라이언트 렌더로 밀려 정적 문서에서 누락 | **PR-01 실질 위반** — 크롤러·JS 미실행 환경에서 실적이 보이지 않음 | R-8.15 서버 렌더 강제. AC-14로 JS 비활성 검증 |
| R-04 | 실명·실적 데이터 오기재 | 연구실 신뢰도 훼손 | R-9.17·9.18 무결성 원칙, MG-05 창작 금지, 지도교수 최종 확인 |
| R-05 | 잔재 검사(MG-08)가 논문 제목의 도메인 용어까지 오검출 | **실데이터를 잔재로 오인해 삭제** → PR-01 위반 | MG-08 예외 규정을 검사 스크립트에 반영. 검사 범위를 정체성 서술 영역으로 한정 |
| R-06 | 문서-코드 불일치 재발 | 후속 작업자 혼선 | R-9.19. 미완 영역은 문서에 미완으로 표기 |
| R-07 | P2(Header 수정)와 P3~P5 병렬 진행 시 충돌 | 머지 충돌 | §11.1 주석대로 P2 선행 완료 |
---
## 13. 부록: 레거시 데이터 인벤토리 (실측)
`ISL-2026/` 기준, 2026-07-30 파싱 실측치.
| 원본 파일 | 레코드 수 | 비고 |
| :--- | ---: | :--- |
| `member.html` | 재학 **16** / 졸업 **60** | 재학: 교수 1, Ph.D. 1, Ph.D. Candidate 4, Ph.D. Student 5, M.S. Candidate 3, M.S. Student 2. 졸업생 2007~2026 |
| `paper-international.html` | **68** | 저널 67 + 학술대회 1. 최신 2026-04(IEEE TNSM), 최고(最古) 1995 |
| `paper-domestic.html` | **80** | KCI 등재 표시 48건. 최신 2026-06 |
| `patent.html` | **75** | 국내 출원 다수 + US 출원 일부. 최신 출원 2025-12-16 |
| `standard.html` | 기구 **6** / 문서 **약 55** | 국제 5개 기구 + 국내 1개(TTA/PG425). 2000~현재 |
| `lecture.html` | **약 20개 학기** | 2016 Fall ~ 2026 Spring |
| `index.html` | 연구분야 3종 | `IoT Standards`, `CCIS`, `VLC-IoT`**폐기 대상**(5대 기둥으로 교체, R-5.3) |
| `introduction.html` | 연구 주제 13종 | 구 연구 분야 상세 — **폐기 대상**(R-5.3) |
| `image/`, `assets/` | 11.6 MB | `image/` 3.4 MB + `assets/` 8.2 MB. 선별 이관(MG-06) |
**연락처·소재지 (H-13~H-15 원천)**
- 소재지: **경북대학교 IT대학 5호관(415동) 527호** *(레거시 `index.html`에 HTML 주석 처리된 상태로 존재 — 복원 필요)*
- 소속: School of Computer Science and Engineering, Kyungpook National University
- 지도교수 이메일: `sjkoh@knu.ac.kr`
- 연구실 GitHub: `https://github.com/iot-standards-laboratory` *(→ D-05)*
- 지도교수 GitHub: `https://github.com/sjkoh12`
- 기관 링크: KNU `http://www.knu.ac.kr/` · 컴퓨터학부 `http://cse.knu.ac.kr/` · IT대학 `http://it.knu.ac.kr/`
- 전화·팩스: **레거시에 없음** (H-14에 따라 창작 금지)
---
## 14. 변경 이력
| 버전 | 일자 | 작성자 | 내용 |
| :--- | :--- | :--- | :--- |
| 1.0 | 2026-07-30 | claude (planner) | 최초 작성. 사용자 원본 요구사항(§1)을 정본으로 확장. Job `4148350e` |
| 1.1 | 2026-07-30 | claude (planner) | 개발 팀장(Agy) 기술 이의제기(Job `175860e4`) 반영. **§8.5 Next.js 렌더링 제약 신설**(실측 5종). IA-03을 라우트 세그먼트 방식으로 개정, P-06 개정 + P-06a·P-07a 신설, DM-03·NF-03·AC-05·AC-16 문구 정정, AC-22~24 및 R-08·R-09 신설. Job `45d05868` |
| 1.2 | 2026-07-30 | agy (creator) | 교차 리뷰 리포트(Job `3820bdc8`) 결함 피드백 전면 반영. **F1 §4.1 사이트맵 쿼리 표기를 라우트 세그먼트(`/publications/<slug>`)로 갱신**, **F2 §2.1·§2.2 연구 실적 수치 279건 → 223건 정정**, **F3 §10 수용 기준 AC-14~24 순서 및 그룹핑 정돈**. Job `f3e09780` |
| 1.3 | 2026-07-30 | agy (creator) | 교차 리뷰 리포트(Job `60c92d3a`) 결함 피드백 전면 반영. **G-1 417행 R-8.16 참조 AC-16 → AC-17 정정**, **G-4 575행 R-03 참조 AC-19 → AC-20 정정**, **G-2 576행 R-08 참조 AC-16/22/23 → AC-17/21/22 정정**, **G-3 577행 R-09 참조 AC-24 → AC-14 정정**. Job `a535ce20` |
| 1.4 | 2026-07-30 | agy (creator) | 구현 교차 리뷰 리포트(Job `777c3ab8`) 피드백 전면 반영. **I1 전 파서 ISO 8601 정규화 100%**, **I2 Footer 주소/이메일 실주소 교체**, **I3 README 라우트 맵 갱신**, **I4 verify_counts.py 엄격 게이트로 강화 및 실측 수치(표준 44, 학기 45) 정정**, **I5 __pycache__ 제거 및 .gitignore 차단**, **I6/I7 Home 카운터 및 5대 기둥 영문 라벨 정본 정렬**. Job `a54723ce` |