방문자 사전신청·승인, 입·출입 체크인/아웃, QR 배지, 재실현황, 블랙리스트, 대시보드 통계, 방문 리포트(엑셀)까지 7단계 전 기능 구현. - backend: Spring Boot 3.4.5 / Java 21 (JDK 26 빌드), 세션 인증, JPA, H2/PostgreSQL, POI, ZXing, Flyway - frontend: React 19 / Vite 6 / TypeScript - infra: Docker Compose (db·app·web nginx), Flyway V1__init, Python 사용자 시드 - docs: 워크플로우 / 시퀀스 다이어그램(Mermaid) / 이슈·유의사항 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.0 KiB
5.0 KiB
ACS 워크플로우 — 시퀀스/상태 다이어그램 (Mermaid)
대상: IT센터 출입자관리시스템 · 작성일 2026-07-03 GitHub·VS Code·mermaid.live 등에서 렌더링됨. 서술형 문서는 workflow.md 참조.
1. 방문 신청 상태 머신
stateDiagram-v2
[*] --> DRAFT: 신청 초안
DRAFT --> PENDING: 제출
PENDING --> APPROVED: 승인 (qrToken 발급)
PENDING --> REJECTED: 반려
PENDING --> CANCELLED: 취소
APPROVED --> CANCELLED: 취소
APPROVED --> EXPIRED: 방문 종료일 경과 후 체크인 시도
APPROVED --> [*]: 출입 완료
REJECTED --> [*]
CANCELLED --> [*]
EXPIRED --> [*]
2. 전체 흐름 (신청 → 승인 → 발송 → 입·출입)
sequenceDiagram
autonumber
actor Host as HOST/담당자
actor Admin as ADMIN
participant API as ACS 백엔드
participant SMS as PassNotifier(SMS)
actor Visitor as 방문자
actor Sec as SECURITY/게이트
participant GW as AccessControlGateway
Host->>API: ① 방문 사전신청 (POST /api/visit-requests)
note right of API: 상태 = PENDING (개별 or 엑셀 업로드)
Admin->>API: ② 승인함 조회 (GET /api/visit-requests/pending)
Admin->>API: ③ 승인 (POST /api/approvals/{id}/approve)
note right of API: 상태 = APPROVED, qrToken(UUID) 발급, Approval 기록
API->>SMS: ④ 출입증(QR PNG) 발송 요청
note right of SMS: 발송 실패는 catch&log — 승인은 롤백 안 함
SMS-->>Visitor: 출입증 링크 문자 (ACS_PUBLIC_BASE_URL/pass/:token)
Visitor->>API: ⑤ 공개 출입증 열람 (GET /pass/:token, 비로그인)
API-->>Visitor: QR / 방문정보 표시
Visitor->>Sec: ⑥ 방문일 현장 도착
Sec->>API: ⑦ 체크인 (POST /api/access/check-in, QR/이름)
note right of API: 상태·일자·블랙리스트·중복·재입장 검증 (아래 §3)
API->>GW: openGate(gateId)
GW-->>API: accepted
API-->>Sec: 입장 처리 (AccessEvent IN 기록)
Sec->>API: ⑧ 재실현황 (GET /api/access/inside)
API-->>Sec: 재실 방문자 목록
Visitor->>Sec: ⑨ 퇴장
Sec->>API: ⑩ 체크아웃 (POST /api/access/check-out)
API-->>Sec: 퇴장 처리 (AccessEvent OUT 기록)
Admin->>API: ⑪ 대시보드 통계 (GET /api/stats/summary)
Sec->>API: ⑫ 방문 리포트 (GET /api/reports/visits.xlsx)
API-->>Sec: 엑셀(POI) 다운로드
3. 체크인 검증 로직 (AccessService.checkIn)
sequenceDiagram
autonumber
actor Sec as SECURITY / 키오스크
participant AS as AccessService
participant BL as BlacklistService
participant AE as AccessEventRepo
participant GW as AccessControlGateway
Sec->>AS: check-in (qrToken 또는 visitRequestId)
AS->>AS: 방문신청 resolve
alt 상태 ≠ APPROVED
AS-->>Sec: 400 승인되지 않은 방문
else 방문 종료일 경과
AS->>AS: 상태 = EXPIRED
AS-->>Sec: 400 신청일 경과 — 재신청 필요
else 방문 시작일 이전
AS-->>Sec: 400 아직 방문일 아님
else
AS->>BL: blockReason(name, contact)
alt 블랙리스트 매칭
BL-->>AS: 사유
AS-->>Sec: 403 차단된 방문자
else 통과
AS->>AE: isInside? / hasExitedToday?
alt 이미 재실 중
AS-->>Sec: 409 중복 입장
else 금일 퇴장 완료
AS-->>Sec: 400 재입장 불가
else 정상
AS->>AE: AccessEvent(IN) 저장
AS->>GW: openGate(gateId)
GW-->>AS: accepted
AS-->>Sec: 입장 처리 완료
end
end
end
4. 시스템 컴포넌트 개요
flowchart LR
subgraph FE[프론트엔드 React/Vite]
L[로그인] --> DB1[대시보드]
VR[방문신청] --> AQ[승인함 ADMIN]
AC[출입콘솔] --> KIOSK[키오스크 공개]
RPT[리포트] & BLK[블랙리스트 ADMIN]
PP[공개 출입증 /pass/:token]
end
subgraph BE[백엔드 Spring Boot]
CTRL[Controllers] --> SVC[Services]
SVC --> REPO[(JPA Repositories)]
SVC --> QR[QrService ZXing]
SVC --> NOTI[PassNotifier SMS]
SVC --> GWY[AccessControlGateway Mock/실장비]
SVC --> POI[Report/Excel POI]
end
subgraph DATA[저장소]
DBH[(H2 dev)]
DBP[(PostgreSQL prod + Flyway)]
end
FE -->|/api 세션 인증| CTRL
REPO --> DBH
REPO --> DBP
NOTI -->|hanbank| MSG[사내 메시지 API]
PP -.공개 링크.-> FE
5. 배포 파이프라인 (운영, Docker)
flowchart LR
ENV[.env 설정] --> BUILD[docker compose build]
BUILD --> UP[compose up -d: db + app + web]
UP --> FW[app 기동 시 Flyway V1__init 적용]
FW --> SEED[compose run seed: 사용자 적재]
SEED --> READY[서비스 준비: nginx :80 → /api → app :8080]
READY --> DBV[(db_data 볼륨 영속)]