-
-
-
- Playwright Test Report
-
-
-
-
-
-
-
-data:application/zip;base64,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
\ No newline at end of file
diff --git a/apps/cs/test-results/.last-run.json b/apps/cs/test-results/.last-run.json
deleted file mode 100644
index 00a2a78fa..000000000
--- a/apps/cs/test-results/.last-run.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "status": "failed",
- "failedTests": [
- "7cf08488f825bec651e1-31e606ad69300bb6fcd0",
- "7cf08488f825bec651e1-9eda3d84416d28db938c",
- "7cf08488f825bec651e1-bbbe7f77241a3995edcb"
- ]
-}
\ No newline at end of file
diff --git a/apps/cs/tests/(post)/faq/faq.spec.ts b/apps/cs/tests/(post)/faq/faq.spec.ts
new file mode 100644
index 000000000..4e3ec4cdb
--- /dev/null
+++ b/apps/cs/tests/(post)/faq/faq.spec.ts
@@ -0,0 +1,13 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("FAQ 페이지 E2E 테스트", () => {
+ test.beforeEach(async ({ page }) => {
+ // 임시 URL. 실제 라우팅 경로에 맞게 수정 필요
+ await page.goto("/post/faq");
+ });
+
+ test("1. FAQ 목록 화면이 정상적으로 렌더링되는지 확인", async ({ page }) => {
+ // TODO: 실제 렌더링되는 요소에 맞게 selector 및 텍스트 수정 필요
+ await expect(page.locator("body")).toBeVisible();
+ });
+});
diff --git a/apps/cs/tests/(post)/image/image.spec.ts b/apps/cs/tests/(post)/image/image.spec.ts
new file mode 100644
index 000000000..435cfa6b4
--- /dev/null
+++ b/apps/cs/tests/(post)/image/image.spec.ts
@@ -0,0 +1,12 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("Image 게시판 페이지 E2E 테스트", () => {
+ test.beforeEach(async ({ page }) => {
+ // 임시 URL. 실제 라우팅 경로에 맞게 수정 필요
+ await page.goto("/post/image");
+ });
+
+ test("1. 이미지 목록 화면이 정상적으로 렌더링되는지 확인", async ({ page }) => {
+ await expect(page.locator("body")).toBeVisible();
+ });
+});
diff --git a/apps/cs/tests/(post)/movie/movie.spec.ts b/apps/cs/tests/(post)/movie/movie.spec.ts
new file mode 100644
index 000000000..a549021a7
--- /dev/null
+++ b/apps/cs/tests/(post)/movie/movie.spec.ts
@@ -0,0 +1,12 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("Movie 게시판 페이지 E2E 테스트", () => {
+ test.beforeEach(async ({ page }) => {
+ // 임시 URL. 실제 라우팅 경로에 맞게 수정 필요
+ await page.goto("/post/movie");
+ });
+
+ test("1. 동영상 목록 화면이 정상적으로 렌더링되는지 확인", async ({ page }) => {
+ await expect(page.locator("body")).toBeVisible();
+ });
+});
diff --git a/apps/cs/tests/(post)/normal/normal.spec.ts b/apps/cs/tests/(post)/normal/normal.spec.ts
new file mode 100644
index 000000000..2448576ca
--- /dev/null
+++ b/apps/cs/tests/(post)/normal/normal.spec.ts
@@ -0,0 +1,12 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("Normal 게시판 페이지 E2E 테스트", () => {
+ test.beforeEach(async ({ page }) => {
+ // 임시 URL. 실제 라우팅 경로에 맞게 수정 필요
+ await page.goto("/post/normal");
+ });
+
+ test("1. 일반 게시판 목록 화면이 정상적으로 렌더링되는지 확인", async ({ page }) => {
+ await expect(page.locator("body")).toBeVisible();
+ });
+});
diff --git a/apps/cs/tests/(post)/notice/notice.spec.ts b/apps/cs/tests/(post)/notice/notice.spec.ts
new file mode 100644
index 000000000..2355b97ac
--- /dev/null
+++ b/apps/cs/tests/(post)/notice/notice.spec.ts
@@ -0,0 +1,12 @@
+import { test, expect } from "@playwright/test";
+
+test.describe("Notice 게시판 페이지 E2E 테스트", () => {
+ test.beforeEach(async ({ page }) => {
+ // 임시 URL. 실제 라우팅 경로에 맞게 수정 필요
+ await page.goto("/post/notice");
+ });
+
+ test("1. 공지사항 목록 화면이 정상적으로 렌더링되는지 확인", async ({ page }) => {
+ await expect(page.locator("body")).toBeVisible();
+ });
+});
diff --git a/docs/02.multi-domain-jwt.md b/docs/02.multi-domain-jwt.md
new file mode 100644
index 000000000..4d7dc71d4
--- /dev/null
+++ b/docs/02.multi-domain-jwt.md
@@ -0,0 +1,154 @@
+# Multi-Domain JWT 토큰 공유 분석
+
+## 현재 구조 진단
+
+### 도메인 구성
+| 앱 | 도메인 | 포트(로컬) |
+|----|--------|-----------|
+| cs | `cs.onasys.co.kr` | 3000 |
+| as | `as.onasys.co.kr` | 3003 |
+| backend | 공통 1개 | 8000 |
+
+### 핵심 문제
+
+브라우저 쿠키는 **Same-Origin Policy** 적용: `cs.onasys.co.kr`에서 설정한 쿠키는 `as.onasys.co.kr`에서 **읽을 수 없음**.
+
+현재 두 앱 모두 `NEXT_PUBLIC_COOKIE_DOMAIN` 환경변수가 **설정되지 않음** → 쿠키 `domain` 속성 없음 → 각 앱이 자기 도메인에만 쿠키 저장.
+
+### 코드 흐름 분석
+
+```
+authConfig.cookieDomain = process.env.NEXT_PUBLIC_COOKIE_DOMAIN (현재 undefined)
+ ↓
+token-manager.ts: getCookieDomain() → undefined 반환
+ ↓
+setCookie(key, value, { domain: undefined, ... }) ← domain 없이 저장
+ ↓
+결과: cs.onasys.co.kr 쿠키 ≠ as.onasys.co.kr 쿠키 (공유 불가)
+```
+
+---
+
+## 해결 방법: Parent Domain Cookie
+
+### 원리
+쿠키 `Domain` 속성을 **부모 도메인**으로 설정하면 모든 서브도메인이 공유:
+
+```
+Domain=.onasys.co.kr
+ → cs.onasys.co.kr ✅ 읽기/쓰기 가능
+ → as.onasys.co.kr ✅ 읽기/쓰기 가능
+```
+
+---
+
+## 구현 방법
+
+### Step 1: 환경변수 추가
+
+**apps/cs/.env.production** (또는 `.env.local` 배포용)
+```env
+NEXT_PUBLIC_COOKIE_DOMAIN=.onasys.co.kr
+```
+
+**apps/as/.env.production**
+```env
+NEXT_PUBLIC_COOKIE_DOMAIN=.onasys.co.kr
+```
+
+> [!IMPORTANT]
+> 반드시 앞에 `.` (점)을 붙여야 서브도메인 전체에 적용됩니다.
+
+### Step 2: 코드 변경 불필요
+
+`token-manager.ts`의 `getCookieDomain()`이 이미 `config.cookieDomain`을 사용하고 있으므로, 환경변수만 설정하면 됩니다.
+
+```ts
+// packages/common/auth/token-manager.ts (현재 코드)
+const getCookieDomain = (): string | undefined => {
+ if (typeof window === "undefined") return undefined;
+ if (config.cookieDomain) return config.cookieDomain; // ← 이미 준비됨
+ return undefined;
+};
+```
+
+### Step 3: 백엔드 CORS 확인
+
+백엔드가 `credentials: true`와 함께 올바른 `Access-Control-Allow-Origin`을 반환하는지 확인:
+
+```
+Access-Control-Allow-Origin: https://cs.onasys.co.kr (또는 as.onasys.co.kr)
+Access-Control-Allow-Credentials: true
+```
+
+> [!WARNING]
+> `Access-Control-Allow-Origin: *` 와 `credentials: true`는 동시에 사용 불가.
+> 명시적 도메인 또는 동적 오리진 허용 필요.
+
+---
+
+## SameSite 주의사항
+
+현재 토큰 매니저 설정:
+```ts
+setCookie(key, value, {
+ secure: isHttps,
+ sameSite: "lax", // ← 서브도메인 간 이동 시 쿠키 전송됨 (OK)
+ domain,
+ path: "/",
+});
+```
+
+- `sameSite: "lax"` → 서브도메인 간 네비게이션에서 쿠키 전송 **가능** ✅
+- `sameSite: "strict"` → 다른 도메인에서의 요청에 쿠키 미전송 ❌
+- `sameSite: "none"` + `secure: true` → 크로스사이트 iframe 등에서도 전송 (필요 시)
+
+배포 환경 HTTPS 사용 시 `secure: true` 자동 적용되므로 문제 없음.
+
+---
+
+## 세션 공유 흐름 (적용 후)
+
+```
+사용자가 cs.onasys.co.kr 에서 로그인
+ ↓
+setCookie("access-token", jwt, { domain: ".onasys.co.kr" })
+ ↓
+브라우저: .onasys.co.kr 쿠키 저장
+ ↓
+사용자가 as.onasys.co.kr 으로 이동
+ ↓
+브라우저가 자동으로 ".onasys.co.kr" 쿠키 전송
+ ↓
+as 앱의 미들웨어: req.cookies.get("access-token") ✅ 정상 읽힘
+ ↓
+백엔드 API 호출 시 Authorization 헤더에 토큰 포함
+```
+
+---
+
+## 추가 고려사항
+
+### 로그아웃 처리
+한 앱에서 로그아웃 시 **도메인 지정 쿠키 삭제** 필요:
+```ts
+// removeToken 에서 domain 이 자동 적용됨 (현재 코드 OK)
+removeCookie(key, { domain: ".onasys.co.kr", path: "/" });
+```
+
+### 토큰 갱신 (Refresh Token)
+`refresh-token` 쿠키도 같은 `domain` 설정 적용 → 두 앱 모두 silent refresh 가능.
+
+### 로컬 개발 환경
+로컬에서는 `localhost`가 서브도메인을 지원하지 않으므로 별도 처리 불필요 (`.env.local`에는 설정하지 않음).
+
+---
+
+## 최소 변경 요약
+
+| 위치 | 변경 내용 |
+|------|----------|
+| `apps/cs/.env.production` | `NEXT_PUBLIC_COOKIE_DOMAIN=.onasys.co.kr` 추가 |
+| `apps/as/.env.production` | `NEXT_PUBLIC_COOKIE_DOMAIN=.onasys.co.kr` 추가 |
+| 소스 코드 | **변경 없음** (이미 cookieDomain 지원 구현됨) |
+| 백엔드 | CORS `Access-Control-Allow-Origin` 명시적 도메인 설정 확인 |
diff --git a/docs/as/01.tech-stack.md b/docs/as/01.tech-stack.md
new file mode 100644
index 000000000..9b3d910ae
--- /dev/null
+++ b/docs/as/01.tech-stack.md
@@ -0,0 +1,84 @@
+# AS 프로젝트 기술 스택 분석 (Tech Stack)
+
+본 문서는 `as` (Administrative Support / 전자결재 및 공공행정 지원 시스템) 애플리케이션의 핵심 프로그래밍 스택과 아키텍처 구조를 분석하여 정리한 문서입니다. 본 프로젝트는 Next.js 15와 FSD(Feature Sliced Design) 아키텍처를 도입하여 복잡한 비즈니스 로직을 격리하고 모노레포 환경에서 유연하게 패키지를 재사용하고 있습니다.
+
+---
+
+## 1. Core Framework & Runtime
+
+* **Next.js 15.5.18**:
+ * **App Router** 구조를 기본으로 채택하여 파일 기반 라우팅, 서버 컴포넌트(RSC), 미들웨어 등을 적극적으로 활용합니다.
+ * `src/pages`와 `app/` 라우터를 조합하여 Next.js의 진입점(Layout, Page)은 최소화하고 비즈니스 모듈은 FSD 아키텍처 계층으로 격리하는 하이브리드 구성을 취하고 있습니다.
+* **React 19 & TypeScript**:
+ * 최신 React의 강력한 타입 지원 기능을 활용하여 컴포넌트와 비즈니스 데이터의 정적 타입을 보장합니다.
+* **pnpm Monorepo**:
+ * `workspace:*` 의존성 참조 형식을 사용하여 동일 레포지토리 내의 공통 모듈(`@common/auth`, `@common/components`, `@common/network`, `@common/assets`)을 패키지 형태로 안전하게 참조합니다.
+
+---
+
+## 2. Styling (CSS & Design System)
+
+* **Tailwind CSS (v3.4)**:
+ * 유틸리티 퍼스트 CSS 프레임워크를 기반으로 하며, `postcss` 및 `autoprefixer`를 활용하여 스타일을 구성합니다.
+* **Class Variance Authority (CVA)**:
+ * 컴포넌트의 Variants(버튼 크기, 활성/비활성 색상, 디자인 테마 등)를 선언적이고 타입 안전하게 관리하기 위해 사용됩니다.
+* **Lucide React**:
+ * 통합적이고 일관된 아이콘 팩으로 화면 요소를 설계할 때 기본 아이콘 라이브러리로 활용됩니다.
+
+---
+
+## 3. State Management (상태 관리)
+
+애플리케이션 내의 상태는 성격에 따라 3가지 레이어로 명확히 구분되어 관리됩니다.
+
+### ① 전역 서버 상태 (Global Server State)
+* **TanStack Query v5 (React Query)**:
+ * 서버 데이터 fetch, cache, sync, update 등을 담당합니다.
+ * 커스텀 훅 패턴을 활용하여 비즈니스 데이터 처리부와 UI 컴포넌트를 분리합니다.
+ * `ReactQueryDevtools`를 탑재하여 개발 단계에서 쿼리 캐시 상태를 실시간 모니터링합니다.
+
+### ② 전역 클라이언트 상태 (Global Client State)
+* **Zustand (Vanilla)**:
+ * `zustand/vanilla`의 `createStore`를 활용하여 글로벌 상태(사용자 정보, 알림창, 사이드바 메뉴 등)를 관리합니다.
+ * **Next.js SSR 친화적 상태 공유 패턴**:
+ Next.js의 서버 사이드 렌더링(SSR) 시 싱글톤 상태 오염 문제를 해결하기 위해, React Context (`StoreProvider`, `StoreContext`)와 `useRef`를 조합하여 요청 단위별 독립된 스토어 인스턴스를 생성하고 훅(`useUserStore` 등)을 통해 구독합니다.
+
+### ③ 폼 상태 관리 및 검증 (Form State)
+* **React Hook Form & Zod**:
+ * 결재 및 행정 신청 폼이 다수 존재하는 시스템 특성상, 입력 폼의 상태 변화를 비제어 컴포넌트 기반으로 최적화하여 렌더링 성능을 개선합니다.
+ * `zod` 스키마 빌더를 이용해 폼 유효성 검증 규칙을 직관적으로 선언하고 `@hookform/resolvers`로 바인딩합니다.
+
+---
+
+## 4. Components & Libraries
+
+* **Radix UI**:
+ * `@radix-ui/react-tooltip` 등 마크업 구조와 접근성이 보장된 Headless UI 라이브러리를 차용하여 스타일 종속성 없이 접근성 높은 컴포넌트를 구성합니다.
+* **TanStack Table v8 (React Table)**:
+ * 다양한 필터링, 정렬, 페이지네이션 요구사항이 존재하는 목록 화면을 처리하기 위해 사용되는 Headless Table 라이브러리입니다.
+* **dnd-kit (`@dnd-kit/core`, `@dnd-kit/sortable`)**:
+ * 결재선 지정 화면 등에서 마우스 및 터치 인터랙션을 이용한 행 정렬(Drag & Drop)을 매끄럽게 처리하기 위해 도입되었습니다.
+
+---
+
+## 5. Network & Utils
+
+* **Axios**:
+ * HTTP 클라이언트 라이브러리로, 인터셉터(Interceptor)를 통해 공통 인증 헤더 관리, 토큰 재발급, 에러 공통 처리를 수행합니다.
+* **Tus JS Client**:
+ * 대용량 및 첨부 파일 업로드 시 네트워크 단절 상황에 대응할 수 있도록 Resumable(이어올리기) 프로토콜인 **Tus Protocol**을 사용하여 안정적인 업로드를 지원합니다.
+* **Day.js**:
+ * 표준화된 시간 포맷팅 및 날짜 연산을 가볍고 빠르게 처리합니다.
+* **JS Cookie**:
+ * 클라이언트 브라우저의 쿠키 설정 및 조회에 활용됩니다.
+
+---
+
+## 6. Monitoring & Linting (품질 관리)
+
+* **OpenTelemetry**:
+ * 클라이언트 및 서버 측의 네트워크 지연 시간, 주요 사용자 인터랙션 트레이싱을 위해 APM 수집 어댑터가 구현되어 있습니다 (`instrumentation-client.ts`, `instrumentation.ts`).
+* **Sentry (`@sentry/nextjs`)**:
+ * 프로덕션 환경에서의 실시간 에러 추적 및 분석을 담당합니다.
+* **Steiger**:
+ * FSD 아키텍처 패턴을 물리적인 파일 경로 분석을 통해 규제하는 정적 분석 도구입니다. 레이어 간 비정상적인 의존성(예: 하위 레이어가 상위 레이어를 참조하는 역참조 등)을 빌드타임/린트 타임에 강력하게 통제합니다.
diff --git a/docs/as/02.curriculum-beginner.md b/docs/as/02.curriculum-beginner.md
new file mode 100644
index 000000000..46bd54154
--- /dev/null
+++ b/docs/as/02.curriculum-beginner.md
@@ -0,0 +1,167 @@
+# AS 프로젝트 교육 자료: 초급 과정 (Beginner Course)
+
+**대상**: React 및 Next.js 기초를 이해하고 있으며, AS 프로젝트에 신규 참여하여 UI 컴포넌트 및 기본 화면 단위를 구현해야 하는 개발자
+**목표**: FSD 아키텍처 규칙을 준수하며 Tailwind CSS와 CVA를 사용해 UI를 개발하고, React Hook Form과 Zod로 폼 컴포넌트를 설계할 수 있다.
+
+---
+
+## 1. Feature-Sliced Design (FSD) 아키텍처 기초
+
+FSD는 기능 기반의 디렉토리 설계 규칙으로, 코드의 유지보수성과 확장성을 극대화하기 위해 탄생한 표준 스펙입니다.
+
+### ① FSD의 3단계 계층 구조
+1. **Layers (레이어)**: 가장 큰 단위로, 최상단에서 최하단까지 엄격한 단방향 의존성 규칙을 가집니다.
+ * `app`: 애플리케이션의 설정, Providers, 글로벌 스타일을 정의합니다. (의존성 가장 높음)
+ * `pages`: 실제 라우팅 단위 화면을 구성합니다.
+ * `widgets`: 독립적인 대형 UI 블록(예: 헤더, 복합 사이드바, 특정 복합 그리드 등)을 정의합니다.
+ * `features`: 사용자의 행동 및 비즈니스 기능(예: `auth-login`, `search-box`, `add-comment`)을 다룹니다.
+ * `entities`: 도메인 단위의 비즈니스 개념(예: `user`, `approval-line`, `budget`)과 그에 대한 단순 조회 UI, API, 상태를 정의합니다.
+ * `shared`: 특정 도메인에 종속되지 않는 범용 재사용 기술 자원(UI Kit, API Client, Util 라이브러리)을 모아둡니다. (의존성 가장 낮음)
+2. **Slices (슬라이스)**: 도메인에 따른 수직적 분리 단위입니다 (예: `entities/user`, `features/auth-login`).
+3. **Segments (세그먼트)**: 기술적 역할에 따른 물리적 파일 분류입니다.
+ * `ui/`: React 컴포넌트 파일들
+ * `model/`: 스토어 상태, 데이터 타입, 스키마 등
+ * `api/`: 서버 통신용 Axios 함수 및 쿼리 훅
+ * `lib/`: 내부 Helper 유틸 함수
+
+### ② FSD 수직적 수평적 import 규칙 (중요!)
+* **규칙 1 (수직적 규칙)**: 레이어는 자신보다 **하위 레이어만 import**할 수 있습니다. 상위 레이어를 import하는 것은 엄격히 금지됩니다. (예: `features`는 `entities`를 import할 수 있으나, `entities`가 `features`나 `widgets`를 import할 수 없음)
+* **규칙 2 (수평적 규칙)**: 동일한 레이어 내부의 다른 슬라이스끼리는 **서로 직접 import할 수 없습니다**. (예: `features/auth-login`에서 `features/post-create`를 import할 수 없음. 이 경우에는 상위 레이어인 `pages`나 `widgets`에서 두 슬라이스를 조합해야 함)
+* **규칙 3 (Public API)**: 각 슬라이스 외부에서는 반드시 슬라이스 루트의 `index.ts` (Public API)를 거쳐서만 모듈을 가져와야 합니다. 슬라이스 내부 폴더 구조에 직접 접근하는 행위(`import ... from '@/features/auth/ui/LoginForm'`)는 린트 에러(`Steiger` 경고)를 발생시킵니다.
+
+---
+
+## 2. Tailwind CSS & Class Variance Authority (CVA) 실무
+
+AS 프로젝트는 유틸리티 클래스 중복을 최소화하고, 컴포넌트의 디자인 변형(Variants)을 안전하게 관리하기 위해 **CVA**를 사용합니다.
+
+### CVA 활용 예시 (`shared/ui/button.tsx`)
+```typescript
+import { cva, type VariantProps } from "class-variance-authority";
+import { cn } from "@/shared/lib"; // clsx와 tailwind-merge 조합 유틸
+
+export const buttonVariants = cva(
+ "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-slate-400 disabled:opacity-50",
+ {
+ variants: {
+ variant: {
+ default: "bg-slate-900 text-white hover:bg-slate-800",
+ destructive: "bg-red-500 text-white hover:bg-red-600",
+ outline: "border border-slate-200 bg-transparent hover:bg-slate-100",
+ ghost: "hover:bg-slate-100 hover:text-slate-950",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {}
+
+export function Button({ className, variant, size, ...props }: ButtonProps) {
+ return (
+
+ );
+}
+```
+
+---
+
+## 3. React Hook Form & Zod를 활용한 폼 검증
+
+AS 프로젝트는 성능 최적화를 위해 불필요한 리렌더링을 방지하는 **React Hook Form**과 타입 안전한 스키마 검증기 **Zod**를 페어로 사용합니다.
+
+### ① 스키마 정의 (`lib/regist-schema.ts` 또는 `model/schema.ts`)
+```typescript
+import { z } from "zod";
+
+export const registrationSchema = z.zodObject({
+ bizNm: z.string().min(2, "사업명은 필수 항목이며 2글자 이상이어야 합니다."),
+ bgtBizCd: z.string().min(1, "확정예산사업번호를 입력해주세요."),
+ bgtAplyYr: z.string().regex(/^\d{4}$/, "예산신청연도는 4자리 숫자여야 합니다."),
+ email: z.string().email("올바른 이메일 형식이 아닙니다."),
+ privacyConsent: z.boolean().refine((val) => val === true, {
+ message: "개인정보 제공에 동의하셔야 합니다.",
+ }),
+});
+
+export type RegistrationFormValues = z.infer;
+```
+
+### ② 컴포넌트 구현 및 바인딩
+```typescript
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { registrationSchema, RegistrationFormValues } from "./schema";
+
+export function RegistrationForm() {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors, isSubmitting },
+ } = useForm({
+ resolver: zodResolver(registrationSchema),
+ defaultValues: {
+ bizNm: "",
+ bgtBizCd: "",
+ bgtAplyYr: new Date().getFullYear().toString(),
+ email: "",
+ privacyConsent: false,
+ },
+ });
+
+ const onSubmit = (data: RegistrationFormValues) => {
+ console.log("Submit Data:", data);
+ // API 호출 로직은 중급 과정에서 설명
+ };
+
+ return (
+
+ );
+}
+```
+
+---
+
+## 4. 초급 실습 과제
+
+### 과제 내용
+* `src/shared/ui` 하위에 CVA를 활용하여 커스텀 뱃지(Badge) 컴포넌트를 설계하세요. (예: `variant` 옵션으로 `'success'`, `'warning'`, `'error'`, `'info'` 상태를 가짐)
+* 사용자 정보 입력 폼 스키마를 `zod`로 설계하고, `react-hook-form`으로 가상의 회원가입 컴포넌트를 만들어보세요. (이메일 검증, 비밀번호 8자 이상 검증 필수)
+* **제약 조건**: 해당 모듈들을 생성할 때 FSD 레이어 규칙(`shared`와 `features` 레이어 배치 위치)을 준수하고, Steiger 린팅 규칙에 어긋나지 않도록 `index.ts`를 통해 Public API 형태로 외부에 노출하세요.
diff --git a/docs/as/03.curriculum-intermediate.md b/docs/as/03.curriculum-intermediate.md
new file mode 100644
index 000000000..808d48a26
--- /dev/null
+++ b/docs/as/03.curriculum-intermediate.md
@@ -0,0 +1,192 @@
+# AS 프로젝트 교육 자료: 중급 과정 (Intermediate Course)
+
+**대상**: FSD 아키텍처와 마크업 설계에 대한 기본 이해를 갖춘 개발자
+**목표**: Next.js App Router 연동 방식을 이해하고, TanStack Query로 API 통신을 수행하며, Zustand와 Context를 결합하여 SSR 환경에 최적화된 상태 관리를 다룰 수 있다.
+
+---
+
+## 1. Next.js App Router와 FSD 라우팅 패턴
+
+AS 프로젝트는 Next.js의 `app/` 라우터를 페이지 진입점으로 최소화하고, 모든 비즈니스 로직과 복잡한 뷰(View) 컴포넌트는 `src/pages` 레이어에 담아 관리합니다.
+
+### 라우팅 흐름 예시
+* **Next.js 경로 정의**: `app/(with-base-layout)/fnrs-cnsltn/page.tsx`
+* **구현 파일**:
+ ```typescript
+ // app/(with-base-layout)/fnrs-cnsltn/page.tsx
+ export { FnrsListPage as default } from "@/pages/fnrs-cnsltn";
+ ```
+* **실제 뷰 컴포넌트**: `src/pages/fnrs-cnsltn/ui/fnrs-list-page.tsx`
+ * Next.js `app` 폴더 내부에 로직을 구현하지 않고, 단순하게 `src/pages` 슬라이스를 re-export함으로써 라우팅 구조와 비즈니스 모듈의 종속성을 완벽히 분리합니다.
+
+---
+
+## 2. SSR 환경에 안전한 Zustand 상태 관리 패턴
+
+Next.js와 같은 SSR 프레임워크에서 Zustand 스토어를 단순 싱글톤 객체(`export const useStore = create(...)`)로 정의하면, 서버 측 메모리 상에서 **여러 사용자 간의 전역 상태 오염(Store State Leak)**이 발생합니다.
+이를 극부하기 위해 AS 프로젝트는 **Vanilla Store + React Context + useRef** 방식을 채택하고 있습니다.
+
+### ① 스토어 정의 (`src/shared/store/user-store.ts`)
+```typescript
+import { createStore } from "zustand/vanilla";
+
+export interface IUserInfo {
+ userId: string;
+ userName: string;
+ email: string;
+}
+
+export type UserState = {
+ userInfo: IUserInfo | null;
+};
+
+export type UserActions = {
+ setUserInfo: (userInfo: IUserInfo | null) => void;
+};
+
+export type UserStore = UserState & UserActions;
+
+export const defaultInitState: UserState = {
+ userInfo: null,
+};
+
+export const createUserStore = (initState: UserState = defaultInitState) => {
+ return createStore()((set) => ({
+ ...initState,
+ setUserInfo: (userInfo) => set(() => ({ userInfo })),
+ }));
+};
+```
+
+### ② Context 및 Provider 정의 (`src/shared/providers/store-provider.tsx`)
+```typescript
+"use client";
+
+import { createContext, useRef } from "react";
+import { createUserStore } from "../store/user-store";
+
+type StoreContextType = {
+ userStore: ReturnType;
+};
+
+export const StoreContext = createContext(undefined);
+
+export const StoreProvider = ({ children }: { children: React.ReactNode }) => {
+ // useRef를 사용하여 렌더링마다 스토어가 재성성되는 것을 방지하고 독립적인 인스턴스를 유지
+ const storeRef = useRef(null);
+ if (storeRef.current === null) {
+ storeRef.current = {
+ userStore: createUserStore(),
+ };
+ }
+
+ return (
+
+ {children}
+
+ );
+};
+```
+
+### ③ Custom Hook을 통한 사용 (`src/shared/lib/use-user-store.ts`)
+```typescript
+import { useContext } from "react";
+import { useStore } from "zustand";
+import { StoreContext } from "../providers/store-provider";
+import { UserStore } from "../store/user-store";
+
+export function useUserStore(selector: (store: UserStore) => T): T {
+ const storeContext = useContext(StoreContext);
+ if (!storeContext) {
+ throw new Error("useUserStore는 반드시 StoreProvider 내부에서 사용되어야 합니다.");
+ }
+ return useStore(storeContext.userStore, selector);
+}
+```
+
+---
+
+## 3. TanStack Query v5를 활용한 서버 상태(Server State) 관리
+
+AS 프로젝트는 비즈니스 도메인의 API와 데이터를 처리하기 위해 React Query(TanStack Query)를 적극 활용합니다.
+
+### ① API 호출 정의 (`entities/fnrs-cnsltn/api/fetcher.ts`)
+```typescript
+import { client } from "@/shared/api";
+import { FnrsDetailDto } from "../model/types";
+
+// client는 Axios 기반으로 공통 Interceptor가 설정된 인스턴스입니다.
+export const fetchFnrsDetail = async (docNo: string): Promise => {
+ const response = await client.get(`/as-fnrs-service/api/v1/fnrs-cnsltn/${docNo}`);
+ return response.data;
+};
+```
+
+### ② Custom Query Hook 구현 (`entities/fnrs-cnsltn/api/use-fnrs-detail.ts`)
+```typescript
+import { useQuery } from "@tanstack/react-query";
+import { fetchFnrsDetail } from "./fetcher";
+
+export const fnrsKeys = {
+ all: ["fnrs"] as const,
+ detail: (docNo: string) => [...fnrsKeys.all, "detail", docNo] as const,
+};
+
+export function useFnrsDetail(docNo: string) {
+ return useQuery({
+ queryKey: fnrsKeys.detail(docNo),
+ queryFn: () => fetchFnrsDetail(docNo),
+ enabled: !!docNo,
+ staleTime: 5 * 60 * 1000, // 5분 캐싱 유지
+ });
+}
+```
+
+### ③ 컴포넌트에서의 데이터 연동 (`pages/fnrs-cnsltn/ui/detail-page.tsx`)
+```typescript
+"use client";
+
+import { useFnrsDetail } from "@/entities/fnrs-cnsltn";
+import { Skeleton } from "@/shared/ui/skeleton";
+
+interface DetailPageProps {
+ params: { id: string };
+}
+
+export function FnrsDetailPage({ params }: DetailPageProps) {
+ const { data: detailData, isLoading, isError } = useFnrsDetail(params.id);
+
+ if (isLoading) return ;
+ if (isError || !detailData) return
상세 데이터를 가져오는 중 에러가 발생했습니다.
;
+
+ return (
+
+
{detailData.bizNm}
+
예산 연도: {detailData.bgtAplyYr}년
+
{detailData.bizCn}
+
+ );
+}
+```
+
+---
+
+## 4. Monorepo 공통 모듈 (`@common/*`) 사용법
+
+AS 프로젝트는 모노레포 내부의 다른 앱들과 로직을 공유하기 위해 다음과 같은 패키지를 사용합니다:
+
+* **`@common/network`**:
+ * 공통 Axios 클라이언트 래퍼(`Client.getInstance()`)를 가져와 공통 헤더 및 환경 변수를 설정하여 프로젝트 API 클라이언트(`client.ts`)를 초기화합니다.
+* **`@common/auth`**:
+ * 로그인 토큰 검증, 세션 연장 기능 등 전역 보안 절차를 제어합니다.
+* **`@common/components`**:
+ * 워크스페이스 공통 UI 컴포넌트(글로벌 레이아웃 프레임, 특수 템플릿 등)를 가져와 사용합니다.
+
+---
+
+## 5. 중급 실습 과제
+
+### 과제 내용
+* `entities/fnrs-cnsltn` 아래에 특정 재원협의 목록을 가져오는 `useFnrsList` Query Hook을 작성하세요.
+* 가져온 목록 데이터를 바탕으로 `shared/ui/table` 컴포넌트(혹은 TanStack Table)를 활용해 목록 그리드를 출력하는 `pages/fnrs-cnsltn/ui/fnrs-list-page.tsx` 페이지를 만드세요.
+* **제약 조건**: 검색 필터링(사업명 검색, 예산 신청 연도)을 React Query의 `queryKey`와 동기화하여 검색 조건 변경 시 자동으로 목록이 갱신되도록 하세요.
diff --git a/docs/as/04.curriculum-advanced.md b/docs/as/04.curriculum-advanced.md
new file mode 100644
index 000000000..d1a4d673b
--- /dev/null
+++ b/docs/as/04.curriculum-advanced.md
@@ -0,0 +1,205 @@
+# AS 프로젝트 교육 자료: 고급 과정 (Advanced Course)
+
+**대상**: 대규모 컴포넌트 설계와 복잡한 클라이언트 인터랙션을 처리해야 하는 시니어급 개발자
+**목표**: FSD 아키텍처 의존성 린팅 툴(Steiger)을 이해하고, `@dnd-kit` 기반의 결재선 드래그 앤 드롭을 구현하며, `tus-js-client`를 통한 대용량 이어올리기 및 OpenTelemetry 분산 트레이싱을 연동할 수 있다.
+
+---
+
+## 1. Steiger & FSD 아키텍처 아키텍처 규칙 검증
+
+**Steiger**는 FSD 아키텍처 규범을 실시간으로 감시하는 파일 구조 정적 분석 린터입니다.
+
+### ① FSD 핵심 위반 검출 및 조치법
+* **비정상 의존 관계 (Violation of Layer Hierarchy)**:
+ * *상황*: `entities/user` 내부 컴포넌트에서 `features/auth-login` 컴포넌트를 import하려는 시도.
+ * *해결*: 하위 레이어는 상위 레이어에 대해 절대 알 수 없어야 합니다. 해당 컴포넌트의 책임을 상위 레이어(`pages` 혹은 `widgets`)로 격상시키거나 하위 레이어의 성격에 맞게 분리하세요.
+* **Public API 규칙 위반 (Slicing Boundaries Bypass)**:
+ * *상황*: `import { UserProfile } from "@/entities/user/ui/profile"` 형태로 직접 파일 경로로 접근하는 경우.
+ * *해결*: `entities/user/index.ts`에서 `export { UserProfile } from "./ui/profile"`을 선언하고, 사용하는 곳에서는 `import { UserProfile } from "@/entities/user"` 로 Public API만 접근하도록 변경해야 합니다.
+
+---
+
+## 2. `@dnd-kit`을 활용한 결재선 관리 화면 및 DnD 구현
+
+결재선 관리(Approval Line Management) 화면은 드래그 앤 드롭으로 결재자 순서를 변경하며, 그리드 상에서 인라인 폼 편집을 처리하는 매우 복잡한 뷰입니다.
+
+### ① 핵심 설계 요구사항
+1. **단일 행 편집 잠금**: 신규 결재선 추가 혹은 특정 행 수정 시, 해당 행을 제외한 다른 행의 입력 및 드래그 인터랙션은 모두 비활성화되어야 합니다 (`editingRowKey` 상태 관리).
+2. **드래그 정렬**: `@dnd-kit`을 사용하여 결재자 순서 변경을 UI에 즉시 반영한 뒤, **[결재선 저장]** 버튼을 통해 전체 순서를 일괄 저장합니다.
+
+### ② 결재선 DnD 구현 예제 (`ui/components/sortable-apln-table.tsx`)
+```typescript
+"use client";
+
+import { useState } from "react";
+import {
+ DndContext,
+ closestCenter,
+ KeyboardSensor,
+ PointerSensor,
+ useSensor,
+ useSensors,
+ DragEndEvent,
+} from "@dnd-kit/core";
+import {
+ arrayMove,
+ SortableContext,
+ sortableKeyboardCoordinates,
+ verticalListSortingStrategy,
+} from "@dnd-kit/sortable";
+import { SortableAplnRow } from "./sortable-apln-row";
+
+export interface IAplnMember {
+ aplnId: string;
+ atrzSeqNo: number;
+ atrzSeComCd: string; // 검토자, 승인자 구분
+ aprvrUuid: string;
+ aprvrNm: string;
+}
+
+export function SortableAplnTable() {
+ const [items, setItems] = useState([
+ { aplnId: "1", atrzSeqNo: 1, atrzSeComCd: "RVW", aprvrUuid: "user-01", aprvrNm: "김검토" },
+ { aplnId: "2", atrzSeqNo: 2, atrzSeComCd: "APR", aprvrUuid: "user-02", aprvrNm: "이승인" },
+ ]);
+
+ // 편집 중인 행 키 (null이 아니면 드래그 및 타 행 편집 금지)
+ const [editingRowKey, setEditingRowKey] = useState(null);
+
+ const sensors = useSensors(
+ useSensor(PointerSensor, {
+ activationConstraint: {
+ distance: 8, // 클릭 클릭 중 미세한 움직임으로 드래그 활성화 방지
+ },
+ }),
+ useSensor(KeyboardSensor, {
+ coordinateGetter: sortableKeyboardCoordinates,
+ })
+ );
+
+ const handleDragEnd = (event: DragEndEvent) => {
+ // 편집 중일 때는 드래그를 차단합니다.
+ if (editingRowKey) return;
+
+ const { active, over } = event;
+ if (over && active.id !== over.id) {
+ setItems((prevItems) => {
+ const oldIndex = prevItems.findIndex((item) => item.aplnId === active.id);
+ const newIndex = prevItems.findIndex((item) => item.aplnId === over.id);
+ const reordered = arrayMove(prevItems, oldIndex, newIndex);
+
+ // 정렬 후 시퀀스 넘버(atrzSeqNo)를 다시 인덱스 기준으로 갱신합니다.
+ return reordered.map((item, index) => ({
+ ...item,
+ atrzSeqNo: index + 1,
+ }));
+ });
+ }
+ };
+
+ return (
+
+
+
+ );
+}
+```
+
+---
+
+## 3. 대용량 파일 분할 업로드 (Tus Protocol)
+
+일반적인 HTTP POST 업로드는 대용량 파일 전송 중 대역폭 변화나 일시적인 네트워크 끊김이 발생할 경우 처음부터 다시 업로드해야 하는 심각한 취약점이 있습니다.
+AS 프로젝트는 이어올리기가 가능한 **Tus Protocol** 규격의 파일 업로더인 `tus-js-client`를 활용합니다.
+
+```typescript
+import * as tus from "tus-js-client";
+
+export function uploadFileWithTus(file: File, onProgress: (pct: number) => void) {
+ return new Promise((resolve, reject) => {
+ const upload = new tus.Upload(file, {
+ endpoint: `${process.env.NEXT_PUBLIC_API_URL}/files/upload`,
+ retryDelays: [0, 1000, 3000, 5000], // 연결 실패 시 재시도 간격
+ metadata: {
+ filename: file.name,
+ filetype: file.type,
+ },
+ onError: (error) => {
+ console.error("Tus upload failed:", error);
+ reject(error);
+ },
+ onProgress: (bytesSent, bytesTotal) => {
+ const percentage = Math.round((bytesSent / bytesTotal) * 100);
+ onProgress(percentage);
+ },
+ onSuccess: () => {
+ // 서버에서 부여받은 최종 파일 접근 경로 또는 고유 ID 획득
+ console.log("Upload complete:", upload.url);
+ resolve(upload.url || "");
+ },
+ });
+
+ // 업로드 개시
+ upload.start();
+ });
+}
+```
+
+---
+
+## 4. OpenTelemetry를 활용한 분산 트레이싱 (APM)
+
+AS 프로젝트에는 애플리케이션의 엔드 투 엔드(End-to-End) 요청 성능 분석과 응답 속도 지연 병목 지점 감시를 위해 **OpenTelemetry(OTel)**가 연동되어 있습니다.
+
+* `instrumentation.ts` : Next.js 서버 사이드 API 요청 및 서버 렌더링에 대한 Span을 생성하고 익스포터로 전송합니다.
+* `instrumentation-client.ts` : 브라우저 클라이언트 사이드 환경에서 API 호출(`fetch`, `xhr`) 및 주요 사용자 Interaction에 대해 브라우저 환경 성능 Span을 계측합니다.
+
+### OTel 동작 핵심 컨셉
+1. **Context Propagation**: 클라이언트에서 서버로 HTTP 요청을 보낼 때 Trace Context Header(`traceparent`)를 실어 보냄으로써, 브라우저에서의 동작과 백엔드 API 서비스에서의 병목 지점 간의 연관 관계를 하나로 통합해서 관찰할 수 있게 합니다.
+
+---
+
+## 5. 고급 실습 과제
+
+### 과제 내용
+* `ui/components/sortable-apln-table.tsx`를 확장하여, 새로운 결재선을 리스트 맨 밑에 추가하는 **[행 추가]** 기능을 구현하세요.
+ * **행 추가 시** 새로 생성된 행은 즉시 **편집 상태**(`editingRowKey = 'new-temp'`)여야 하며, 사용자가 저장을 누르면 REST API(`POST /api/v1/elapr-apln`)를 호출하고 임시 키 대신 서버에서 생성된 진짜 ID로 대체되어야 합니다.
+ * 사용자가 입력을 다 채우지 않고 취소를 누르면, 해당 추가되었던 행이 목록에서 사라져야 합니다.
+* **제약 조건**: 모든 API 통신은 TanStack Query의 Mutation(`useMutation`) 및 캐시 무효화(`invalidateQueries`)를 통해 완전한 동기화 흐름을 가지도록 개발하세요.
diff --git a/docs/as/05.steiger-guide.md b/docs/as/05.steiger-guide.md
new file mode 100644
index 000000000..22722bdcd
--- /dev/null
+++ b/docs/as/05.steiger-guide.md
@@ -0,0 +1,68 @@
+# Steiger 사용법 및 실제 구성 가이드
+
+본 문서는 `as` 프로젝트에서 FSD(Feature Sliced Design) 아키텍처 의존성 및 구조 검증을 위해 사용되는 **Steiger** 린터의 실제 구성과 사용법을 다룹니다.
+
+---
+
+## 1. Steiger 개요
+* **Steiger**는 FSD 아키텍처의 철학(단방향 의존성 흐름, Public API 접근 등)이 코드베이스에서 물리적으로 올바르게 지켜지고 있는지를 검증하는 FSD 전용 정적 분석 린터입니다.
+* 일반적인 코드 포맷터나 문법 린터(ESLint, Prettier)와 달리, **파일 시스템의 폴더 구조와 파일 간의 import 관계**를 추적하여 아키텍처 위반 사항을 진단합니다.
+
+---
+
+## 2. 프로젝트 내 실제 구성 및 실행 방법
+
+### ① 실행 스크립트 정의
+`apps/as/package.json` 파일에 다음과 같이 린트 스크립트가 내장되어 있습니다.
+
+```json
+"scripts": {
+ "lint:fsd": "steiger ."
+}
+```
+
+### ② 린트 실행 명령어
+터미널에서 아래 명령을 실행하여 `as` 애플리케이션의 FSD 구조를 검사합니다.
+
+```bash
+# 모노레포 루트 디렉토리 기준
+pnpm --filter as lint:fsd
+
+# 또는 apps/as 디렉토리 기준
+pnpm run lint:fsd
+```
+
+---
+
+## 3. Steiger의 기본 동작 원리
+
+별도의 설정 파일(`steiger.config.ts`)이 프로젝트에 생성되어 있지 않은 경우, Steiger는 아래와 같이 동작합니다.
+
+1. **기본 FSD 규칙셋(Standard Ruleset) 자동 채택**: `@feature-sliced/steiger-plugin`의 권장(recommended) 규칙들을 메모리에 로드하여 적용합니다.
+2. **프로젝트 루트 탐색**: 실행 인자로 전달된 경로(여기서는 현재 경로인 `.`) 아래의 모든 디렉토리를 순회하며 `src/` 내부의 레이어 구조를 감지합니다.
+3. **의존성 트리 분석**: `shared` ➔ `entities` ➔ `features` ➔ `widgets` ➔ `pages` ➔ `app` 순으로 올라가는 레이어 위계를 확인하여, 역참조(예: `entities`가 `features`를 가져옴)가 발생하는 위치를 찾아냅니다.
+
+---
+
+## 4. Steiger가 감시하는 주요 FSD 아키텍처 규칙
+
+Steiger가 실시간으로 코드를 분석하며 잡아내는 대표적인 아키텍처 오류들은 다음과 같습니다.
+
+| 규칙명 (Rule ID) | 설명 및 예시 |
+| :--- | :--- |
+| **`fsd/no-public-api-bypass`** | 슬라이스의 Public API(`index.ts`)를 통하지 않고 내부 파일 경로를 직접 임포트할 때 감지합니다. ➔ *오류*: `import { Form } from '@/features/auth/ui/form'` ➔ *해결*: `import { Form } from '@/features/auth'` |
+| **`fsd/no-forbidden-imports`** | 상위 레이어가 하위 레이어의 모듈을 가져와 상호 의존하거나 순환 참조가 발생할 때 감지합니다. ➔ *오류*: `entities/user` 슬라이스 안에서 `widgets/header`를 참조하는 경우 |
+| **`fsd/no-segmentless-slices`** | 슬라이스 디렉토리 바로 아래에 세그먼트(`ui`, `model`, `api` 등) 없이 코드 파일이 직접 위치할 때 감지합니다. |
+
+---
+
+## 5. 알려진 팁 및 문제 해결 (tsconfck 관련 오류)
+
+일부 환경에서 `steiger .`를 실행할 때, 내부 컴파일러 설정 검사기인 `tsconfck` 라이브러리가 `.eslintrc.json`과 같은 설정 파일 내의 `"extends": "next/core-web-vitals"` 속성을 TypeScript 설정 파일의 `extends`로 오인하여 모듈 해석 오류(`MODULE_NOT_FOUND`)를 유발하는 경우가 발생할 수 있습니다.
+
+이와 같은 환경적 이슈가 발생할 경우 아래의 우회법을 참고하십시오.
+
+1. **빌드 파이프라인에서 파일 범위 한정**:
+ Steiger 검사 시 설정 파일들이 불필요하게 스캔 대상에 포함되지 않도록 빌드 린트 파이프라인 설정을 조정하거나, 대상 소스 코드 경로(`src`)를 명확하게 지정하여 탐색 범위를 제한합니다.
+2. **steiger 설정 파일 커스텀**:
+ 프로젝트의 필요에 따라 `steiger.config.ts` 파일과 해당 플러그인을 프로젝트 devDependencies에 명시적으로 추가하여 `ignores` 옵션으로 `.eslintrc.json` 등 설정 파싱 에러를 유발하는 대상을 제외하도록 설정하여 운영합니다.