Files
safe-project/docs/development.md
Hyungi Ahn 2a9968fa7f feat: TK 안전관리 플랫폼 초기 구현
위험성평가, 안전 RAG Q&A, 안전점검 체크리스트를 통합한
안전관리자 전용 웹 플랫폼 전체 구현.

- Next.js 15 (App Router) + TypeScript + Tailwind + shadcn/ui
- Drizzle ORM + PostgreSQL 16 (12개 테이블)
- 위험성평가 CRUD + 5x5 위험성 매트릭스 + 인쇄 내보내기
- 체크리스트 템플릿/점검/NCR 추적
- RAG 문서 파이프라인 (Tika + bge-m3 + Qdrant)
- SSE 스트리밍 RAG 채팅 (qwen3.5:35b-a3b)
- AI 어시스트 (위험요인 추천, 감소대책, 점검항목 생성)
- 대시보드 통계/차트 (recharts)
- 단일 사용자 인증 (HMAC 쿠키 세션)
- 다크모드 지원
- Docker 멀티스테이지 빌드 (standalone)
- 프로젝트 가이드 문서 (docs/)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 12:33:55 +09:00

2.2 KiB

TK 안전관리 - 개발 가이드

로컬 개발 환경 설정

1. 의존성 설치

cd ~/docker/tk-safety
npm install

2. DB 실행 (Docker)

docker-compose up db -d

3. DB 마이그레이션

npx drizzle-kit push

4. 개발 서버 실행

npm run dev

http://localhost:3000

주요 패턴

Server Actions

모든 CRUD 작업은 src/actions/ 디렉토리의 Server Actions로 구현됩니다.

  • risk-assessment.ts — 위험성평가 + 유해위험요인
  • checklists.ts — 템플릿 + 점검 + NCR
  • rag.ts — 문서 업로드/처리 + 대화

AI API 라우트

SSE 스트리밍이 필요한 AI 기능은 src/app/api/ai/ 라우트로 구현됩니다.

  • chat/route.ts — RAG Q&A (SSE)
  • suggest-hazards/route.ts — 위험요인 추천 (JSON)
  • suggest-controls/route.ts — 감소대책 제안 (SSE)
  • suggest-checklist/route.ts — 점검항목 생성 (JSON)

SSE 스트리밍

클라이언트에서는 src/hooks/use-streaming.ts 훅을 사용합니다.

const { isStreaming, content, sources, error, streamChat, reset } = useStreaming();
await streamChat("/api/ai/chat", { question, conversationId });

인증 시스템

  • HMAC 기반 쿠키 세션 (7일 유효)
  • src/lib/auth.ts — 세션 생성/검증
  • src/middleware.ts — 라우트 보호
  • src/app/(authenticated)/layout.tsx — 서버사이드 인증 확인

DB 스키마 수정

  1. src/lib/db/schema.ts 수정
  2. 마이그레이션 생성: npx drizzle-kit generate
  3. 마이그레이션 적용: npx drizzle-kit push

새 컴포넌트 추가

shadcn/ui 컴포넌트

npx shadcn@latest add [component-name]

커스텀 컴포넌트

기능별 디렉토리에 배치:

  • src/components/risk-assessment/ — 위험성평가 관련
  • src/components/rag/ — RAG/채팅 관련
  • src/components/checklists/ — 체크리스트 관련
  • src/components/dashboard/ — 대시보드 관련

코드 컨벤션

  • TypeScript strict 모드
  • Drizzle ORM 타입 추론 (InferSelectModel<typeof table>)
  • Server Actions에서 revalidatePath() 호출
  • 한국어 UI 텍스트 (상수는 src/lib/constants.ts에 정의)