지난 글들에서 직원 출퇴근 앱을 직접 만들어 쓰는 이야기를 했습니다.
출근·퇴근을 찍는 것까지는 어렵지 않았는데, 정작 손이 제일 많이 간 건
그 기록을 급여로 바꾸는 부분이었습니다.
급여명세서가 단순할 줄 알았는데 아니었습니다. 우리 매장만 해도 조건이 이렇게 섞여
있었거든요.
- 어떤 직원은 시급제, 어떤 직원은 월급제
- 주 15시간 넘게 일하면 주휴수당을 얹어야 함
- 한 사람이 매장 두세 곳을 옮겨 다니며 일하기도 함 (그럼 명세서는 한 장?)
이번 글은 이 뒤엉킨 조건을 어떻게 정리했는지에 대한 운영 노트입니다. 코드는
최소한만, "왜 이렇게 했나"에 집중하겠습니다.
[사용자: 급여 정산을 예전엔 어떻게 하셨는지 한 줄 — 예: 엑셀로 매달 손계산, 시간 얼마나 걸렸는지 등]
1. 설정과 명세서를 따로 보관하기
처음에 한 결정이 하나 있습니다. 직원별 급여 설정(시급인지 월급인지, 시급
단가, 각종 수당)과 매달 찍히는 명세서를 서로 다른 곳에 저장한 겁니다.
이유는 단순합니다. 시급을 한번 올리면, 올린 다음 달부터만 바뀌어야지
지난달 명세서 금액까지 따라 바뀌면 안 되니까요. 명세서를 만들 때 그 시점의
설정값을 복사해서 박아두면, 나중에 단가를 바꿔도 과거 명세서는 그대로 남습니다.
회계상 지난 금액이 멋대로 바뀌지 않는다는 건 생각보다 중요했습니다.
2. 시급 계산 — 그 달 출퇴근 기록을 통째로 더한다
시급제 직원의 기본급은 결국 그 달 일한 시간 × 시급입니다. 그래서 그 달
1일부터 말일까지 출근·퇴근이 둘 다 찍힌 기록만 골라, 일한 시간을 초 단위로
전부 더한 다음 시간으로 환산합니다.
여기에 우리 매장만의 항목이 하나 더 붙습니다. 게임 진행 회차 수당입니다.
방탈출 매장이라, 직원이 그 달에 진행한 게임 회차를 출퇴근 기록에 같이 적어두고
"회차 × 회차당 단가"를 특별수당으로 얹습니다. 일반 출퇴근 앱엔 없는 칸이죠.
[사용자: 회차 수당을 따로 두는 이유 한 줄 — 예: 손님 많은 날 진행 부담을 보상하려고 등]
3. 주휴수당 — 이게 제일 헷갈렸다
자영업 하시는 분이면 한 번쯤 들어보셨을 겁니다. 주 15시간 이상 일하면 하루치를
유급으로 더 줘야 한다는 주휴수당이요. 그런데 막상 자동으로 계산하려니 함정이
있었습니다.
주휴는 "한 달에 몇 시간"이 아니라 "한 주에 몇 시간"으로 따져야 합니다.
그래서 같은 출퇴근 기록을 이번엔 주 단위로 다시 묶어서, 각 주마다 따로
판정했습니다. 그 주에 15시간 이상 일했으면, 그 주 하루 평균 근무시간(하루 최대
8시간까지)을 주휴시간으로 얹습니다.
예) 어떤 주에 5일, 총 40시간 일함
→ 15시간 넘으니 주휴 대상
→ 하루 평균 8시간 → 주휴 8시간 추가 유급월급제 직원은 보통 주휴가 월급에 포함돼 있어서 이 계산을 따로 안 합니다.
시급제 직원에게만 적용됩니다. 손으로 하면 매주 따져야 해서 빠뜨리기 쉬운데,
이걸 자동으로 잡아주는 게 명세서 모듈을 만든 가장 큰 이유 중 하나였습니다.
4. 한 사람이 여러 매장에서 일할 때 — 명세서 한 장으로 합치기
가장 까다로웠던 게 이겁니다. 한 직원이 매장을 옮겨 다니며 일하면, 매장마다
별도 아이디로 출퇴근을 찍습니다. 그런데 급여는 사람 단위로 한 장이
나가야 하죠. 명세서가 매장 수만큼 쪼개져 나가면 직원도 헷갈리고 저도 헷갈립니다.
그래서 계정 하나를 "대표 계정"으로 정하고, 같은 사람의 다른 매장 계정들을 그
대표 밑으로 묶었습니다. 명세서를 만들 때는 묶인 계정 전체의 기록을 한꺼번에
더합니다.
여기서 두 가지를 특히 신경 썼습니다.
- 주휴도 합쳐서 판정 — 1호점에서 10시간, 2호점에서 8시간 일했으면 그 주는
합쳐서 18시간이라 주휴 대상입니다. 매장별로 따로 보면 둘 다 15시간 미만이라
주휴를 놓치게 됩니다. 직원 입장에선 손해죠. 그래서 반드시 합산해서 봅니다. - 그래도 매장별 내역은 따로 표시 — 합치되, 명세서에는 "1호점 32시간 /
2호점 28시간" 식으로 매장별로 얼마나 일했는지 같이 보여줍니다. 직원이
자기 명세서를 봤을 때 어느 매장 몫인지 알 수 있게요.
그리고 월별 명세서 목록에서는 하위 계정을 숨겨서, 한 사람이 목록에 여러 번
뜨지 않게 했습니다.
[사용자: 실제로 매장을 옮겨다니며 일하는 직원이 있는지, 통합 명세서를 보고 직원 반응이 어땠는지 한 줄]
5. 작은 편의 — 아이디 끝자리로 매장 자동 채우기
소속 매장을 매번 입력하기 귀찮아서, 아이디 끝자리가 1이면 1호점, 2면 2호점
식으로 자동으로 채워지게 했습니다. 작은 매장 운영용 앱이라 이런 "관례 기반
기본값"이 입력 수고를 꽤 줄여줍니다. 완벽한 규칙은 아니지만, 대부분의 경우를
덮어주면 충분하더라고요.
6. 확정하고, 이메일로 보내기
명세서는 "작성 중"과 "확정" 두 상태가 있습니다. 작성 중에는 자유롭게 고치고,
확정해야 비로소 직원이 자기 명세서를 볼 수 있습니다. 실수로 지우는 걸 막으려고
확정된 명세서는 바로 삭제도 안 되게 했습니다.
확정한 명세서는 직원 이메일로 보낼 수 있습니다. 한 명씩 보낼 수도, 그 달 전체를
한 번에 보낼 수도 있고요. 누구에게 언제 보냈는지도 다 기록에 남습니다.
이메일 발송 쪽 자세한 이야기는 다음 시리즈에서 따로 다루겠습니다.
1년 운영하며 알게 된 것
- 급여명세서는 "계산기"가 아니라 "기록 보관소"에 가깝습니다. 지난 금액이
멋대로 바뀌지 않게 그 시점 설정을 박아두는 게 핵심이었습니다. - 주휴수당은 무조건 주 단위로 따져야 합니다. 월 단위로 뭉뚱그리면 틀립니다.
손계산할 때 가장 많이 틀리는 부분이기도 합니다. - 한 사람이 여러 매장에서 일하면, 급여는 사람 단위로 합치되 매장별 내역은
보여주는 게 직원도 저도 편했습니다.
다음 글 예고
이 시리즈는 5편으로 계획되어 있습니다.
- (4편) Vercel 함수 12개 한도 — 무료로 운영하면서 기능을 어떻게 욱여넣는가
- (5편) Cron과 푸시 알림 — 자정에 미퇴근 직원 잡아내는 자동화 + 명세서 이메일 발송
각 편의 상세 기술 노트는 자매 사이트 「주간 소식」의 개발일지 시리즈에도 올라갑니다 → https://weekly-postman.vercel.app/posts/dev-attendance-web-3-payroll
다 읽어주셔서 감사합니다. 직원 급여 정산을 직접 정리하고 계신 자영업자
분 계시면, 어떤 부분이 제일 골치셨는지 댓글로 알려주세요. 다음 편에
참고하겠습니다.
— 사장J · 자매 사이트 「주간 소식」 https://weekly-postman.vercel.app (일상·동네 관찰)
'1인 개발 노트' 카테고리의 다른 글
| 카카오 API 처음 연동하다가 막힌 것들 (0) | 2026.06.08 |
|---|---|
| 직원이 퇴근을 안 찍고 갔어요 — 자정에 자동으로 잡아주게 만들기 (0) | 2026.06.04 |
| 서버 비용 0원으로 버티기 — 무료 한도 12칸 안에 기능 다 욱여넣기 (0) | 2026.06.02 |
| 직원이 매장 PC를 돌려쓸 때 로그인은 어떻게 짜야 하나 — 1년 굴려보고 정한 인증 구조 (0) | 2026.05.29 |
| 자영업자가 직접 만든 직원 출퇴근 웹앱 — 1년 0원으로 운영한 기록 (0) | 2026.05.25 |