| 전환 골격 |
Spring Boot 전환 골격과 아키텍처 기준을 수립하고, 화면·도메인 식별자 체계와 작업 현황판을 정의 |
| 영속성 전략 |
연도별로 분리된 레거시 DB를 동적으로 선택하고 교차 DB 질의와 기존 SQL 이식을 명시적으로 다뤄야 하므로, JPA 대신 MyBatis와 Spring JDBC를 주 축으로 선택. JPA는 신규 단순 테이블에만 제한 적용 |
| 인증/인가 이식 |
JWT 쿠키 인증과 RBAC 인가 컴포넌트 구성, 로그인/가입 API와 직원 인증 도메인 이식, Rails의 36진수 타임스탬프 ID 생성기 이식으로 기존 식별자 호환성 유지. 접근 거부 사유 로깅과 오류 페이지 정비 |
| 검사 주문 이관 (ASP 직접) |
학교 주문 접수부터 조회·수정·삭제, 상태 전이와 취소, 결제완료 후처리까지 주문 파이프라인 전구간을 ASP 원본 기준으로 이식. 접수 단가를 클라이언트 값이 아니라 서버에서 확정하도록 바꾸고 필수값 검증을 추가 |
| 주문 부속 문서 이관 |
주문에 딸린 실시내역표(작업지시서)와 취소·반품 내역을 구 ERP 원본 기준으로 이식해, 접수 이후의 처리 문서까지 신규 스택에서 끊기지 않게 함 |
| 정가 규칙 단일화 |
여러 페이지에 흩어져 있던 정가·할인 산정을 단일 규칙 컴포넌트로 추출해 원본 단가 기준과 일치시킴. 단가가 저장돼 있지 않은 과거 주문도 단가표 기준으로 채워 보이게 하고, 총액을 항목 합계 하나로 통일해 접힘·펼침과 화면·엑셀이 서로 어긋나지 않도록 정리 |
| 인증코드 수동 발급 이관 |
검사 인증코드를 수작업으로 발급하는 화면을 이식하고, 코드 채번 로직을 공통 모듈로 추출해 외부 쇼핑몰 연동 발급과 기준을 공유 |
| 검사 카운트 원장화 |
검사 카운트를 레거시 집계 컬럼 하나로 관리하던 것을 증감 원장 구조로 바꿈. 부여·차감 경로를 회원별 카운트 관리 화면 하나로 모으고, 인증코드 발급 차감과 전환 복구를 이력으로 남겨 잔여 수량이 왜 그 값인지 되짚을 수 있게 함. 기관×검사 상세를 허브로 삼아 발급·발급내역·증감 이력을 한 화면에서 보도록 정리. 애플리케이션을 거치지 않은 잔량 변경까지 남기기 위해 DB 트리거로 원장을 기록하고, 원장을 잔량과 같은 DB로 옮겨 한 트랜잭션 안에서 끝나게 함. 원장 기록 실패는 조용히 넘기지 않고 남기며, 카운트를 쓰는 쪽이 읽는 판별 값을 모든 생성 경로에서 채우도록 정리. 인증코드 발급은 ERP에서 걷어내 발급의 주인을 한쪽으로 모으고, 무료 지급도 구매 이력으로 세도록 기준을 통일 |
| OMR 매퍼·업로드 이식 |
매퍼 목록·상세·휴지통 조회와 등록·인라인 편집·복제·삭제·복원 CRUD, 업로드 이력 화면 이식. 대용량 업로드를 chunk 단위 요청으로 분리해 60초 타임아웃 해소 |
| 오프라인 OMR 업로드 이관 |
학교 표준화 OMR 업로드를 이식하면서 미리보기와 저장이 같은 채점 경로를 타도록 구성해, 확인한 값과 저장되는 값이 갈라질 여지를 없앰. 검사 계열마다 다른 채점기는 공통 골격 위에 붙여 계열이 늘어도 같은 자리에서 확장되게 함 |
| 계정 관리 재정비 |
문자열로 입력되던 소속을 부서 마스터 테이블로 옮기고, 셀프 회원가입을 폐지해 계정 생성 경로를 관리자 하나로 일원화. 엑셀 일괄등록과 임시비밀번호 발급·최초 로그인 강제 변경을 도입하고, 삭제된 계정의 복구와 삭제 이메일 재등록 차단을 구분 |
| 권한 반영의 즉시성 |
권한·역할을 바꿔도 이미 발급된 토큰이 살아 있으면 반영이 미뤄지므로, 토큰 버전을 두어 해당 직원만 강제 로그아웃되게 함. 저장 권한이 없으면 진입 버튼 자체를 감추는 화면 게이팅을 전 화면에 전수 적용하고, 권한 항목을 기능 단위로 묶어 보여 운영자가 엔드포인트를 몰라도 부여할 수 있게 정리 |
| 권한 목록의 코드 동기화 |
권한 부여 대상이 되는 엔드포인트를 코드에서 읽어 기동 시점에 자동으로 맞추고, 이전 스택에만 존재하던 항목을 일괄 정리해 권한 목록이 실제 기능과 어긋나지 않게 함. 권한 항목을 기능 이름과 REST 순서로 보이게 하고, 차단 화면에 막힌 기능명을 드러내 운영자가 무엇을 요청해야 하는지 알 수 있게 함 |
| 출퇴근 관리 이관 |
별도 운영되던 출퇴근 시스템을 ERP로 통합 이식 — 인증 통합, 출퇴근 대시보드, 관리자 현황(CSV)·기록 보정·변경 이력·근무계획·공휴일·공지(슬랙 알림)·패턴 분석, 반차/반반차 실근무 변환 로직 |
| 근태 운영 워크플로우 |
근무계획을 월 단위로 확정·잠금하고, 확정된 달의 변경은 예외 없이 요청·승인을 거치도록 경로를 단일화. 수정 여부와 변경 전·후를 화면에 드러내고, 마감일 이후 변경은 알림으로 남김. 외근은 시간대로 기록해 그만큼을 근무로 산입하고, 확정된 달에서도 휴가·외근처럼 승인이 필요 없는 항목은 직접 저장되도록 예외를 명시. 전 직원 근무표를 한 화면에 모으고, 근태 상태를 색으로 가르며 목록의 열 제목과 식별 열을 함께 고정해 긴 표에서 기준을 잃지 않게 함. 근무 시각을 직접 넣으면 그 날짜부터 남은 평일에 퍼뜨리고, 마감된 자기 근태는 본인이 직접 확인하도록 경로를 열어 둠. 이후 메뉴를 근태 현황·근무계획 관리·지문 대조·운영 설정 네 묶음으로 다시 나누고 탭 단위 권한 규칙을 화면 정책에 명시했으며, 코드에서 사라진 경로는 권한 목록에서도 걷어냄. 직원이 보던 출퇴근·근무계획·근태 기록 세 화면을 한 표로 합쳐 같은 것을 두 번 묻지 않게 하고, 휴가처럼 승인이 필요 없는 항목과 근무시간대처럼 승인이 필요한 항목을 같은 버튼에서 갈라 보냄. 확정된 달은 저장 경로를 닫고 일괄 변경 요청만 남겼고, 외근은 사후에도 직원 요청·승인과 관리자 직접 수정으로 시간대와 근무시간을 함께 고칠 수 있게 함. 변경 요청은 상태 필터와 대기 건수를 한 묶음으로 보이고 여러 건을 한 번에 승인하며, 승인·반려 결과를 그 요청이 처음 올라온 알림 스레드에 처리자와 함께 댓글로 되돌림. 변경 이력의 '변경 전'은 승인 순간의 계획을 그대로 남겨 이후 계획이 바뀌어도 이력이 흔들리지 않게 함. 근태가 마감되는 날에는 지난 달 근무계획 수정이 관리자에게 몰리는데 날짜마다 편집창을 열어 한 건씩 저장해야 했던 것을, 직원 화면의 한 달 표를 공용 조각으로 떼어 관리자도 같은 표에서 바뀐 날짜만 한 트랜잭션으로 저장하게 함. 선택지에 없는 옛 값은 그대로 보여 주고 손대지 않아, 한 달을 저장하는 일이 과거 기록을 지우지 않게 함. 변경 이력은 '언제 고쳤나'보다 '어느 날의 무엇이 바뀌었나'를 찾는 화면이라 근무일 기준으로 다시 정렬 |
| 근태 판정 기준 정리 |
지각 판정을 하나의 기준으로 통합하고 출근 유예를 초 단위로 명시, 반차의 기준을 일률값이 아닌 개인 근무시간대로 바꿈. 근무시각이 없는 종일부재는 대조 판정에서 제외하고, 경계 시나리오를 회귀 테스트로 고정. 기기 시계 오차는 허용 범위로 흡수하고 그 밖의 예외는 사유와 함께 정상 처리하도록 갈라, 기계적 불일치와 실제 근태 문제를 구분. 기준 근무시간이 없으면 반차를 추측하지 않고 먼저 채우게 하고, 반차 판정 시간대를 화면과 서버가 한 벌로 쓰도록 통일. 연차처럼 기록이 없는 것이 정상인 날은 누락으로 세지 않음. 반차인 날은 시간대가 이미 좁혀져 있어 기준이 그 달 대표 시간대로 떨어졌고, 그 탓에 다른 날을 고치려고 저장할 때마다 손대지 않은 반차 시각이 알림·승인 없이 바뀌고 반차끼리 바꾸면 엉뚱한 시간대가 나왔음. 좁혀진 시간대에서 원래 근무시간대를 거슬러 찾고 기준을 고르는 곳을 한 벌로 모아, 사람이 고친 단축근무처럼 거슬러 찾을 수 없는 경우만 대표 시간대로 떨어지게 함. 외근·연차를 넣었다 빼면 그날 근무계획이 통째로 사라지던 것, 삭제한 직원이 계획만 남아 매일 누락으로 뜨던 것도 함께 정정 |
| 근태 대조 보관 |
지문 인식기 기록과 근무계획의 월별 대조를 차이만이 아니라 그 달 출퇴근 전부로 보관하고, 보관본을 열 때마다 현재 근무계획으로 다시 재도록 해 계획이 바뀐 뒤에도 과거 판정이 굳어 남지 않게 함. 대량 적재가 매개변수 한계에 걸려 통째로 실패하던 것을 배치 전송으로 바꾸고, 오래 걸리는 대조의 진행 상황을 서버 전송 이벤트로 화면에 내보냄 |
| 데이터 모델 정리 |
열두 개가 넘는 DB에 같은 성격의 데이터가 흩어져 있어, 이관하기 전에 도메인별로 원천을 가려내는 작업을 먼저 함. 회원·계정, 인증코드·검사 카운트, 주문, 검사 상품 네 도메인으로 나눠 어느 테이블이 정본인지 식별하고 ERD로 정리했습니다. 특히 주문은 프로 채널과 교육 채널이 서로 다른 로직을 써 왔기 때문에 둘을 나란히 놓고 비교해, 통합할 때 누락되면 안 되는 컬럼과 개선이 필요한 지점을 먼저 밝혀 두었습니다. 이 정리가 이후 카운트 원장화와 배분 구조 설계의 근거가 됐습니다 |
| 학교 기준정보·NEIS 이관 |
학교 도메인(목록·상세·CRUD)과 NEIS 대량 동기화를 seed→scan→apply 3단계 파이프라인으로 이식 |
| 검사 상품 마스터 이관 |
검사·상품·OMR 시트·검사코드가 서로 다른 마스터 테이블에 흩어져 등록되던 것을 한 화면에서 등록·수정하도록 이식하고, 코드 중복 확인을 관련 테이블 전체로 확장해 어느 한 곳에만 값이 들어가는 상태를 막음. 목록 조회에서 건별로 반복되던 질의를 조인 하나로 정리 |
| 제휴사 요구사항 수집과 협의 |
제휴 기관과 외부 연동처의 요구사항을 직접 수집해 개발 범위로 정리하고 일정을 조율함. 연동 규격과 결과 전송 경로·인증 방식을 협의해 확정하고, 연동처마다 다른 식별자 규칙과 응답 형식을 표준 경로가 흡수하도록 정리 |
| 제휴사 주문·배분 관리 |
제휴사 등록과 주문, 기관 단위 배분(순차·그룹·무제한)을 ERP에서 관리하되 실제 차감은 검사 API가 맡도록 주인을 나눠, 주문 원장과 소모 기록이 한쪽에만 남는 상태를 방지. 기관에 나눠 준 몫의 합계와 주문 잔여의 관계를 상세 화면에 드러내고, 제휴사 대시보드에서 주문 소진과 검사 진행 현황, 응시자 결과 조회까지 한 흐름으로 연결. 기관 배분은 엑셀 양식으로 다건 등록하되, 업로드된 기관코드가 회원 정본에 있는지 확인해 없는 줄만 반려하도록 함. 제휴 응시자에게 대학 채널 통계를 주려면 응시자 원장의 시행 회차와 그 회차의 학과 목록이 맞아야 했는데 둘 다 DB를 손으로 고쳐 왔음. 배분에 시행 회차를 두고 회차·학과 목록·응시자 학과명을 설정 화면 하나에서 한 트랜잭션으로 맞추며, 검사 API는 진입 시 그 회차를 원장에 그대로 남기게 함. 학과 목록은 회차 단위로 통째로 바뀌므로 이미 다른 경로로 들어온 응시자가 있으면 교체를 거절해 로그인이 막히지 않게 하고, 학과명 길이 상한이 원본과 원장에서 달라 긴 학과명이면 응시자 생성이 실패하던 것을 원장 쪽을 넓혀 맞춤 |
| 검사 진행 모니터링 |
검사 진행 상황을 프로·학교 표준화·검사코드 축으로 모아 보는 화면을 구성하고, 기본 조회 기간을 학년도 시작 기준으로 두어 운영자가 매번 기간을 고쳐 잡지 않게 함. 날짜 조건을 집계 안쪽으로 내리고 목록에 서버 페이징을 넣어 조회 부하를 줄임 |
| 개인정보 파기 이관 |
응시자 개인정보 파기 대상을 신규 검사 테이블까지 넓히고, 실행 전에 무엇이 지워지는지 확인하는 단계를 앞에 둠 |
| 커머스·콘텐츠 이관 |
네이버 스마트스토어(주문 재처리·상품 매핑·인증코드 발급)와 배너·팝업 노출 관리, 회원 통합검색·상세·수정 화면 이식 |
| UI 전면 개편 |
전 화면을 공통 디자인 시스템으로 통일(웹폰트 번들), 사이드바를 상단 네비로 전환하고 RBAC 기반 메뉴 동적화 |
| 목록 화면 공통화 |
정렬이 있던 화면은 열마다 링크를 손으로 그려, 필터를 하나 더할 때마다 정렬 링크도 고쳐야 했고 빠뜨리면 정렬하는 순간 필터가 풀렸음. 표 머리에 정렬 키만 달면 되는 공통 장치로 바꿔 지금 주소의 조건을 그대로 둔 채 정렬만 바꾸게 하고, 걸려 있는 조회 조건을 표 위에 칩으로 드러내 하나씩 풀 수 있게 함. 목록 영역만 부분 갱신하되 주소를 함께 바꿔 넣어 새로고침·북마크·뒤로가기가 그대로 동작하게 하고, 로그인이 풀렸거나 응답이 이상하면 빈 표 대신 그 주소로 이동. 갈아 끼운 영역 밖의 조회 조건·링크가 옛 상태에 머물거나 버튼이 떨어져 나간 옛 요소를 붙들던 것은 이벤트 위임과 영역 밖 값 동기화로 정리 |
| 운영 보안·연결 |
운영 MSSQL TLS 핸드셰이크 문제 해소, CSRF·쿠키 SameSite 정비로 간헐 403 종결, 환경별 시크릿을 전용 경로로 분리 |
| 정리를 결함 탐지 경로로 |
이관이 끝난 뒤 남은 중복과 죽은 코드를 걷어내는 일을 버그를 찾는 경로로 삼음. 매퍼가 도메인 타입을 바로 반환하게 해 옮겨 담기만 하던 중간 타입과 폼 복사층, 손으로 짠 파서를 제거하고, 호출되지 않는 코드·설정과 발급만 되고 쓰이지 않던 토큰을 걷어냄. 검색어 정리, 목록 정렬, 화면 스크립트 헬퍼, 트랜잭션 경계를 각각 한 벌로 모음. 위치 기반 생성자 매핑은 컬럼 순서가 바뀌면 오류 없이 어긋나므로 순서를 정적으로 대조하는 가드를 두었고, 이 정리 과정에서 검사 수정 시 OMR 검사지·검사코드 값이 초기화되던 것, 학교주문 목록과 정산 엑셀의 금액 칸이 한 칸씩 밀려 들어가던 것, 설명·메모를 비워 저장하면 실패하던 것을 함께 잡음 |
| 전환 안정화 |
매퍼 XML 주석이 SQL 파서와 충돌해 부팅이 실패하는 문제를 잡고, 동일 유형을 방지하는 XML 파싱 테스트 추가. 운영과 개발 DB를 실측 대조해 결손 항목을 정리하고 이관 기능을 실제 데이터로 검증. 오류를 내지 않고 조건식만 조용히 무력화돼 검색 조건이 사라지던 매퍼 문제처럼, 실패가 드러나지 않는 유형을 찾아내 회귀 테스트로 고정 |