621 lines
52 KiB
Markdown
621 lines
52 KiB
Markdown
# 📐 요구사항 명세서 (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. 콘텐츠 정본: 5대 핵심 연구 기둥
|
||
|
||
PR-03의 "연구실 주요 연구 분야 소개"에 해당하는 콘텐츠다. `README.md` §2를 **정본(canonical)** 으로 하며, UI의 모든 연구 서술은 여기서 파생되어야 한다. 어휘를 임의로 변형하지 않는다.
|
||
|
||
| # | 기둥 (KO) | 기둥 (EN) | 핵심 키워드 | 강조색 |
|
||
| :-: | :--- | :--- | :--- | :--- |
|
||
| 1 | AI 에이전트 3대 핵심 엔지니어링 | Agent Core Engineering | Prompt / Context / Harness Engineering | `vermillion` |
|
||
| 2 | AI Agent 기능 확장 프로토콜 | Extensibility & Protocol | MCP, SKILL, CLI 코딩 에이전트 | `cobalt` |
|
||
| 3 | 멀티 에이전트 협업 및 오케스트레이션 | Multi-Agent Systems | HERDR, crewAI, LangGraph | `vermillion` |
|
||
| 4 | 에이전트 상호운용성 개방형 표준 | Interoperability Standards | A2A, ACP, Agent Card | `cobalt` |
|
||
| 5 | AIoT & 고성능 통신 백본 | High-Performance Backbone | gRPC/QUIC, Protobuf, MQTT/CoAP | `vermillion` |
|
||
|
||
**R-5.1** 강조색은 §8.3의 홀수/짝수 규칙을 따른다. 기둥 순서를 변경하면 색 배정도 함께 갱신해야 한다.
|
||
**R-5.2** 5대 기둥 서술 전문(全文)은 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 풀쿼트 → 5대 연구 기둥 → Focus Areas)을 이관한다 | MUST |
|
||
| H-02 | 커버 히어로는 현행 확정 카피를 유지한다: 킥커 `경북대학교 컴퓨터학부 · AI Agent Networking Lab (ANL)`, 헤드라인 `에이전트 네트워크의 / 미래를 짓다`, 디스플레이 `Agents / in Motion` | MUST |
|
||
| H-03 | **[연구실 소개]** 연구실 개요·지도교수·비전을 서술하는 블록을 배치하고, 상세는 `/members`로 연결한다 | MUST |
|
||
| H-04 | **[주요 연구 분야]** §5의 5대 연구 기둥 전문을 3+2 매거진 조판으로 노출한다 (현행 구현 유지) | MUST |
|
||
| H-05 | **[오시는 길]** 아래 §6.1.1 요구사항을 충족하는 블록을 배치한다 | MUST |
|
||
| H-06 | 지표 카운터는 **데이터 배열에서 도출된 값**만 사용한다. 근거 없는 홍보성 수치(가동률·만족도 등) 게시 금지 | MUST |
|
||
| H-07 | H-06의 권장 지표: `연구 기둥` = 5, `누적 연구 실적` = 논문+특허 합계(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` |
|