한 사람도 놓치고 싶지 않아서 직접 HR 앱을 만들었습니다

HR팀 조엘

Joel

  • 피플 & 컬쳐
  • 피플

매일 아침, 스프레드시트부터 열었습니다

또 놓친 건 없을까. 아침마다 같은 스프레드시트를 열었습니다. 계약 만료, 퇴직금 지급일, 비자 만료… 챙길 건 여기저기 흩어져 있는데, 누가 시킨 것도 아닌 이 점검을 매일 반복했어요.

HR 업무는 정확함도 기한도 놓치면 수습이 어렵습니다. 계약 만료를 미리 체크하지 못하면 연장 협의가 늦어지고, 퇴직금 지급일을 놓치면 법적으로도 문제가 될 수 있어요. 그래서 이 반복 작업을 멈출 수가 없었습니다.

그러다 이런 생각이 들었어요. 이 모든 일을 꼭 사람이 다 해야만 할까?

채널코퍼레이션 HR팀의 조엘입니다. 개발자가 아닌 HR 담당자가, Claude Code의 도움을 받아 HR 알림봇과 HR App을 직접 만들었습니다

이 글의 모든 화면 이미지에 나오는 이름·숫자는 실제 데이터가 아닙니다. 기능을 보여주기 위해 만든 가상의 데모 데이터이며, 실제 구성원 정보나 회사 현황과는 무관합니다.

HR 알림봇: 매일 아침 09:30, 오늘 챙겨야 할 것들이 와요

기존에는

여러 탭을 오가며 날짜를 직접 계산했습니다. 계약 만료, 휴직 종료일, 퇴직금 지급일, 외국인 비자 만료일이 모두 다른 탭에 흩어져 있었어요. D-30 같은 사전 알림은 오늘 날짜를 기준으로 직접 계산해야 했고, 항목이 많다 보니 세세하게 챙기는데 시간이 오래 걸렸습니다.

이제는

매일 아침 09:30, 채널톡으로 오늘 챙겨야 할 이벤트가 자동으로 옵니다.

매일 아침 도착하는 HR 알림봇 메시지예요. 오늘 챙길 이벤트만 한 번에 모아 보내줍니다. (예시)

현재 6가지 항목을 커버하고 있어요.

·       퇴사: 마지막 근무일 당일

·       계약 만료: D-30, D-14, D-7, D-0

·       퇴직금 지급: 다음 주 지급 예정자

·       휴직 종료: D-14, D-1, D-0 / 육아휴직이면 “자녀보육수당 신청” 안내 자동 포함

·       외국인 임직원: 여권·체류 비자 만료

·       자녀보육수당 비과세 종료

챙길 게 없는 날엔 아예 알림이 오지 않아요. 알림이 없다는 건 오늘 놓칠 게 없다는 뜻이에요.

구조는 단순합니다

Google Sheets에서 데이터를 읽고, n8n이 매일 아침 조건을 계산해서, 해당되는 항목만 채널톡으로 보냅니다.

물론 처음부터 매끄럽진 않았어요. 에러가 날 때마다 임시방편을 덧붙였고, 그 임시방편이 또 다른 문제를 만들었습니다. 한참을 헤매고 나서야 알았어요. 쌓지 말고 구조를 바꿔야 한다는 걸요. Claude Code에 “이 부분은 이렇게 다시 짜줘”라고 몇 번이나 다시 요청하고 나서야, 매일 아침 안정적으로 작동하는 봇이 됐습니다.

봇을 만들기 전까지는 머릿속에 항상 뭔가 걸려 있었어요. 오늘이 마지막 근무인 멤버가 있었나? 이번 주에 휴직이 끝나고 복직을 하는 멤버가 있지는 않았나? 확인하지 않으면 찜찜하고, 확인하려면 스프레드시트를 열어야 했습니다.

지금은 그 걱정이 없어요. 챙겨야 할 게 있으면 아침에 알림이 오고, 없으면 오늘은 없는 거니까요. 그 시간에 오프보딩 프로세스 개편과 같은 기획성 업무들을 도전합니다.

봇을 켠 뒤 지난 두 달간, 놓친 알림은 0건이에요.

흩어진 일을 한곳에 HR App을 만들었습니다

알림봇이 ‘놓치지 않게’ 해줬다면, 그다음 고민은 ‘한곳에서 하기’였어요.

오프보딩은 이 페이지에서, 인원 현황은 저 시트에서, 보상 자료는 또 다른 폴더에서. 업무 하나 하려고 탭을 대여섯 개씩 오갔어요. 게다가 리더십이 “지금 우리 몇 명이지?” 하고 물으면, 그때마다 시트를 뒤져 정리해 드렸고요.

그래서 다 한곳에 모으기로 했어요. 우리 팀이 매일 쓰면서, 동시에 리더십에게 그대로 펼쳐 보여줄 수 있는 화면으로요. 그게 HR App입니다.

그런데 화면보다 먼저 한 일

바로 화면부터 만들고 싶었지만, 멈칫했어요. 아무리 좋은 AI라도 바라볼 데이터가 엉망이면 엉뚱한 걸 보여주거든요. 그래서 가장 먼저 한 건 화려한 화면이 아니라 시트 청소였습니다.

우리 HR 데이터는 줄곧 스프레드시트에 누적해왔는데, 데이터가 차곡차곡 쌓여 있다는 점에서도 보안 면에서도 그대로 두는 게 맞다고 봤어요. 그래서 새로운 DB로 옮기는 대신, 이 시트를 잘 정리해 그대로 활용하기로 했습니다.

정리 작업은 이런 것들이었어요.

·       소속 팀 표기 기준을 통일했어요. 조직이 수시로 바뀌고 위계도 복잡하다 보니, 멤버마다 소속 팀을 적는 기준이 제각각이었거든요. 그래서 규칙을 정했어요. 가장 큰 조직을 ‘Large 팀’, 바로 위에 속한 팀을 ‘Small 팀’으로 적고, 그 사이 중간 단계 팀들은 생략하기로요.

·       더 이상 쓰지 않는 불필요한 열들은 과감하게 걷어냈고요,

·       기존 시트에는 현재 연봉과 현재 레벨(직급)만 적혀 있어서, 과거 이력을 보려면 Google Drive를 뒤져야 했어요. 그래서 App Script로, 연봉이나 레벨이 바뀌면 다른 탭에 히스토리가 자동으로 누적되도록 만들어 뒀습니다.

정리한 인사데이터 시트예요. 사번·닉네임·소속 팀(Large/Small)·레벨·연봉을 한 시트에서 관리하고, 아래 탭으로 연봉·레벨 히스토리가 따로 쌓입니다. (예시 데이터)

App Script로 만든 자동 누적 로직이에요. 연봉이나 레벨이 바뀌면 변경 이력이 히스토리 탭에 한 줄씩 자동으로 쌓입니다. (예시)

이렇게 시트가 깔끔해진 뒤에야, 그 시트를 연동해 Claude Code로 웹페이지를 짓기 시작했어요.

한 번에 완성되진 않았어요. Claude Code에 “이런 화면을 만들어줘”라고 하면 초안이 나오고, “이건 이렇게 바꿔줘”를 수없이 반복하며 다듬었어요. 코드를 쓴 건 Claude지만, 무엇이 필요하고 무엇이 어색한지 판단해 끝까지 끌고 간 건 저였습니다.

현재 HR App의 기능은 크게 4가지예요

하나씩 소개해드릴게요.

1. HR Dashboard: 리더십이 궁금해할 숫자를 한 화면에

1-1. 재직 인원과 이번 달 입·퇴사, 보상 변동자를 한눈에 보여주는 핵심 지표 영역이에요. (데모 데이터)

리더십이 자주 묻는 질문이 있어요. 지금 우리 몇 명이지? 이번 달 몇 명 들어오고 나갔지? 퇴사율은 괜찮나? 매번 정리해 드리는 대신, 열면 바로 보이는 화면으로 만들었어요. 단순 머릿수가 아니라 1년 전 입사자 중 몇 명이 남았는지 보는 코호트 퇴사율, 페이밴드를 벗어난 인원까지 한 화면에 둡니다.

2. 구성원: 멤버를 더 잘 이해하기 위해

예전엔 한 사람을 파악하려면 시트·드라이브·리뷰 문서를 다 열어야 했어요. 이제는 카드 하나면 됩니다.

2-1. 프로필·레벨·재직기간·연봉과 페이밴드 내 위치(Compa-ratio)를 함께 보여주는 구성원 카드예요. (데모 데이터)

전체 임직원을 카드로 보는 화면이에요. 재직중 / 퇴사자 두 탭으로 나뉘고, 이름·직무로 검색하거나 팀·레벨·직군으로 좁힐 수 있어요. 카드마다 레벨·재직기간·연봉과 페이밴드 안에서의 위치(Compa-ratio)까지 담겨 있습니다.

멤버를 누르면 개인 상세로 들어가, App Script로 쌓아둔 연봉·레벨 변동 이력을 한 곳에서 볼 수 있어요.

3. 오프보딩: 퇴사 처리의 처음부터 끝까지

퇴사 처리는 챙길 게 많아, 빠뜨린 건 없을지 늘 여러 번 확인해야 했어요. 이제는 한 명을 추가하면 할 일이 알아서 떠요.

이름을 검색해 퇴사자를 추가하면 그 한 명의 오프보딩 과정을 끝까지 따라가는 화면이나와요. '퇴사 확정 → 2~3일 전 → 당일'로 나뉜 체크리스트, 퇴사자 서베이 발송, 면담 노트까지 한 곳에서 진행해요. '면담 일정 잡기'를 누르면 구글 캘린더 초대도 바로 보낼 수 있고요.

그렇게 쌓인 면담과 서베이는 퇴사 사유·재직기간 분포, 추천 지수(NPS) 같은 조직 차원의 패턴으로 모여요. 한 사람의 퇴사를 처리하는 일이, 그대로 조직의 데이터가 되는 거예요.

3-1. 한 명 한 명의 퇴사 처리가 모여 만들어지는 조직 차원의 패턴이에요 -퇴사 사유·재직기간 분포와 서베이(NPS·재직경험). (데모 데이터)

그런데 오프보딩이 데이터로만 끝나는 건 아니에요. 마지막엔 '채널 졸업 편지'가 있거든요. 떠나는 사람이 그동안 함께 일한 동료들에게 남기는 작별 인사인데요. 고마웠던 순간, 함께 배운 것, 못다 한 말들을 편지로 적으면 그 글을 HR팀이 대신 동료들에게 전해드려요.

4. HR Report: 매달의 HR을 기록으로 남기기

리포트는 사실 그동안 미뤄두고 있었어요. 만들려면 시간이 많이 드는 데다, 어떤 데이터를 담아야 할지도 모호했거든요. 그런데 이제는 매달 리포트를 냅니다.

4-1. 인원·입퇴사·퇴직률·보상 변동을 한 페이지에 담은 월간 HR 리포트예요. (데모 데이터)

매달의 HR 현황을 한 페이지로 정리해 리더십에 공유하고, 그달의 기록으로 남기는 화면이에요. 숫자는 원본 시트에서 자동으로 계산되고(‘새로고침’ 한 번), 직접 쓴 사유·다음 목표는 그대로 유지돼요. 다 쓰면 발행해 읽기 전용으로 잠급니다.

앞으로는

지금은 HR팀이 보는 화면이지만, 다음 목표는 권한을 나누는 거예요. 같은 앱이라도 보는 사람에 따라 다른 데이터가 보이게요. 팀 매니저에게는 자기 팀원의 현황을, 구성원에게는 자신에게 필요한 정보를 각자에게 필요한 만큼만 열어주려고 합니다.

그러면 구성원은 굳이 HR에 묻지 않아도 자기 정보를 확인하고, 매니저는 팀을 운영할 때 데이터를 직접 들여다보게 돼요. HR은 정보를 전달하고 취합하는 역할에서, 더 나은 판단을 돕는 역할로 한 걸음 더 갈 수 있고요. 그렇게 되면 HR이 일일이 옮기던 정보가, 각자의 화면에서 스스로 흐르게 되겠죠.

HR 자동화, 그다음의 HR 숙제?

처음 떠올렸던 질문으로 돌아가 볼게요. 이 모든 일을 꼭 사람이 다 해야만 할까?

답은 “아니다” 였어요. 날짜를 계산하고, 탭을 오가고, 누가 언제 무엇을 해야 하는지 기억하는 일, 그건 사람이 안 해도 되는 일이었고, 도구로 넘기는 데 개발자가 필요하지도 않았어요. 현장에서 뭐가 불편한지 가장 잘 아는 사람이 저였고, Claude Code에 설명하는 것만으로 알림봇과 앱이 만들어졌으니까요.

그런데 여기서 진짜 숙제가 시작돼요. 사람이 안 해도 되는 일을 AI가 한다면, 사람인 HR은 이제 뭘 해야 할까?

올해 초까지만 해도 저는 HR을 '지금 있는 사람들을 잘 챙기고 관리하는 일'이라고 생각했어요. 그런데 자동화로 번 시간을 사람에게 쓰며 상반기를 보내고 나니, 고민의 무게중심이 옮겨갔어요. '이거 놓치면 어쩌지, 챙길 건 없나' 하던 행정의 걱정에서 '이 사람은 지금 어떨지, 우리 팀엔 뭐가 필요할지' 하는 사람에 대한 고민으로요.

"인원을 챙기던 소문자 hr에서, HR이 본질적으로 뭘 해야 하는지 다시 묻는 대문자 HR로"

정답을 찾았다기보단, 그 질문을 이제야 제대로 던지기 시작했다고 생각해요.

거창한 결론은 없습니다. 다만 분명한 건, 무언가를 놓치지 않으려 쓰던 마음을 이제 사람에게 더 쓸 수 있게 됐다는 거예요. 도구가 일을 덜어준 그 자리에, 결국 사람과, 사람에 대한 질문이 남았습니다.

.

We Make a Future Classic Product