← 포트폴리오 목록

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

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

프로젝트 납품 요약

고객 과제

엑셀로 관리하던 근무평정 산식을 보존하면서 인터넷이 차단된 사내 PC에서 평가 업무를 처리해야 했습니다.

개발 범위

평가 산식 엔진, 명단·평가 입력 화면, 엑셀 적재·검산, 권한 분리와 감사 로그, 오프라인 설치 구성을 개발했습니다.

납품 결과

현장 PC에 설치하고 담당자와 기존 엑셀 결과를 대조했습니다. 요구사항 정의서·화면 설계서·ERD·배포 구성도·사용 매뉴얼·소스와 이미지를 인계했습니다.

아래 프로젝트 개요와 핵심 기능에서 구현 화면을 확인할 수 있습니다.

서비스 타입Web
업종공공 · 인사평가
기간2026.06 – 2026.09
기술 스택
React 18Vite 5nginxNode.js 20Express 4PostgreSQL 16Docker ComposeExcelJSJWTbcryptRechartsPretendard 자체 번들
주요 기능
  • 산식 단일 소스 엔진 — 화면값과 저장값이 다를 수 없는 구조
  • 정원 배분·등급 산출과 전 인원 전수 검산
  • 인터넷 없는 PC에서 단독 기동하는 폐쇄망 배포
  • 운영 안전장치 — 권한 분리·기간 잠금·감사 로그
  • 운전원 명단·평가 입력 운영 화면

프로젝트 개요

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

인터넷이 완전히 차단된 사내 PC 한 대에서 단독으로 동작하는 근무평정 관리 웹을 구축·납품했습니다. 담당자들이 엑셀 워크북으로 관리하던 근무평정 업무를 명단 관리부터 정량·정성 지표 입력, 직급별 정원 배분과 등급 산출, 결과 엑셀 내보내기와 결재용 인쇄까지 하나의 시스템으로 옮겼습니다. 웹·API·데이터베이스를 명령 한 번으로 함께 띄우고 화면 폰트까지 번들해 외부로 나가는 요청이 한 건도 없으며, 외부망을 쓸 수 없는 조직의 인사·심사·정산 업무에도 같은 골격으로 응용할 수 있도록 설계했습니다.

작업 범위

  • 기획: 기존 엑셀 워크북의 셀 수식을 역추적해 정량 7·정성 2 지표와 직급별 정원 컷오프, 등급 정규화 규칙을 복원하고 요구사항 정의서·화면 설계서로 확정
  • 디자인: 결재 문서로 바로 인쇄할 수 있는 보고서형 레이아웃을 적용해 화면과 인쇄본이 같게 보이도록 맞추고, 등급 분포는 색만이 아닌 텍스트로도 읽히도록 구성
  • 개발: React 관리자 웹과 Node.js·Express API, PostgreSQL 데이터베이스를 신규 구축하고, 산식 계산을 공용 패키지로 분리해 프론트와 백엔드가 같은 코드를 사용
  • 인프라·문서: 도커 컴포즈 단독 기동과 오프라인 설치, 백업·복구 스크립트를 정비하고, 담당자가 개발자 없이 운영할 수 있도록 설계서와 사용 매뉴얼 작성

주요 업무

  • 산식 엔진 단일화: 총점·순위·정원 배분·등급 계산을 한 곳에 모으고 화면 미리보기와 서버 확정 저장이 같은 함수를 쓰게 해, 보여 준 점수와 저장된 점수가 어긋날 수 없는 구조 구현
  • 전수 재현 검증: 산식을 수정하면 대상자 전원을 다시 계산해 기존 결과와 오차 0.01 이내로 재현되고 등급이 100% 일치해야 통과하도록 테스트로 고정
  • 엑셀 적재와 검산: 기존 워크북 업로드 시 변경 차이를 먼저 보여 주고, 엑셀 산출값과 시스템 재계산 결과를 전 인원·다섯 항목에서 대조하는 검산 화면 제공
  • 운영 안전장치: 가중치·등급 기준 변경 시 이전 설정을 버전으로 보존하고, 평가 기간 잠금, 마스터 전용 기능의 서버 차단, 감사 로그와 로그인 제한을 적용
공공기관 폐쇄망 근무평정 관리 시스템
요구사항 정의

프로젝트 핵심 과제

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

기존 엑셀과 같은 결과

문서로 정리되지 않은 규칙이 셀 수식에 섞여 있어, 직급별 정원 누적 컷오프와 등급 그룹 내 정규화까지 복원해 엑셀과 같은 값을 내야 했습니다.

화면값과 저장값의 불일치

입력 화면의 미리보기 점수와 저장 후 조회 점수를 따로 구현하면 반드시 갈라지므로, 산식을 순수함수 패키지 하나로 모아 프론트와 백엔드가 함께 쓰게 했습니다.

산식 변경의 회귀 위험

가중치나 규칙을 고칠 때 기존 결과가 조용히 바뀌지 않도록, 전원 재계산 결과가 오차 0.01 이내로 재현되고 등급이 모두 일치해야 반영되게 묶었습니다.

인터넷이 없는 설치 환경

외부 저장소에 접근할 수 없어 이미지를 tar로 반입해 설치하고, 화면 폰트까지 번들해 외부로 나가는 요청을 없앴습니다.

접속 범위 제한

포트를 모든 인터페이스에 열면 사내망에 연결되는 순간 다른 PC에서도 접속되므로, 루프백에 고정해 설치된 PC에서만 열리도록 했습니다.

구현 내용

핵심 기능 상세

핵심 기능 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 / 관리자 화면과 엑셀 적재·검산 구현 · 2026.07

평가·기간·설정·감사 등 6개 테이블을 설계하고 산식을 순수함수 패키지로 분리했습니다. 전수 재현 테스트를 함께 만들어 이후 변경을 게이트로 묶었습니다. 대시보드·명단·평가 입력·결과·이력·수식 관리 화면을 만들고 워크북 업로드와 전수 대조 화면을 붙였습니다.

STEP 3

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

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

STEP 4

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

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

개발 결과

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

기술적 주안점

  • 산식 단일 소스 — 입력 화면 미리보기와 서버 확정 저장이 같은 순수함수를 호출해 두 값이 어긋날 수 없음
  • 전수 재현 게이트 — 산식 코드를 고치면 전원 재계산 결과가 기존과 일치해야만 반영
  • 설정 버전 보존 — 가중치·등급 기준을 덮어쓰지 않고 새 버전으로 추가해 과거 평가의 산출 근거 유지
  • 인수 대조 화면 — 기존 엑셀과 시스템 결과를 전 인원·다섯 항목에서 비교해 전환 시점의 불안을 화면으로 해소
  • 폐쇄망 단일 명령 기동 — 컨테이너 세 개를 한 번에 띄우고 백업·복구·패치 되돌리기를 스크립트로 제공

다양한 도메인 응용

  • 외부망을 쓸 수 없는 조직의 인사·심사·정산 업무 시스템
  • 규칙이 자주 바뀌는 평가·심사 시스템
  • 엑셀로 관리하던 계산 업무의 시스템 전환
  • 의료·금융처럼 외부 통신이 제한된 환경의 오프라인 설치형 서비스

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

필요한 기능과 일정을 알려주시면 개발 범위를 함께 정리하겠습니다.

프로젝트 문의