본문 바로가기

자동화를 위한 잡동사니

회사의 휴가 관리 프로세스를 자동화하기

기존 우리 회사의 휴가 관리는 이렇게 돌아갔다.

  1. 직원이 엑셀 양식에 휴가 정보를 채워서 인쇄
  2. 종이 신청서에 사인 → 팀장 결재
  3. 인사담당자가 별도 구글 시트(휴가일정표)에 수동 입력
  4. 직원은 구글 시트에 적힌 휴가일정과 남은 연차 확인

그러던 중 휴가 신청서를 출력한 것을 보다 오타가 난 것을 보고

다시 뽑아야 한다는 생각에 짜증이 훅!!! 들어왔다.

 

중소기업의 장점은 누구든 본인과 상관없는 일을 손댈 수 있다는 것이기에

오늘은 클로드로 이거를 개편해야겠구나 싶었다.

 

문제는 명확했다.

신청서를 쓸 때 오타나 잔여연차 계산 실수도 종종 발생했다.

또한 휴가 신청 1건당 인사담당자가 시트에 입력해야 했고, 입사·퇴사·새해마다 수십 곳을 수동 갱신해야 했다.

그래서 만들었다. 기존의 Google Sheets를 활용해서 Apps Script Web App를 이용해 통합 휴가 관리 시스템을 자동화 처리하기로 했다.


어떤 시스템을 만들었나

핵심 워크플로우는 이렇게 단순화됐다:


관리자가 손을 대야 할 일은 단 두 가지로 줄어들었다.

  • 신입 입사 / 퇴사 시 메뉴 클릭
  • 매년 1월 새해 초기화 메뉴 클릭

기술 스택

구성 요소 사용 기술

데이터 저장소 Google Sheets
백엔드 로직 Google Apps Script (V8)
신청 폼 UI HTML + Vanilla JavaScript
배포 Apps Script Web App
비용 무료 (기존 Google Workspace 활용)

 

어차피 기존의 Google Sheets를 활용하는 것이기에

서버도 없고, DB도 없고, 호스팅도 필요 없다. 회사가 이미 쓰는 Google Workspace 안에서 모든 게 돌아간다.


시트 구조 설계: DB와 View 분리

가장 먼저 고민한 건 시트 구조였다. 

중요한 것이 아니기에 일을 크게 만들기는 싫어서 최대한 기존 틀에서 벗어나지 않으려 했다.

기존에는 연차현황과 휴가일정표만 있었으나 신청서를 작성할 때 데이터가 필요하다 보니 데이터 시트와 뷰 시트를 분리하는 것으로 하였다.

직원명단 직원 정보 마스터
휴가신청내역 모든 신청 기록 (DB)
휴가일정표 월별 캘린더 뷰
연차현황 직원별 사용/잔여 통계
공휴일 공휴일 정보

 

핵심 원칙:

  • 휴가신청내역에 1건 추가되면, 휴가일정표·연차현황은 SUMIFS·COUNTIFS로 자동 재계산
  • 직원별 잔여연차도 수식으로만 계산. 어디에도 잔여를 직접 저장하지 않음
연차현황 잔여기간 = 연차총량 - 선사용 - 사용일수
연차현황 사용일수 = SUM()  // 1~12월 합
연차현황 1월 사용 = SUMIFS(휴가신청내역, ...)

 

이렇게 만들면 데이터 정합성이 자동으로 보장된다. 휴가신청내역 행 하나만 정확하게 추가하면, 뷰 시트들은 알아서 따라온다.


핵심 기능 1: Web App 휴가 신청 폼

직원 입장에서 가장 중요한 건 신청 폼이다. UX 원칙은 단순했다: 클릭 최소화, 자동 계산 최대화.

[신청자 선택]      → 잔여연차 자동 표시
[휴가 유형 선택]    → 시간 자동 설정 (연차, 반차, 반반차, 기타)
[시작일/종료일]     → 토/일/공휴일 자동 스킵
[시간 설정 조정]    → 점심시간 가로지르면 자동 1시간 보정
[제출]            → 잔여 자동 차감 + 시트 갱신

 

 

원래 업무를 하며 중간중간 시키는데 점심시간을 보정하는 것을 잘 이해하지 못하는 것 같았다.

기계라 그런가 쉬는 것을 잘 이해를 못 하는지 몇 번은 도돌이표 같은 느낌으로 빙빙 돌다 처리가 되었다.

 

그리고 시간을 설정하는데 출근 시간이 직원마다 다르다 보니

직원명단시트에 출근시간 컬럼을 추가해서 시작시간을 신청자에 맞추어 자동으로 설정되도록 처리했다.


핵심 기능 2: 월 셀렉트 휴가일정표

처음 휴가일정표 시트에는 기존과 같이 1년 치(12개월)를 모두 펼친 거대한 시트를 만들려고 했다.

그런데 중소기업은 어디나 그렇겠지만 입사와 퇴사가 자주 있기에 그때마다 추가나 삭제를 해야 하다 보니 수식들이 꼬이게 된다.

 

그래서 A1=연도, B1=월 드롭다운 만들고, 셀들은 모두 DATE($A$1, $B$1, day) 기반 수식으로 해서 통째로 해당 월에 맞추어 표시되도록 만들었다.

조건부 서식으로 토(파랑), 일(빨강), 공휴일(분홍), 휴가(하늘색)를 자동 색칠. 휴가일정표 하나만 보면 누가 언제 쉬는지, 그날이 평일인지 휴일인지 한눈에 파악된다.


핵심 기능 3: 미니 캘린더 + 공휴일 시각화

신청서를 보다 보니 공휴일이 언제인지 알 수가 없었다.

나도 모르게 언제더라 하고 네이버 달력을 검색하려다 그냥 작성폼 안에 미니 캘린더를 넣었다.

 

미니 캘린더에서 보이는 정보:

  • 토요일(파랑) / 일요일(빨강)
  • 공휴일(분홍 배경 + 빨간 글씨 + 작은 이름 표시)
  • 시작일~종료일 범위 하이라이트
  • 오늘 날짜 파란 테두리
  • 셀 클릭 → 시작일 자동 설정

공휴일 데이터는 공휴일 시트에서 가져오는데 클로드에게 올해 공휴일 데이터를 가져오라 해서 복붙해 넣었다.

그런데 회사창립일이나 대체공휴일 같은 것은 가져올 수 없다 보니 그런 건 확인해서 직접 넣어주는 식으로 만들었다.


핵심 기능 4: 인쇄 양식

서명은 받아야 하기에 출력을 하기 위해서 폼 제출 후 신청서를 인쇄해서 팀장에게 결재받는 흐름은 그대로 유지해야 했다.

기존 회사 엑셀 양식은 클로드를 통해 분석해서 HTML/CSS로 그대로 재현했다.

 

양식 중 부서나 직책과 같은 신청자별 해당 사항은 직원명단시트에 데이터를 넣어두고 가져오는 방식으로 처리했다.

인쇄 처리를 하던 중 머리글과 바닥글에 불필요한 데이터가 표시되어서 그건 표시되지 않도록 수정했다.

 

신청서 양식에서 제출을 누르면

자동으로 폼 데이터(이름·부서·기간·시간·잔여연차 등)가 채워지고, 직원은 인쇄 버튼만 누르면 신청서가 출력된다.


핵심 기능 5: 관리자 메뉴

스프레드시트 상단에 "휴가관리" 커스텀 메뉴를 만들었다.

휴가관리
  ├── 휴가일정표 재생성
  ├── 연차현황 재생성
  ├── 전체 재생성
  ├── ─────────────────
  ├── 직원 입사 추가...        ← 모달 폼
  ├── 직원 퇴사 처리...        ← 모달 폼
  ├── ─────────────────
  ├── 새해 초기화...           ← 연도 입력
  └── 공휴일 동기화...         ← 연도 입력

 

휴가일정표나 연차현황을 누군가가 잘못 건드리거나 수정하다 오류가 나는 때가 있다 보니

휴가신청내역 시트를 바탕으로 재생성할 수 있는 메뉴들을 추가했다.

 

그리고 직원이 입사하거나 퇴사 처리하는 버튼도 추가해서

인원 변동이 생길 경우 휴가일정표나 연차현황이 자동으로 갱신되도록 하였다.

 

마지막으로 새해나 공휴일 처리도 넣어서 비기술자 인사담당자도 메뉴 3~4개만 알면 시스템을 운영할 수 있도록 했지만

말일이나 새해쯤 되면 확인을 위해 손을 봐야 할 것 같은 느낌이 든다.


추후 발전할 만한 사항

1. 신청자와 팀장의 결재 처리 온라인화

이건 시간이 좀 더 나면 될 거 같긴 한대 일단은 지금 시스템이 고착화되면 고려할 예정.

2. 공휴일 완전 자동화

회사창립일은 매년 넣어줘야 하기에 한번 넣으면 매년 되도록 하고 대체 공휴일도 잘 가져올 방법이 필요한데. 공휴일은 공공데이터 포털을 이용하면 가져올 수 있을 거 같은데 이것도 중요하진 않기에 다음으로 미룸.


마무리

총 개발시간은 하루정도 걸린 거 같다.

중간에 작업 중 "이런 시스템까지 필요할까?" 싶었지만, 클로드를 열심히 녹이여서 막상 만들고 나니 회사 규모와 무관하게 가치가 있었다.

 

언제나 이런 것을 하고 나면 내 개인 프로젝트도 이렇게 술술 생각이 나면 좋을 텐데 계속 이것저것 찔러본다는

생각만 계속 드는 것이 아쉽다,