← 프로젝트 목록

IT 자산관리 시스템 (ITAM)

Python으로 개발했다가 Spring으로 재구축하기

  • Apache Tomcat 10.1
  • Spring Boot 3.5
  • PostgreSQL 17
  • Java 17
IT 자산관리 시스템 (ITAM)

IT 자산관리 시스템 (ITAM) — Spring 재구축

사내 PC·모니터·프린터·네트워크 장비 약 300대의 등록·불출·A/S·라이선스를 관리하는 웹 시스템. Python(Flask) + SQLite로 운영하던 시스템을 Java Spring Boot + PostgreSQL + Tomcat 구조로 재구축함


사용 기술 (Tech Stack)

구분 기술
Language Java 17
Framework Spring Boot 3.5 (Spring MVC, Spring JDBC, Spring Session)
WAS Apache Tomcat 10.1 (WAR 배포, Jakarta Servlet 6.0)
Database PostgreSQL 17, Flyway (스키마 마이그레이션)
Session Spring Session JDBC (세션 DB 저장 → 재배포해도 로그인 유지)
Security BCrypt 비밀번호, AES-256-GCM 라이선스 키 암호화, PBKDF2 키 파생, 로그인 실패 잠금
View HTML5 / Vanilla JS (SPA), Thymeleaf (공개 A/S 접수 화면)
Library Apache POI (엑셀), Commons CSV, ZXing (QR), Bouncy Castle (scrypt)
Infra Docker, Docker Compose (멀티 스테이지 빌드: Maven → Tomcat)
Test/도구 Playwright (화면 캡처 자동화), curl 기반 API 검증

주요 기능

  • 대시보드: 전체/사용중/수리중/A/S 미처리/금년 도입 현황, 카드 클릭 시 필터
  • 자산 관리: 등록·수정·삭제, 분류별 자산번호 자동 발급(노트북·데스크탑 숫자 / 그 외 mon-1, prnt-1 …)
  • 불출·반납 전자서명: 손가락·펜·마우스 서명(Canvas), 처리 이력 타임라인
  • 엑셀 일괄 등록: 머리글 자동 인식, 표기 자동 정리, 중복 감지(자산번호·시리얼·MAC), 미리보기 후 등록, 실패 시 전체 롤백
  • QR 라벨 & A/S 접수: 라벨 인쇄(66×30mm), 직원은 스캔 시 상세 화면 / 비로그인은 모바일 A/S 접수 화면
  • 라이선스 키 보안: OS·한글·Office 시리얼 암호화 저장, [보기] 클릭 시에만 표시(30초 후 자동 가림), 조회 기록
  • 계정 관리: 관리자 추가·삭제, 강제 로그아웃(모든 기기), 비밀번호 변경 시 다른 기기 자동 로그아웃
  • 반응형: PC·태블릿·스마트폰 대응

스크린샷

화면 파일
로그인 01_login
대시보드 · 자산 목록 02_dashboard
자산 상세 (QR, 암호화된 시리얼) 03_asset_detail
자산 상세 (A/S 접수, 처리·서명 이력) 04_asset_detail_history
QR 라벨 05_qr_label
신규 자산 등록 (자산번호 자동 발급) 06_asset_form
불출 + 전자서명 07_checkout_signature
엑셀 일괄 등록 미리보기 08_excel_import_preview
관리자 계정 관리 09_admin_accounts
모바일 — QR 스캔 A/S 접수 10_mobile_qr_as_request
모바일 — 대시보드 11_mobile_dashboard

아키텍처

[브라우저 / 스마트폰 QR]
        │  HTTP (REST JSON)
        ▼
┌─────────────── Tomcat 10.1 ───────────────┐
│  ROOT.war (Spring Boot)                   │
│   ├─ AuthInterceptor  로그인·세션 버전 검사 │
│   ├─ Controller  자산 / A/S / 엑셀 / 계정  │
│   ├─ Service     자산번호 규칙, 입력 정규화 │
│   └─ JdbcTemplate                          │
└──────────────┬────────────────────────────┘
               ▼
        PostgreSQL 17  (자산·이력·A/S·세션)     +  파일 저장소 (첨부 PDF)

기술적으로 신경 쓴 부분

  1. 무중단·무손실 데이터 이관 운영 중인 SQLite 원본을 읽기 전용으로 복사해 PostgreSQL로 이관하는 초기화 로직을 구현했습니다. 테이블·건수, 목록 정렬 순서(해시 비교), 대시보드 통계, 자산번호 발급 결과가 기존 시스템과 일치함을 검증했습니다.

  2. 기존 암호화·비밀번호 호환

    • Python cryptography(AES-GCM + PBKDF2)로 암호화된 라이선스 키를 Java javax.crypto로 동일하게 복호화
    • werkzeug scrypt 해시를 Bouncy Castle로 검증 → 로그인 성공 시 BCrypt로 자동 교체 (사용자 비밀번호 재설정 불필요)
  3. 동작 동일성 검증 엑셀 파싱·정규화 로직을 Java로 옮긴 뒤 같은 파일을 Python/Java 양쪽에 넣어 결과를 행 단위로 비교했습니다. 실제 업무 엑셀 151행과 의도적으로 지저분한 입력(CP949 CSV, 합쳐진 칸, 다양한 전화번호·MAC 형식)에서 결과가 동일하며, QR 코드 SVG는 바이트 단위까지 동일합니다.

  4. 세션 무효화 설계 계정마다 session_ver를 두고 매 요청 비교 → 강제 로그아웃·비밀번호 변경 시 모든 기기의 세션을 즉시 무효화. Spring Session JDBC로 세션을 DB에 두어 WAR 재배포에도 로그인이 유지됩니다.

  5. Docker → Tomcat 서버 이전 대비 Docker 이미지를 실제 서버와 같은 Tomcat 10.1 + ROOT.war 구조로 구성해, 서버 이전 시 WAR 복사와 환경변수 설정만으로 배포되도록 했습니다. (Tomcat 클래스로더에서 JDBC 드라이버가 DriverManager에 보이지 않는 문제를 DataSource 직접 생성으로 해결)

규모

  • Java 약 2,900줄 (컨트롤러·서비스·이관·엑셀 처리)
  • 프론트엔드 약 1,400줄 (SPA 1페이지 + 공개 A/S 페이지)
  • REST API 40여 개