공군 점수 계산기 개발기 (SEO, 데이터 예측, UX 개선)
2025년 12월 3일

서론
뉴스 보도에서도 알 수 있듯이, 공군 지원자 수는 해마다 꾸준히 증가하고 있습니다. 경쟁률이 높아질수록 지원자들은 “내 점수가 충분할까?”에 더 민감해지고, 점수 계산과 합격선에 대한 관심도 함께 높아지고 있습니다.
하지만 공군에 지원해 본 사람이라면 한 번쯤 이런 생각을 해보셨을 것입니다.
- “점수 계산식이 왜 이렇게 복잡하지?”
- ”헌혈과 봉사활동 점수는 중복 적용이 되나?”
- ”이 점수 정도면 이번 기수에 붙을 수 있을까?”
주변 동기들도 입대 전 같은 문제를 겪었고, 다양한 커뮤니티에서도 많은 질문 글이 올라왔습니다.
출처 - 디시인사이드 공군갤러리
공식 문서에는 점수 계산식이 모두 공개되어 있고, 병무청에서도 공식 계산기를 제공하고 있습니다.
하지만 실제로는 점수가 잘못 계산되거나, 항목 간 반영 기준이 일관되지 않아 오류가 발생하는 사례도 적지 않았습니다.
또한 구글에 검색해보면 여러 비공식 계산기들이 존재하지만,
- 최신 차수의 컷라인이 반영되지 않거나,
- 모바일 화면에서 정상적으로 작동하지 않거나,
- 단순 합산 결과만 보여주고 합격 가능성에 대한 해석은 제공하지 않는 경우가 대부분이었습니다.
그래서 저는 단순히 점수를 계산하는 도구가 아니라,
데이터를 기반으로 “이 점수로 실제로 합격할 수 있을까?”를 예측해주는 계산기를 만들어보기로 했습니다.
문제 정의
공군 점수 계산기는 이미 여러 곳에서 제공되고 있었지만, 실제로 사용해보면 대부분 다음과 같은 문제점이 있었습니다.
1. 점수 예측이 아닌 단순 계산
대부분의 사이트는 사용자가 입력한 값을 단순히 더해 최종 점수만 보여주는 형태였습니다. 합격선과의 거리나, 실제 합격 가능성은 전혀 알 수 없었습니다.
즉, 단순 계산기일 뿐 ‘예측 시스템’은 존재하지 않았습니다.
2. 공식 병무청 계산기의 모바일 한계
병무청에서도 공식 계산기를 제공하고 있지만, 모바일 화면에서는 입력 UI가 깨지거나 반응형 처리가 되지 않아 실제 지원자들이 사용하는 환경에서는 불편했습니다.
공식 계산기임에도 실제 사용성 측면에서는 접근성이 떨어졌습니다.
3. 최신 제도 반영의 부재
2026년 입대(2025년 9월 지원)부터 점수 계산식이 일부 변경되었지만, 대부분의 계산기들은 여전히 이전 제도 기준으로 계산식을 적용하고 있었습니다.
그 결과, 최신 규정에 맞게 점수를 계산하려는 사용자들이 잘못된 결과를 받는 경우가 많았습니다.
이 문제들을 해결하기 위해 최신 제도와 실제 데이터를 모두 반영한 공군 점수 예측 시스템을 개발하게 되었습니다.
설계 목표
기존 계산기들이 단순히 점수만 합산해 보여주는 데 그쳤다면, 이번 프로젝트에서는 점수 예측이 핵심 기능이라고 생각했습니다.
단순히 공식 계산식을 구현하는 것을 넘어서, 실제 지원 데이터와 컷라인 변동을 분석해 합격 가능성을 추정하는 구조로 설계했습니다.
핵심 기능은 다음과 같습니다.
- 최신 제도 반영 — 2026년부터 변경된 점수 계산식을 적용하고, 특기별 기준에 따라 계산
- 데이터 기반 예측 — 최근 2년간의 컷라인 데이터를 바탕으로 점수 대비 합격 가능성을 추정
- 모바일 최적화 — 공식 계산기에서 불편했던 UI를 개선해, 스마트폰에서도 계산을 편하게 할 수 있도록 구현
이 세 가지 방향을 중심으로 공군 지원자들에게 도움이 되는 공군 점수 계산기를 만들고자 했습니다.
기술 스택
프로젝트는 Next.js, Tailwind CSS, Zustand를 기반으로 구현했습니다. Vercel을 통해 정적 페이지로 배포한 완전한 클라이언트 사이드 서비스입니다.
이 서비스는 서버가 전혀 없는 구조로 동작합니다. 모든 계산과 예측 로직이 브라우저에서 즉시 실행되며, 사용자의 입력 데이터가 서버로 전송되지 않습니다. 이런 구조를 선택한 이유는 단순합니다.
빠른 응답 속도, 낮은 유지보수 비용, 그리고 데이터 보안성을 동시에 확보하기 위해서입니다.
도메인은 util.jongung.com을 사용하고 있습니다. 서브도메인을 util로 설정한 이유는, 앞으로 작지만 유용한 웹 유틸리티들을 모아 제공하는 공간으로 확장하기 위함입니다.
변경에 유연한 설계
공군의 선발 배점 기준은 해마다, 심지어 기수마다 미세하게 바뀝니다. 자격증 배점 방식이 바뀐다거나 헌혈, 봉사점수가 신설된다는 식입니다. 그때마다 컴포넌트 코드를 수정하고 배포하는 건 비효율적입니다. 그래서 저는 화면을 그리는 로직과 화면을 정의하는 데이터를 완전히 분리했습니다.
Config-driven UI
핵심은 TrackCalculatorClient 컴포넌트가 외부에서 주입된 JSON 설정 파일(Rulebook)을 읽어서 그리도록 하는 것입니다.
예를 들어, 일반기술병의 선발 기준을 정의한 JSON은 다음과 같은 구조를 가집니다.
// rulebook.json (Example)
{
"id": "generalTech",
"stages": [
// 1. 전형 단계 정의 (순서대로 렌더링됨)
{
"id": "first",
"label": "1차 서류 전형",
"sections": ["license", "attendance"]
},
{
"id": "second",
"label": "2차 면접 전형",
"sections": ["interview"]
}
],
"sections": {
// 2. 각 항목(Field)의 동작 방식 정의
"license": {
"label": "자격/면허",
"component": "select", // -> Select UI 렌더링
"source": "licenses/general" // -> 사용할 옵션 데이터
},
"attendance": {
"label": "출결",
"component": "number", // -> 숫자 입력 Input 렌더링
"unit": "일"
},
"interview": {
"label": "면접",
"component": "rating" // -> 1~5점 별점/슬라이더 UI 렌더링
}
}
}보시다시피 JSON에는 UI에 대한 구체적인 구현 내용이 없습니다. 단지 어떤 순서로, 어떤 타입의 입력을 받을지만 명시되어 있습니다.
이제 리액트 컴포넌트는 이 JSON을 순회하며 알맞은 UI 블록을 끼워 맞추는 역할을 합니다
// TrackForm.tsx
export function TrackForm({ track }) {
return (
<div className="space-y-8">
{/* 1. Stage 순회: 1차 서류, 2차 면접... */}
{track.stages.map((stage) => (
<section key={stage.id}>
<Badge>{stage.label}</Badge>
<div className="space-y-4">
{/* 2. Section 순회: 자격증, 출결, 면접... */}
{stage.sections.map((sectionId) => {
const config = track.sections[sectionId];
// 3. Component 타입에 따른 동적 렌더링 (Factory Pattern)
return (
<FieldRenderer
key={sectionId}
type={config.component} // 'select' | 'number' | 'rating'
config={config}
/>
);
})}
</div>
</section>
))}
</div>
);
}배포 없이 설정 파일 교체만으로 앱의 전체 구조를 바꿀 수 있는 이 설계 덕분에, 유지보수 비용을 획기적으로 줄일 수 있었습니다.
실제로 26년 모집부터는 25년과는 완전히 바뀐 점수 배점 시스템이 적용 되었는데, json 설정을 통해 유연하고 쉽게 점수 배점을 바꿀 수 있는 구조로 제작하였습니다.
합격 점수 예측하기
"내 점수가 80점이다"라는 사실만으로는 합격을 장담할 수 없습니다. 12월 입대에서의 80점과 3월 입대에서의 80점은 완전히 다르기 때문입니다.
가장 큰 변수는 계절성입니다. 대학생들이 주축인 공군 지원 특성상, 학기 복학 시점(칼복학)에 맞출 수 있는 2~4월 입대는 성수기로 경쟁률과 커트라인이 치솟고, 반대로 학기 중이나 애매한 시기는 비성수기로 점수가 내려가는 패턴이 있습니다.
저는 이 패턴을 시스템에 녹이기 위해 다음과 같은 로직을 적용했습니다.
- 과거 데이터 수집: 병무청에서 공개한 최근 2년간의 기수별/특기별 커트라인 데이터를 수집하여 데이터베이스화했습니다.
- 추세 분석: 단순히 직전 기수의 점수만 보는 것이 아니라, 작년 동월과 직전 3개월 추세를 함께 분석합니다. 예를 들어, 3월 입대를 희망한다면 작년 3월의 경쟁률 상승폭을 가중치로 둡니다.
- 구간 예측: 이를 통해 점수를 단순히 '합격/불합격'의 이분법으로 나누지 않고, 안정권 / 소신 지원(적정) / 위험의 3단계 구간으로 시각화하여 보여줍니다.
이 예측 모델 덕분에 사용자들은 단순히 "내 점수가 몇 점이다"를 넘어, "이번 달에는 좀 위험하니 자격증을 하나 더 따야겠다" 또는 “헌급방(헌병, 급양, 방공포 특기 고정) 가산점을 써야겠다”는 구체적인 전략을 세울 수 있게 되었습니다.
뇌피셜이 아닌 데이터로 UX 개선하기
기능 구현이 끝난 뒤에는 사용자 경험을 다듬는 데 집중했습니다. 제 스마트폰에서는 충분히 편해 보였지만, 실제 사용자들도 그렇게 느낄지는 확신할 수 없었기 때문입니다.
Microsoft Clarity를 연동해 히트맵과 세션 리플레이를 분석해보니, 제 생각과는 다른 문제들이 보였습니다.
1. 한 손 조작의 어려움
많은 사용자가 이동 중에 한 손으로 스마트폰을 조작하고 있었습니다. 이때 화면 좌측 상단에 위치한 초기화 버튼이나 내비게이션 요소에 엄지손가락이 닿지 않아 터치 미스가 발생하는 현상이 히트맵에 뚜렷하게 잡혔습니다.
2. 인식되지 않는 버튼
특정 디자인의 선택지 버튼을 사용자가 클릭 가능한 요소로 인식하지 못해 헤매는 모습도 세션 리플레이를 통해 확인할 수 있었습니다.
이 데이터를 바탕으로 주요 버튼을 엄지손가락 반경 내로 재배치하고, 버튼의 시인성을 높이는 작업을 진행했습니다. 실제 행동 데이터를 기반으로 UI를 개선한 결과 사용자 이탈률을 유의미하게 줄일 수 있었습니다.
정리
단순히 어려움을 겪는 사람들을 보고 만든 툴이었으나, 결과는 기대 이상이었습니다.
먼저 월간 활성 사용자(MAU) 5,000명 이상이 사용하는 서비스가 되었습니다.
Vercel Analytics에서 실제 유입 추이 — 월간 5,000명 이상 사용
또한 SEO 최적화 덕분에, 현재 네이버에서 "공군 점수 계산"을 검색하면 공식 병무청 사이트보다 상단에 노출되고 있습니다.
네이버 검색시 최상단 위치
간단하게 만든 프로덕트를 예비 공군인들이 좋게 평가해 준다는 것도 참 재밌는 경험이었습니다.
공군 최대규모 오픈채팅방 내용
간단한 유틸리티들을 더 만들고 고도화 해야겠습니다 :)
👉공군 점수 계산기 사용해보기
https://util.jongung.com/airforce-score-calculator/general-tech