EverNex BMS Smart Factory
배터리 관리 시스템(BMS) 품질검사 대시보드 — Spring Boot 3 + Vue 3 풀스택 프로젝트
https://smartfactory-bms-project.vercel.app/login
실행 환경에 따라 로딩이 발생할 수 있음
-> 발표 피드백: OS에 따라 로딩 시간 다름, 해결 진행중
프로젝트 개요
주요 기능
기술 스택
프로젝트 구조
로컬 실행
환경 변수
API 엔드포인트
데이터베이스 스키마
차량 상태 흐름
LLM 챗봇
배포
전기차 배터리 품질검사 공정을 시뮬레이션하고 모니터링하는 대시보드 웹 애플리케이션입니다.
차량 상태별 통계 (전체 / 검사 중 / 이상 감지 / 출고 완료) — 5초 자동 갱신
공정 파이프라인 진행률 시각화 (입고 → 검사 → 출고)
최근 미해결 경보 요약
공장별 필터링 (복수 선택 가능)
차량 목록 조회 및 검색 (모델·상태·수출국·날짜 필터, 최대 500건)
차량 상세 페이지
배터리 측정값 (SOC, SOH, SOP, 전압, 온도)
배터리 셀 온도 히트맵 시각화
처리 단계 타임라인 (각 검사 시작/종료 시간)
경보 목록 및 상태 변경 이력
경보 목록 조회 및 필터링 (심각도·타입·모델)
경보 상태 변경: 확인(acknowledge) / 해제(resolve) / 일괄 삭제
읽지 않은 경보 수 배지 (헤더에 실시간 표시)
우하단 부동형 챗봇 위젯
RAG Lite 모드 : 현재 DB 통계를 컨텍스트로 제공 후 LLM이 자연어 답변
Text-to-SQL 모드 : 자연어 질문 → LLM이 SQL 자동 생성 → DB 실행 → 결과 해석
대화 기반 리포트 자동 생성 및 저장
LM Studio(로컬) / OpenAI / Google Gemini 지원
차량 자동 생성 간격 (ms) 조정
검사 단계별 소요 시간 (ms) 조정
검사 단계별 성공 확률 (%) 조정
LLM 제공자 / 모델 / API 키 설정
사용자 목록 조회
역할 변경 (admin / operator)
사용자 삭제
한국어 / 영어 전환 (vue-i18n, 로컬 스토리지에 저장)
다크 / 라이트 모드 전환 (Tailwind CSS)
항목
버전
Java
17
Spring Boot
3.3.4
Spring MVC + JdbcTemplate
—
MySQL Connector/J
8.0+
JJWT
0.12.6
Spring Security Crypto (BCrypt)
—
Maven
3.9+
항목
버전
Vue
3.4.21
Vue Router
4.3.2
Pinia
2.2.0
Vue i18n
9.14.5
Vite
5.2.8
Tailwind CSS
3.4.3
항목
서비스
프론트엔드 배포
Vercel Hobby
백엔드 배포
Render Free Web (Docker)
데이터베이스
MySQL
CI/CD
GitHub Actions
04_BMS_SF_ver02/
├── backend/
│ ├── Dockerfile # 멀티스테이지 Docker 빌드
│ ├── pom.xml
│ └── src/main/java/com/evernex/bms/
│ ├── BmsApplication.java
│ ├── config/ # CORS 설정 (WebConfig)
│ ├── controller/ # REST API 컨트롤러 9개
│ │ ├── AuthController # 로그인 / 회원가입 / 내 정보
│ │ ├── DashboardController # 실시간 통계
│ │ ├── VehiclesController # 차량 CRUD + 상세 조회
│ │ ├── AlertsController # 경보 관리
│ │ ├── ChatController # LLM 챗봇 + 리포트 생성
│ │ ├── ReportsController # 저장된 리포트 조회/삭제
│ │ ├── SettingsController # 관리 설정
│ │ ├── UsersController # 사용자 관리
│ │ └── HealthController # 헬스 체크
│ ├── service/
│ │ ├── SimulationService # 500ms 스케줄 상태머신
│ │ ├── VehicleFactoryService # 차량 자동 생성
│ │ ├── ChatService # RAG Lite / Text-to-SQL 처리
│ │ ├── LlmClient # OpenAI / Gemini / LM Studio 연동
│ │ ├── SettingsService # 설정 CRUD
│ │ └── RandomMetricService # 시뮬레이션용 난수 생성
│ ├── security/
│ │ ├── JwtUtil # JWT 생성·검증 (HS256)
│ │ ├── JwtAuthFilter # Spring 필터 체인 인증
│ │ ├── AuthContext # 스레드로컬 사용자 정보
│ │ ├── AuthPrincipal # 사용자 권한 모델
│ │ └── GlobalExceptionHandler
│ ├── db/
│ │ ├── SchemaInitializer # 앱 시작 시 테이블 자동 생성
│ │ ├── DataSeeder # 샘플 데이터 삽입
│ │ ├── FactoryScope # 공장 권한 필터링
│ │ └── TimeUtil
│ └── domain/
│ └── Constants # 차량 상태, 모델명, 공장 상수
│
├── frontend/
│ ├── vercel.json # SPA 라우팅 설정
│ ├── src/
│ │ ├── views/ # 페이지 컴포넌트 9개
│ │ │ ├── Dashboard.vue
│ │ │ ├── VehicleList.vue
│ │ │ ├── VehicleDetail.vue
│ │ │ ├── Alerts.vue
│ │ │ ├── Reports.vue
│ │ │ ├── Settings.vue
│ │ │ ├── Users.vue
│ │ │ ├── Login.vue
│ │ │ └── Signup.vue
│ │ ├── components/
│ │ │ ├── Chatbot.vue # 부동형 LLM 챗봇 위젯
│ │ │ ├── CellHeatmap.vue # 배터리 셀 온도 히트맵
│ │ │ ├── Gauge.vue # SOC/SOH/온도 게이지 차트
│ │ │ ├── ProcessTimeline.vue # 처리 단계 타임라인
│ │ │ ├── FactoryFilter.vue # 공장 다중 선택 필터
│ │ │ └── MultiSelect.vue # 범용 다중 선택 드롭다운
│ │ ├── layouts/
│ │ │ └── AppLayout.vue # 사이드바 + 헤더 레이아웃
│ │ ├── stores/ # Pinia 상태 관리
│ │ │ ├── auth.js # 로그인 / 사용자 정보
│ │ │ ├── filters.js # 공장 필터 상태
│ │ │ ├── alerts.js # 미해결 경보 카운트
│ │ │ └── theme.js # 다크 / 라이트 모드
│ │ ├── composables/
│ │ │ ├── api.js # HTTP 클라이언트 (JWT 자동 첨부, 401 자동 로그아웃)
│ │ │ ├── status.js # 상태별 색상·라벨 매핑
│ │ │ └── labels.js # 모델명·공장·국가 라벨
│ │ ├── router/index.js # Vue Router (인증 가드)
│ │ └── i18n/
│ │ └── locales/
│ │ ├── ko.js # 한국어 메시지
│ │ └── en.js # 영어 메시지
│
├── sql/
│ ├── schema.sql # MySQL DDL (프로덕션 마이그레이션 참고용)
│ └── seed.sql # 초기 데이터
│
├── .github/workflows/
│ ├── backend-ci.yml # Maven 빌드 + Docker 빌드 검증
│ └── frontend-ci.yml # npm ci + Vite 빌드 검증
│
├── render.yaml # Render Blueprint 설정
├── DEPLOYMENT.md # Vercel + Render 배포 단계별 가이드
└── README.md
Java 17+
Maven 3.9+
Node.js 20+
(선택) LM Studio — 챗봇 기능 로컬 테스트 시
변수
기본값
설명
PORT
3000
HTTP 서버 포트
DB_URL
jdbc:mysql://localhost:3306/bms
MySQL 연결 URL
DB_USERNAME
root
DB 사용자명
DB_PASSWORD
DB 비밀번호
JWT_SECRET
(개발용 기본값)
JWT 서명 키 — 운영 시 32자+ 랜덤 문자열로 교체
LLM_BASE_URL
http://127.0.0.1:1234
LM Studio 또는 OpenAI 엔드포인트
LLM_MODEL
local-model
사용할 LLM 모델명
운영 배포 시 추가로 필요한 변수:
변수
예시
설명
LLM_API_KEY
sk-...
OpenAI / Gemini API 키 (챗봇 사용 시)
변수
기본값
설명
VITE_API_BASE_URL
http://localhost:3000/api/v1
백엔드 API 베이스 URL
모든 엔드포인트는 /api/v1 접두사를 사용합니다.
/auth/login, /auth/signup을 제외한 모든 요청에 Authorization: Bearer <token> 헤더가 필요합니다.
에러 응답 형식: { "error": "<message>", "detail": "<optional>" }
메서드
경로
설명
POST
/auth/login
로그인 → JWT + 사용자 정보 반환
POST
/auth/signup
회원가입 (operator 역할로 생성)
GET
/auth/me
현재 로그인 사용자 정보
메서드
경로
설명
GET
/dashboard/stats
실시간 차량 상태 집계, 경보 요약 (?factory_ids=1,2)
메서드
경로
설명
GET
/vehicles
목록 조회 (모델·상태·국가·날짜 필터)
POST
/vehicles
차량 수동 생성
GET
/vehicles/:carId
상세 조회 (배터리, 셀, 이력, 경보)
PUT
/vehicles/:carId
차량 정보 수정
DELETE
/vehicles/:carId
삭제
POST
/vehicles/:carId/resolve
차량 경보 일괄 해제
메서드
경로
설명
GET
/alerts
목록 조회 (심각도·타입·모델·상태 필터)
GET
/alerts/facets
필터 선택지 반환
GET
/alerts/unresolved-count
미해결 경보 수
POST
/alerts/:id/acknowledge
경보 확인 처리
POST
/alerts/:id/resolve
경보 해제
POST
/alerts/bulk-delete
다중 삭제
메서드
경로
설명
POST
/chat
자연어 질문 → LLM 답변 (RAG Lite / Text-to-SQL)
POST
/chat/report
대화 내용 기반 리포트 생성 및 DB 저장
GET
/reports
저장된 리포트 목록
GET
/reports/:id
리포트 상세 (메시지, SQL, 데이터 포함)
DELETE
/reports/:id
리포트 삭제
메서드
경로
설명
GET
/settings
전체 설정 조회
PUT
/settings/:key
설정값 변경
GET
/settings/factories
공장 목록
GET
/settings/factories/all
전체 공장 목록 (비활성 포함)
GET
/settings/countries
수출국 목록
PUT
/settings/countries/:id
수출국 허용 여부 변경
GET
/users
사용자 목록
PUT
/users/:id
역할 변경
DELETE
/users/:id
사용자 삭제
메서드
경로
설명
GET
/health
서버 상태 확인
MySQL을 사용하며 sql/schema.sql의 DDL로 테이블을 생성합니다.
테이블
설명
users
사용자 (user_id, email, password_hash, role, name)
factories
6개 공장 정보 (청림·은하·백운·단풍·태양·한빛)
countries
수출 대상국 (10개국, 허용 여부 관리)
cars
차량 (모델명, 공장, 목적지 국가, 현재 상태)
batteries
차량당 1개 배터리 (시리얼, 제조일)
battery_measurements
배터리 측정값 (SOC, SOH, SOP, 전압, 온도)
battery_cells
배터리 셀 목록 (셀 번호)
battery_cell_measurements
셀별 온도·전압 측정값
car_status_histories
차량 상태 변경 이력
alerts
경보 (타입, 심각도, 현재 상태)
alert_status_histories
경보 상태 변경 이력
process_step_histories
검사 단계별 진행 기록 (시작/종료 시간)
inspection_results
검사 결과 요약
admin_settings
운영 설정 (검사 시간, 확률, LLM 설정 등)
llm_chat_logs
LLM 대화 기록
reports
생성된 리포트
시뮬레이션 서비스(SimulationService)가 @Scheduled(fixedDelay=500) 으로 500ms마다 상태를 전이시킵니다.
ARRIVAL (입고)
│
▼ 6단계 검사
BATTERY_INSPECTION ─── 이상 감지 ──► ANOMALY_DETECTED
CELL_INSPECTION │
│ 통과 QA_MAINTENANCE
│ │
│ RE_INSPECTION_WAITING
│ RE_INSPECTION
│◄──────────────────────────────── 재검사 통과
│
BATTERY_QC_COMPLETE
│
SHIPMENT_WAITING
│
SHIPMENT_COMPLETE (출고 완료)
단계
항목
설명
1
SOC_CHECK
충전 상태 (State of Charge)
2
SOH_CHECK
배터리 건강도 (State of Health)
3
SOP_CHECK
전력 상태 (State of Power)
4
PACK_VOLTAGE_CHECK
팩 전압
5
CELL_TEMPERATURE_CHECK
셀 온도
6
CELL_VOLTAGE_CHECK
셀 전압
각 단계의 소요 시간(ms)과 성공 확률(%)은 Settings 페이지에서 실시간 조정 가능합니다.
제공자
llm_provider 값
비고
LM Studio (로컬)
lm_studio
인터넷 불필요, 기본값
OpenAI
openai
API 키 필요
Google Gemini
gemini
API 키 필요
RAG Lite (rag_lite)
DB에서 전체 통계, 미해결 경보, 키워드 기반 차량 목록을 JSON으로 추출
LLM에 컨텍스트와 함께 질문을 전달하여 자연어 답변 생성
Text-to-SQL (text_to_sql)
자연어 질문 → LLM이 MySQL SELECT 문 생성
SQL 검증 (SELECT만 허용, 테이블 화이트리스트, 공장 권한 필터 자동 삽입)
DB 실행 → 결과를 LLM이 다시 자연어로 해석
챗봇 대화창의 리포트 생성 버튼 클릭 시:
대화 내용 전체를 LLM에 전달하여 구조화된 리포트 생성
저장 항목: 제목, 요약, 핵심 발견사항, 권장 조치, 데이터 근거
Reports 페이지에서 저장된 리포트 조회·삭제 가능
Settings 페이지(관리자) → LLM 섹션에서 제공자/모델/API키 설정
또는 Render 환경 변수로 직접 설정:
LLM_BASE_URL=https://api.openai.com
LLM_MODEL=gpt-4o-mini
LLM_API_KEY=sk-...
Vercel(프론트엔드) + Render(백엔드) 사용
1. Render → New → Blueprint → 이 저장소 연결
→ render.yaml 자동 감지 → bms-backend 배포
2. Vercel → New Project → 이 저장소 Import
→ Root Directory: frontend
→ 환경 변수: VITE_API_BASE_URL = https://<render-url>/api/v1
→ Deploy
역할
접근 범위
admin
모든 공장 데이터 + 사용자·설정 관리
operator
할당된 공장 데이터만 조회 가능 (관리 기능 접근 불가)