{"id":"cmq4r7ylq001do601cpasvl97","docId":"cmq4p3x9n006rpl0179qynj4i","version":1,"title":"기존 1472 vs 신규 irosafe v5 — 12 카테고리 비교","content":"# 1472shred (기존) vs irosafe_shred v5 (신규) 개선사항 비교\n\n작성: 2026-06-06 KST · MVP 6/30 (D-24)\n근거: `docs/01_아키텍처/00_현황분석.md`, `docs/03_DB재설계/00_기존_ILSA_결함.md`, 신규 코드/문서\n\n> 핵심 한 줄: **레거시 8개 큰 기술 부채 일괄 해소 + 신규 운영 가치 9건 추가**.\n\n## 0. 개요 비교\n\n| 축 | 기존 1472shred | 신규 irosafe_shred v5 | 효과 |\n|---|---|---|---|\n| 라인 수 (Java) | 약 180 파일 (web/domain/global 혼재) | 72 파일 (도메인별 분리) | 가독성 / 책임 분리 |\n| 패키지 그룹 | `com.sgisframe` (오타) | `com.irosafe.shred` | 브랜드/오타 정정 |\n| 빌드 | gradle.build / war | Gradle Kotlin DSL / bootJar | 모던 빌드 + 버전 카탈로그 |\n| 운영 | 1대 (1472shred.co.kr) | 컷오버 대기 | 병렬 운영 → 신규 |\n| 안정성 | OOM 회고 (2026-05-29 Old Gen full) | 부팅 3.7s · health 200 · Virtual Thread | JVM 21 가속 |\n\n## 1. 기술 스택\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| Spring Boot | 2.5.2 | **3.3.5 LTS** | EOL 회피, JDK 21 호환 |\n| Java | 8 (1.8) | **21 LTS** + Virtual Threads | 13년 격차 해소, GC/성능 |\n| JPA / Hibernate | Hibernate 5 (envers) | Hibernate 6 + Envers | record/sealed 호환 |\n| 빌드 | gradle DSL (legacy) | **Gradle Kotlin DSL + libs.versions.toml** | 버전 한 곳, IDE 자동완성 |\n| 화면 | Thymeleaf 3.0 (182 템플릿) | **Vite 5 + React 18 + TS** | SPA · 다크모드 · HMR |\n| 스타일 | 자체 CSS | **Tailwind 3 + Pretendard Variable + iro 토큰** | 디자인 일관성, 가독성 |\n| 패키징 | war | bootJar (Fat JAR) | 단일 산출물, systemd 친화 |\n| API 문서 | 없음 | **SpringDoc OpenAPI 3 · 32 path 자동** | 신규 화면/외부연동 시 즉시 검증 |\n| 외부 사내 jar | `sgis-common-frame.jar` (불투명) | **자체 wellsa-commons / irosafe-shred-commons** | 의존 1개 제거, 책임 명확 |\n\n## 2. 인증 · 보안\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 인증 방식 | Session + FormLogin | **JWT HS256 (Access only, 2h)** | 모바일/SPA 친화, stateless |\n| Security 설정 | `WebSecurityConfigurerAdapter` (폐기 API) | Security 6 SecurityFilterChain bean | 모던 / 컴파일 안전 |\n| 비밀번호 | 평문/단순 해시 (추정) | **bcrypt 12 rounds** | 산업 표준 |\n| 권한 모델 | 3 단계 텍스트 (SUPER/ADMIN/USER) | **RBAC 3-tier × 13 permissions (ROLE_* + 권한 code)** | `@PreAuthorize(\"hasAuthority('CODE_MANAGE')\")` |\n| 로그인 감사 | 기록 부족 | **login_audit** (success/FAIL_PWD/FAIL_BLOCKED/FAIL_NOT_FOUND + IP) | 침해 추적 |\n| 세션 타임아웃 | 24h | JWT 2h + refresh 가능 | 토큰 노출 시 영향 축소 |\n| 권한 캐싱 | 미확인 | `AuthorityResolver` 트랜잭션 read-only | 호출당 일관 권한 해석 |\n| XSS 방어 | lucy-xss-servlet 2.0.0 (서버) | 프론트 React 자동 escape + CSP 가능 | 경로 단축 |\n\n## 3. 도메인 (운영 변화)\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 계약 | 트랙 미분리 — `SSF_CONTRACT_MANAGEMENT` 한 테이블에 IS_ANNUAL/IS_BRANCH 플래그 | **트랙 이원화 (ONE_CALL / RECURRING) + ContractStatus ENUM** | URL · UI · 화면 분리, 자동 prefix `[원콜]/[정기]` |\n| 캘린더 | 일/주/월 분리 화면 | **단일 SPA + 협력사 7색 + N+ more 표시** | 한눈에 일정 + 색상 매핑 |\n| 일일업무 | 안드로이드만 | **웹 + 안드로이드(후속)** | 작업자 1일 view, 카드+진행률 |\n| 협력사 | 7 협력사 (실제) | 7색 swatch 자동 매핑 + 캘린더 컬러 | 시각 구분 즉시 |\n| 콘솔/바코드 | ZXing 자체 인쇄 (라벨프린터 IP 하드코딩) | QR/Barcode generation endpoint + 프린트 영우님 협업 | 인프라 추상화 |\n| 증명서 | JasperReports `.jrxml` 5종 | 5종 ENUM (YEARLY / ONE_TIME / COWAY / AH / HDD) + 발급/무효 mutation | PDF 후속 분리 |\n| 코드 마스터 | `SSF_CMMN_CODE` (65 row, varchar 매직코드) | `code` 마스터 + UI 관리 (탭/인라인 편집/활성/순서) | 운영자 직접 조정 |\n| 정기 자동 연장 | 코드 부재 (수동) | **ContractExpiryJob @Scheduled(03:00 KST)** — autoExtend → +1y · 비연장 → EXPIRED | 마감 누락 0 |\n\n## 4. UX · 운영자 경험\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 다크모드 | 없음 | **system/light/dark 3 모드 토글 + localStorage** | 야간 사용 / AAA 가독성 |\n| 가독성 | 자체 폰트 / 어수선 | **Pretendard Variable + weight 420 + -0.022em 자간** | 텍스트 가독성 +30% (체감) |\n| 엑셀 다운로드 | 일부 도메인만 | **계약 / 협력사 / 일정 3종 + 한글 헤더 + UTF-8 파일명** | 운영자 즉시 가치 |\n| 엑셀 업로드 | 정기 계약 | 동일 유지 (`POST /api/v1/recurring/upload`) | 호환 |\n| 주소 검색 | 미확인 | **카카오 우편번호 모달 + 도로명 우선** | 주소 입력 5x 단축 |\n| 검색·필터 | 일부 페이지 | **모든 리스트 (계약/일정/협력사/콘솔/증명서)** | 조회 일관성 |\n| 단축 키 | 없음 | (후속) keyboard nav 예정 | — |\n\n## 5. 자동화 · 인프라\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 정기 배치 | 수동 트리거 추정 | **매월 25일 자동 (Quartz 또는 @Scheduled)** | 운영자 부담 0 |\n| 자동 만료 | 수동 처리 | ContractExpiryJob 일배치 | 만료 누락 0 |\n| QR 발행 | 라벨프린터 IP 하드코딩 | 엔드포인트 + 데이터 분리 (Barcode 도메인) | 프린트 인프라 교체 자유 |\n| Excel 일괄 | 일부 | 정기 대량 업로드 + 다운로드 3종 | 양방향 |\n| 데이터 마이그 도구 | 없음 | **LegacyMigrationRunner (Spring Boot CLI · dry-run/apply)** | 안전 ETL, 자연키 보존 |\n\n## 6. DB 스키마 (대표 결함 14건 → 0건)\n\n| # | 기존 결함 | 해결 |\n|---|---|---|\n| 1 | 날짜/시간 컬럼 varchar | DATE / TIME / DATETIME(6) 정상화 |\n| 2 | FK 0개 (비즈니스 테이블) | 모든 SEQ 참조 FOREIGN KEY |\n| 3 | 비정규화 (지점명 중복 저장 3 테이블) | SEQ 외래키만, JOIN |\n| 4 | SEQ + ID 이중 식별자 | bigint id PK 단일, 자연키 별도 unique |\n| 5 | 상태값 매직코드 (C1320000) | ENUM (CONTRACT/EXPIRED/...) |\n| 6 | NULL/공백 혼재 | NOT NULL + default 명시 |\n| 7 | 인덱스 부족 | `ix_sched_visit_started` 외 12 인덱스 |\n| 8 | 감사 envers 일부만 | BaseEntity + Envers 표준 적용 |\n| 9 | 패키지 오타 (`sigsframe`) | `irosafe.shred` |\n| 10 | 외부 jar 의존 | 자체 commons 라이브러리 |\n| 11 | utf8mb4 / 한글 호환 일부 | utf8mb4 표준 + Pretendard |\n| 12 | 코드 마스터 표준 부재 | `code` 마스터 + UI |\n| 13 | 시간대 손실 | KST 고정 (Asia/Seoul) |\n| 14 | Hibernate 4/5 혼재 위험 | Hibernate 6 통일 |\n\n상세: `docs/03_DB재설계/00_기존_ILSA_결함.md`\n\n## 7. 테스트 · 품질\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 단위테스트 | 없음 / 미확인 | **71 PASS / 0 FAIL** (9 클래스, 12s) | 핵심 비즈니스 로직 안전망 |\n| e2e | 없음 | **Playwright 35 PASS / 0 FAIL** (UI 19 + API 16) | UI + endpoint 회귀 자동 |\n| 통합 | 없음 | 9 작성 (Testcontainers MariaDB) | 내부 호스트 runner 등록 후 자동 |\n| API 문서 | 없음 | **Swagger UI 32 path 자동** | 신규 협업 즉시 |\n| CI | 부분 | GitLab Pipeline (단위테스트 + build) | push 마다 검증 |\n| 부팅 시간 | 미확인 (OOM 회고) | **3.7s** | JVM 21 + lazy bean |\n| Migration 검증 | 수동 | Flyway V1~V6 + Testcontainers Flyway 검증 | 스키마 일관성 |\n\n## 8. 개발 생산성\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| 모노레포 | 백/모바일 분리, 공통화 없음 | apps/{backend,frontend,android} + libraries/ | 코드 공유 |\n| 빌드 캐시 | 약 | Gradle 캐시 + npm 캐시 + GitLab cache.key.files | CI 단축 |\n| 핫리로드 | (Thymeleaf) 기본 | **Vite HMR** + Spring DevTools | 개발 사이클 가속 |\n| 의존성 관리 | 분산 | libs.versions.toml + package-lock.json | 버전 1곳 |\n| 모달/팝업 | 일부 자체 | 통합 컴포넌트 (PageHeader/DataTable/SearchBar/Badge) | 재사용 |\n| 디자인 토큰 | 없음 | iro/내부 호스트/partner 팔레트 + Pretendard | 일관성 |\n\n## 9. 보안 · 컴플라이언스\n\n| 영역 | 기존 | 신규 | 개선 |\n|---|---|---|---|\n| CSRF | Spring 기본 | JWT stateless | 토큰 모델 |\n| CORS | 자체 처리 | CorsFilter HIGHEST_PRECEDENCE + origins 명시 | dev/prod 일관 |\n| 비밀번호 정책 | 미확인 | bcrypt 12 + login fail lock 5/30분 | 산업 표준 |\n| 로그 | 분산 | 통합 (`shred-backend.log`) + KST | 운영 단순 |\n| 감사 (audit) | 일부 envers | BaseEntity + Envers + login_audit + schedule_assignment_audit | 핵심 변경 추적 |\n| 컷오버 안전 | 일시 | **병렬 운영 → 신규 점진** + Phase E ETL dry-run/apply 분리 | 롤백 가능 |\n\n## 10. 한 장 요약 (Before → After)\n\n| 항목 | Before | After |\n|---|---|---|\n| Spring Boot / Java | 2.5 / 8 | **3.3 / 21** |\n| 화면 | Thymeleaf 182 | **React SPA + 다크모드** |\n| API 문서 | 없음 | **Swagger 32** |\n| RBAC 권한 | 3 단계 텍스트 | **13 권한 코드** |\n| DB 결함 | 14건 | **0건** |\n| 테스트 | 없음 | **단위 71 + e2e 35 = 106 PASS** |\n| 정기 자동 연장 | 수동 | **@Scheduled 일배치** |\n| 다크모드 | 없음 | **system/light/dark** |\n| 코드 마스터 UI | 매직코드 | **탭/인라인/활성** |\n| 주소 검색 | 없음 | **카카오 우편번호** |\n\n## 11. 운영 KPI 예상 (Phase G 시연 후 측정)\n\n| KPI | Before (추정) | After (목표) |\n|---|---|---|\n| 계약 등록 클릭 수 | 10+ | ≤ 5 |\n| 일정 조회 (월 단위) | 다중 화면 | 1 SPA |\n| 엑셀 다운로드 가능 도메인 | 일부 | 3 (계약/협력사/일정) |\n| 협력사 식별 시각 단서 | 텍스트 | **색상 swatch** |\n| 정기 만료 누락 | 발생 | **0** (배치) |\n| 컷오버 위험 | 일괄 교체 | 병렬 운영 |\n\n## 12. 변경 이력\n\n- v1 (2026-06-06): 초안 — 12 카테고리 Before/After 표 + KPI\n","sourceHash":null,"archivedAt":"2026-06-08T14:12:16+09:00","archivedBy":"sync"}