IT 자산관리 시스템 (ITAM)
Python으로 개발했다가 Spring으로 재구축하기
- Apache Tomcat 10.1
- Spring Boot 3.5
- PostgreSQL 17
- Java 17
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·태블릿·스마트폰 대응
스크린샷
| 화면 | 파일 |
|---|---|
| 로그인 | ![]() |
| 대시보드 · 자산 목록 | ![]() |
| 자산 상세 (QR, 암호화된 시리얼) | ![]() |
| 자산 상세 (A/S 접수, 처리·서명 이력) | ![]() |
| QR 라벨 | ![]() |
| 신규 자산 등록 (자산번호 자동 발급) | ![]() |
| 불출 + 전자서명 | ![]() |
| 엑셀 일괄 등록 미리보기 | ![]() |
| 관리자 계정 관리 | ![]() |
| 모바일 — QR 스캔 A/S 접수 | ![]() |
| 모바일 — 대시보드 | ![]() |
아키텍처
[브라우저 / 스마트폰 QR]
│ HTTP (REST JSON)
▼
┌─────────────── Tomcat 10.1 ───────────────┐
│ ROOT.war (Spring Boot) │
│ ├─ AuthInterceptor 로그인·세션 버전 검사 │
│ ├─ Controller 자산 / A/S / 엑셀 / 계정 │
│ ├─ Service 자산번호 규칙, 입력 정규화 │
│ └─ JdbcTemplate │
└──────────────┬────────────────────────────┘
▼
PostgreSQL 17 (자산·이력·A/S·세션) + 파일 저장소 (첨부 PDF)
기술적으로 신경 쓴 부분
-
무중단·무손실 데이터 이관 운영 중인 SQLite 원본을 읽기 전용으로 복사해 PostgreSQL로 이관하는 초기화 로직을 구현했습니다. 테이블·건수, 목록 정렬 순서(해시 비교), 대시보드 통계, 자산번호 발급 결과가 기존 시스템과 일치함을 검증했습니다.
-
기존 암호화·비밀번호 호환
- Python
cryptography(AES-GCM + PBKDF2)로 암호화된 라이선스 키를 Javajavax.crypto로 동일하게 복호화 - werkzeug
scrypt해시를 Bouncy Castle로 검증 → 로그인 성공 시 BCrypt로 자동 교체 (사용자 비밀번호 재설정 불필요)
- Python
-
동작 동일성 검증 엑셀 파싱·정규화 로직을 Java로 옮긴 뒤 같은 파일을 Python/Java 양쪽에 넣어 결과를 행 단위로 비교했습니다. 실제 업무 엑셀 151행과 의도적으로 지저분한 입력(CP949 CSV, 합쳐진 칸, 다양한 전화번호·MAC 형식)에서 결과가 동일하며, QR 코드 SVG는 바이트 단위까지 동일합니다.
-
세션 무효화 설계 계정마다
session_ver를 두고 매 요청 비교 → 강제 로그아웃·비밀번호 변경 시 모든 기기의 세션을 즉시 무효화. Spring Session JDBC로 세션을 DB에 두어 WAR 재배포에도 로그인이 유지됩니다. -
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여 개










