← 포트폴리오 목록

공공기관 폐쇄망 근무평정 관리 시스템

인터넷이 차단된 사내 PC 한 대에서 단독 기동되는 근무평정 관리 웹입니다. 산식을 순수함수 엔진 하나로 통일해 화면값과 저장값이 어긋나지 않도록 구축·납품했습니다.

엑셀 대조 전 인원·전 항목 100% 일치총점·순위·변환등급·결정점수·결정등급 다섯 항목을 전원 대조해 인수 시점에 모두 일치함을 화면으로 확인했습니다.
산식 단일 소스로 화면값·저장값 불일치 차단프론트와 백엔드가 같은 순수함수 패키지를 가져다 쓰도록 구조를 잡아 계산을 두 번 구현하는 일을 없앴습니다.
전수 재현 테스트를 통과해야 엔진이 바뀌는 게이트 구축산식 코드를 고치면 전원 재계산 결과가 오차 0.01 이내로 재현되고 등급이 100% 일치해야 통과하도록 묶었습니다.
서비스 타입Web
업종공공 · 인사평가
기간2026.06 – 2026.09
기술 스택
React 18Vite 5nginxNode.js 20Express 4PostgreSQL 16Docker ComposeExcelJSJWTbcryptRechartsPretendard 자체 번들
주요 기능
  • 산식 단일 소스 엔진 — 화면값과 저장값이 다를 수 없는 구조
  • 정원 배분·등급 산출과 전 인원 전수 검산
  • 인터넷 없는 PC에서 단독 기동하는 폐쇄망 배포
  • 운영 안전장치 — 권한 분리·기간 잠금·감사 로그
  • 운전원 명단·평가 입력 운영 화면
Overview

프로젝트 개요

기간: 2026.06 – 2026.09범위: 개발, 디자인, 기획

인터넷이 완전히 차단된 사내 PC 한 대에서 단독으로 도는 근무평정 관리 웹을 구축·납품했습니다. 운전원 1,000명 규모의 근무평정을 담당자 서너 명이 엑셀 워크북으로 관리하던 업무를, 명단 관리부터 정량 7·정성 2 지표 입력, 직급별 정원 배분과 등급 산출, 결과 엑셀 내보내기와 결재용 인쇄까지 하나의 시스템으로 옮겼습니다. 관리자 웹 11개 화면, API 40개 엔드포인트, 6개 테이블을 신규로 만들었고, 웹·API·데이터베이스 세 컨테이너를 명령 한 번으로 함께 띄웁니다. 이미지를 tar로 반입해 오프라인에서 설치하며, 화면 폰트까지 번들해 외부로 나가는 요청이 한 건도 없습니다. 화면은 담당자의 업무 순서를 그대로 따릅니다. 대시보드에서 등급 배분과 진행률을 확인하고, 운전원 관리에서 명단을 정비한 뒤, 평가 입력에서 지표 점수를 채웁니다. 결과·등급 화면에서 산출 결과를 확인하고 개인별 산출 근거를 열어 보며, 평가 이력에서 기간별 결과를 비교합니다. 수식 관리에서 가중치와 등급 컷오프를 조정하고, 검산 화면에서 기존 엑셀과 대조하며, 병가 대조로 근태 반영분을 맞추고, 계정 관리와 작업 로그로 운영을 통제합니다. 이 구조는 근무평정에 한정되지 않고, 외부망을 쓸 수 없는 조직의 인사·심사·정산 업무에 같은 골격으로 응용할 수 있도록 설계했습니다.

작업 범위

  • 기획: 담당자가 쓰던 엑셀 워크북의 셀 수식을 역추적해 정량 7개(운행횟수·운행거리·민원·교통사고·법규위반·미운행·상벌가점)와 정성 2개 지표, 직급별 정원 누적 컷오프, 등급 그룹 내 정규화 규칙을 복원하고 요구사항 정의서와 화면 설계서로 확정했습니다
  • 디자인: 결재 문서로 그대로 인쇄할 수 있는 보고서형 레이아웃을 적용했습니다. 차트 라이브러리를 쓰지 않고 표와 CSS 막대로 등급 배분과 부서 평균을 표현해, 화면과 인쇄본이 같게 보이도록 맞췄습니다. 등급 스택바에는 인원과 등급을 읽어 주는 대체 텍스트를 넣어 색만으로 정보를 전달하지 않도록 했습니다
  • 개발: React 18 관리자 웹과 Node.js·Express API, PostgreSQL 데이터베이스를 신규 구축하고, 산식 계산을 순수함수 패키지로 분리해 프론트와 백엔드가 같은 코드를 쓰도록 했습니다
  • 인프라: 도커 컴포즈 단독 기동 구성, 루프백 바인딩, 자동 백업과 복구 스크립트, 오프라인 설치 절차를 정비했습니다
  • 문서: 요구사항 정의서, 화면 설계서, 데이터베이스 설계서, 시스템 아키텍처와 배포 구성도, 관리자용 사용 매뉴얼을 작성했습니다. 매뉴얼에는 가중치와 기준 점수를 바꾸는 방법, 백업과 복구, 패치 적용과 되돌리기 절차를 담아 담당자가 개발자 없이 운영할 수 있게 했습니다

주요 업무

  • 산식 엔진 단일화: 총점·환산·직급 내 순위·정원 배분·정규화·등급을 순수함수 패키지 한 곳에 모으고, 입력 화면의 미리보기와 서버의 확정 저장이 같은 함수를 호출하도록 만들었습니다. 계산을 양쪽에서 각각 구현하지 않으므로 미리 보여 준 점수와 저장된 점수가 어긋날 수 없습니다
  • 전수 재현 게이트: 산식 코드를 수정하면 대상자 전원을 다시 계산해 기존 결과와 오차 0.01 이내로 재현되고 등급이 100% 일치해야 통과하도록 테스트를 묶었습니다. 저장소 전체로는 125개 테스트 파일로 회귀를 막았습니다
  • 엑셀 워크북 적재와 검산: 담당자가 쓰던 워크북을 업로드하면 원천 지표를 읽어 적재하고, 업로드 전후로 무엇이 달라지는지 차이를 먼저 보여 줍니다. 인수 확인용으로는 엑셀 산출값과 시스템 재계산 결과를 전 인원·다섯 항목에서 대조하는 화면을 따로 두었습니다
  • 설정 버전 보존: 가중치와 등급 컷오프를 바꾸면 기존 설정을 덮어쓰지 않고 새 버전을 추가한 뒤 활성 버전만 바꿉니다. 과거 기간의 평가가 그때 기준으로 남아 나중에도 근거를 설명할 수 있습니다
  • 대시보드와 결재 문서화: 직급별 평가 대상과 등급 분포를 합계행까지 갖춘 표로 보여 주고, 부서별 평균 결정점수를 가로 막대로 표시합니다. 인쇄하면 상단 메뉴와 버튼, 우측 요약 패널이 빠지고 표만 남아 결재 문서로 바로 쓸 수 있습니다
  • 근태 반영과 이력 관리: 병가 대조 화면에서 근태에 따른 반영분을 맞추고, 평가 기간을 반기 단위로 나눠 기간별 결과를 저장·조회합니다. 기간을 바꿔도 그때 활성이던 산식 버전이 함께 표시되어 어떤 기준으로 산출된 결과인지 알 수 있습니다
  • 운영 안전장치: 수식 관리와 작업 로그는 마스터 계정에만 메뉴가 보이고 서버에서도 차단합니다. 평가 기간을 잠그면 입력이 동결되며, 등록·수정·삭제가 감사 로그에 남아 누가 언제 무엇을 바꿨는지 추적됩니다. 로그인 실패 횟수 제한과 세션 만료도 함께 적용했습니다
공공기관 폐쇄망 근무평정 관리 시스템
요구사항 정의

프로젝트 핵심 과제

프로젝트 진행 시 해결한 핵심 기술 과제입니다.

요구사항 정리와 엑셀 산식 역추적

담당자가 쓰던 엑셀에서 정량 7·정성 2 지표와 정원 배분·정규화 규칙을 역추적해 요구사항 정의서와 화면 설계서로 확정했습니다.

DB 설계와 산식 엔진 구축

평가·기간·설정·감사 등 6개 테이블을 설계하고 산식을 순수함수 패키지로 분리했습니다. 전수 재현 테스트를 함께 만들어 이후 변경을 게이트로 묶었습니다.

관리자 화면과 엑셀 적재·검산 구현

대시보드·명단·평가 입력·결과·이력·수식 관리 화면을 만들고 워크북 업로드와 전수 대조 화면을 붙였습니다.

폐쇄망 배포 구성과 보안 하드닝

컴포즈 단독 기동 구성, 루프백 바인딩, 권한 이중 차단, 세션 만료, 백업·복구 스크립트를 정비했습니다.

현장 설치·사용자 확인과 준공

인터넷이 없는 현장 PC에 이미지를 반입해 설치하고 담당자와 함께 실제 데이터로 결과를 대조했습니다. 이어서 사용 매뉴얼을 포함한 산출물 6종을 정리해 인계하고 준공 서류를 제출했습니다.

구현 내용

핵심 기능 상세

핵심 기능 1

산식 단일 소스 엔진 — 화면값과 저장값이 다를 수 없는 구조

총점·환산·순위·정원배분·정규화·등급 계산을 순수함수 패키지 하나에 모으고 프론트 미리보기와 백엔드 확정 계산이 같은 코드를 씁니다. 계산을 두 번 구현하지 않으므로 두 값이 어긋날 수 없습니다.

  • scoring 패키지를 web·api가 공유 import
  • 정량 7 지표 + 정성 2 지표 → 환산 → 총점 파이프라인
  • 설정 변경은 새 버전 INSERT + 활성 플립(과거 기준 보존)
  • 전수 재현 테스트를 통과해야 엔진 변경이 반영됨

산식을 프론트와 백엔드가 각각 구현하면 반드시 갈라집니다. 한 곳에 두고 양쪽이 import 하는 것이 유일한 해법이었습니다.

산식 단일 소스 엔진 — 화면값과 저장값이 다를 수 없는 구조
산식 단일 소스 엔진 — 화면값과 저장값이 다를 수 없는 구조 실제 화면
핵심 기능 2

정원 배분·등급 산출과 전 인원 전수 검산

직급별 정원 컷오프로 변환등급을 정하고 등급 그룹 안에서 총점을 정규화해 결정등급을 산출합니다. 개인별 계산 경로를 단계별로 펼쳐 보고, 기존 엑셀과 전 인원·다섯 항목을 대조해 모두 일치함을 확인했습니다.

  • 직급별 정원 누적 컷오프 → 변환등급
  • 등급 그룹 내 총점 정규화 → 결정점수
  • 개인별 산출 근거 6단계 분해 모달
  • 엑셀 대비 전 인원 5개 항목 전수 대조

평가는 결과보다 근거를 설명할 수 있어야 받아들여집니다. 숫자가 나온 경로를 되짚게 하고, 기존 엑셀과 전수 대조해 의심을 없앴습니다.

정원 배분·등급 산출과 전 인원 전수 검산
정원 배분·등급 산출과 전 인원 전수 검산 실제 화면
핵심 기능 3

인터넷 없는 PC에서 단독 기동하는 폐쇄망 배포

외부 통신이 전혀 없는 사내 PC 한 대에서 명령 한 번으로 웹·API·데이터베이스가 함께 뜨도록 구성했습니다. 이미지를 tar로 반입해 오프라인 설치하며 폰트까지 번들해 외부 요청이 없습니다.

  • 컨테이너 3종(nginx·Node·PostgreSQL) 단일 compose 기동
  • 이미지 tar 반입 + 오프라인 설치 절차
  • 127.0.0.1 루프백 바인딩으로 해당 PC에서만 접속
  • Pretendard 자체 번들 — 외부 CDN 요청 0

포트를 모든 인터페이스에 열면 랜선을 꽂는 순간 사내망 어느 PC에서든 열립니다. 루프백에 고정해 접속 범위를 서면 약속대로 묶었습니다.

인터넷 없는 PC에서 단독 기동하는 폐쇄망 배포
인터넷 없는 PC에서 단독 기동하는 폐쇄망 배포 실제 화면
핵심 기능 4

운영 안전장치 — 권한 분리·기간 잠금·감사 로그

수식 관리와 작업 로그는 마스터 계정에만 노출되고 서버에서도 차단합니다. 평가 기간을 잠그면 입력이 동결되며 등록·수정·삭제가 감사 로그에 남습니다.

  • 마스터 전용 메뉴 + 서버 측 403 이중 차단
  • 평가 기간 잠금으로 확정 후 입력 동결
  • 감사 로그 자동 적재 + 마스터 조회 화면
  • 로그인 실패 제한과 세션 만료·자동 로그아웃

메뉴만 숨기는 권한은 권한이 아닙니다. 화면과 서버 양쪽에서 막아야 우회가 없습니다.

운영 안전장치 — 권한 분리·기간 잠금·감사 로그
운영 안전장치 — 권한 분리·기간 잠금·감사 로그 실제 화면
핵심 기능 5

운전원 명단·평가 입력 운영 화면

1,000명 규모 명단을 엑셀로 일괄 등록하거나 개별 등록·수정하고 사번·이름 검색과 직급 필터로 대상을 찾습니다. 평가 입력에서 진행 상태를 보며 점수를 채우고 병가 대조로 근태 반영분을 맞춥니다.

  • 엑셀 일괄 업로드 + 개별 CRUD
  • 사번·이름 검색과 직급 필터
  • 대상자별 입력 진행 상태 표시
  • 병가 대조 화면으로 근태 반영분 정산

담당자 서너 명이 1,000명을 다루므로, 어디까지 입력했는지가 항상 보여야 일이 끊기지 않습니다.

운전원 명단·평가 입력 운영 화면
운전원 명단·평가 입력 운영 화면 실제 화면
구현 과정

프로젝트 진행 단계

STEP 1

요구사항 정리와 엑셀 산식 역추적 · 2026.06

담당자가 쓰던 엑셀에서 정량 7·정성 2 지표와 정원 배분·정규화 규칙을 역추적해 요구사항 정의서와 화면 설계서로 확정했습니다.

STEP 2

DB 설계와 산식 엔진 구축 · 2026.07

평가·기간·설정·감사 등 6개 테이블을 설계하고 산식을 순수함수 패키지로 분리했습니다. 전수 재현 테스트를 함께 만들어 이후 변경을 게이트로 묶었습니다.

STEP 3

관리자 화면과 엑셀 적재·검산 구현 · 2026.07

대시보드·명단·평가 입력·결과·이력·수식 관리 화면을 만들고 워크북 업로드와 전수 대조 화면을 붙였습니다.

STEP 4

폐쇄망 배포 구성과 보안 하드닝 · 2026.08

컴포즈 단독 기동 구성, 루프백 바인딩, 권한 이중 차단, 세션 만료, 백업·복구 스크립트를 정비했습니다.

STEP 5

현장 설치·사용자 확인과 준공 · 2026.08

인터넷이 없는 현장 PC에 이미지를 반입해 설치하고 담당자와 함께 실제 데이터로 결과를 대조했습니다. 이어서 사용 매뉴얼을 포함한 산출물 6종을 정리해 인계하고 준공 서류를 제출했습니다.

프로젝트 성과

주요 성과

엑셀 대조 전 인원·전 항목 100% 일치총점·순위·변환등급·결정점수·결정등급 다섯 항목을 전원 대조해 인수 시점에 모두 일치함을 화면으로 확인했습니다.
산식 단일 소스로 화면값·저장값 불일치 차단프론트와 백엔드가 같은 순수함수 패키지를 가져다 쓰도록 구조를 잡아 계산을 두 번 구현하는 일을 없앴습니다.
전수 재현 테스트를 통과해야 엔진이 바뀌는 게이트 구축산식 코드를 고치면 전원 재계산 결과가 오차 0.01 이내로 재현되고 등급이 100% 일치해야 통과하도록 묶었습니다.
인터넷 없는 PC에서 단독 기동이미지를 tar로 반입해 오프라인 설치하고 명령 한 번으로 웹·API·데이터베이스를 함께 띄우도록 구성했습니다.
산출물 6종 납품 후 준공요구사항 정의서·화면 설계서·ERD·아키텍처 및 배포 구성도·사용 매뉴얼·소스와 이미지를 인계하고 준공 서류를 제출했습니다.
Highlights

기술적 주안점

  • 엑셀 대조 전 인원·전 항목 100% 일치
  • 산식 단일 소스로 화면값·저장값 불일치 차단
  • 전수 재현 테스트를 통과해야 엔진이 바뀌는 게이트 구축
  • 인터넷 없는 PC에서 단독 기동
  • 산출물 6종 납품 후 준공

유사한 프로젝트를 기획하고 계신가요?

FIRSTPIP이 개발 범위와 로드맵을 함께 정리해드립니다

무료 상담 시작하기