brunch

You can make anything
by writing

C.S.Lewis

by FameLee Nov 06. 2021

노션으로 만드는 궁극의 휴가 관리 시스템 1편

노션 변태(?)의 프로젝트

목차  
1. 휴가 관리 시스템, 그게 그렇게 어려워?  
2. 노션으로 만드는 궁극의 휴가 관리 시스템  
3. 적용 예시로 101% 이해하기  
4. 여기서 만족하면 '궁극'이 아니다!  
이런 사람이라면 재밌게 읽을 수 있어요!  
1. 회사 휴가 관리가 너무 막막한 HR 담당자  
2. ERP 시스템에 관심 있는 주니어  
3. 노션 변태(?)  
미안하다 이거 보여주려고 어그로 끌었다! (출처 : <나루토>)

 '궁극의 휴가 관리 시스템'이라니... 사실 궁극이란 건 없다.  최근에 회사에서 노션으로 휴가 관리 시스템을 만드는 일을 맡았는데, 꽤나 많은 고민을 했었다. 고민이 많은 만큼, 만들어 낸 시스템이 생각보다 고퀄리티인 것 같아서 공유를 하고자 한다. 나 같이 노션 변태거나 새로운 SaaS 툴을 도입하는 게 부담이 되는 작은 규모의 스타트업이라면, 어느 정도 만족할 만한 휴가 관리 시스템을 노션에서 구현할 수 있다.

아래 링크에서 관련 템플릿을 다운 받을 수 있습니다.




휴가 관리 시스템, 그게 그렇게 어려워?

휴가, 그냥 신청하고 받아주면 되는 거 아니야?

 이렇게 생각하는 분들이 많을 것 같다. 휴가 관리는 HR 담당자가 아니면, 이걸 처리하는 게 얼마나 머리 아프고 복잡한 일인지 공감하기 어렵다. 이 프로젝트를 하기 전까지 휴가 관리 시스템이 엄청 쉽고 간단할 줄 알았다. 휴가 관리가 복잡한 이유는 워낙 경우의 수가 많고, 회사 자체 제도와 별개로 근로기준법에 해당하는 부분을 고려해야 하기 때문이다. 

HR 담당자에게 휴가 관리, 그거 그냥 대충 하면 되는 거 아니에요?라고 말한다면?


반차, 연차, 본인 결혼, 자녀 결혼, 친족 관계 사망 등등...

 그래도 아직 체감이 안 되는 분들을 위해 몇 가지 사례를 가져왔다. 많은 분들이 자신이 갖고 있는 휴가일 수를 사용하는 '반차'나 '연차' 개념을 알고 있을 것이다. 하지만, 휴가 유형에 '반차'나 '연차'만 있다고 생각하면 오산이다. 근로기준법에 의해 회사에서 준수해야 하는 몇 가지 휴가 제도가 있다.


 예를 들면, 본인이 결혼하는 경우에 자신이 보유한 휴가일 수를 소진하지 않고, 3일을 쉴 수 있다. 이걸 모르고 연차 3일을 박아버린다면? 오우 쉣!  본인이나 배우자의 부모님이 돌아가신 경우에도 휴가일 수를 소진하지 않고 5일을 쉴 수 있다. 또한, 앞선 경우에는 유급 휴가가 적용된다. 하지만, 한 달마다 쓸 수 있는 생리 휴가를 어떨까? 생리 휴가는 휴가일 소진 없이 하루를 쉴 수 있는데, 여기서는 무급 휴가로 처리된다. 이처럼 휴가 유형이 너무 다양하고, 각 유형마다 적용되는 부분도 다른데, 이 모든 것을 항상 숙지할 수 있을까?


네? 입사 연도는 같은데 전 15일 연차가 안 나온다고요?

 휴가 제도 말고도, 생성되는 연차를 계산하는 과정도 복잡하다. A군은 21년 3월 1일, B 군은 21년 10월 1일에 입사했다고 해보자. 그다음 연도의 1월 1일에 A 군은 15일의 휴가일 수를 받는다. 반면, B 군은 22년 10월 1일에 3일의 휴가일 수를 받는다. 왜 A 군과 B 군이 받는 휴가일 수는 다르고, 받는 일자도 다를까?


 입사 연도에 1년(365일)의 80% 이상을 근무했다면, 그다음 년 1월 1일에 15일의 휴가일 수를 받는다. 하지만, 80 % 미만을 근무했다면, 입사 날로부터 1년이 지난 시점에 근무일 수에 비례(15일 * 10월 1일부터 12월 31일까지의 일 수/365일)해 휴가일 수를 부여받는다.


부여된 휴가일 수는 평생 가지 않습니다.

 근속에 따라서 부여되는 휴가일 수는 크게 '연차'와 '월차'로 구분된다. '월차'는 입사일로부터 1달이 지날 때마다 1개씩 생성이 되며, 총 11개가 생성이 된다. 그리고, 사용하지 않은 월차는 입사일로부터 1년이 지난 시점에서 소멸된다. 반면, 연차는 거의 1월 1일에 생성되고, 12월 31일에 모두 소멸된다. 또한, 연차 휴가 사용 촉진 제도에 의해, HR 담당자는 연차와 월차가 소멸되기 전에 사람들에게 공지를 해야 한다. 

벌써 머리가 아파온다. 


노션으로 만드는 궁극의 휴가 관리 시스템

 노션으로 구현한 연차 시스템이 이 모든 경우의 수를 감당할 수 있을까? 정답은 NO다. FLEX 등 다양한 휴가 관리 SaaS 툴을 많은 분들이 찾는 이유도, 회사 자체적으로 이를 모두 커버하기 어렵기 때문이다. 모든 팀원이 입사한 일자가 다르므로, 고려해야 하는 경우의 수가 너무 많아져서 관리가 복잡해진다. 하지만, 규모가 작은 회사라면, 킹 갓 노션으로 충분히 (1) 다양한 휴가 제도를 모두 반영할 수 있고 (2) 복잡한 휴가 계산을 자동 처리할 수 있다. 이번에 프로젝트로 노션 기반의 휴가 관리 시스템을 만들었는데, 이를 공유해보고자 한다. 


0. 시스템 구성

 노션 휴가 관리 시스템은 [연차 보드], [연차 기록 대장], [휴가 제도]라는 3가지 데이터베이스로 구성된다. [연차 보드] DB는 [연차 기록 대장] DB와 관계를 맺고 있고, [연차 기록 대장] DB는 [휴가 제도] DB와 관계를 맺는다. 

[연차 보드] DB : 각 팀원이 갖고 있는 휴가일 수를 보여주고, [연차 기록 대장] DB의 휴가 신청 정보를 활용해 잔여 연차를 계산함
[연차 기록 대장] DB : 팀원이 신청한 휴가를 기록함. 이때, [휴가 제도] DB의 정보를 활용해 반차, 연차, 경조사, 생리 휴가 등의 휴가 유형을 선택
[휴가 제도] DB : 선택 가능한 휴가 유형을 보여줌. 각 휴가 유형 별(반차, 연차, 경조사 등)로, 연차 소진 유무, 연차 소진일 등의 정보를 저장함


전반적인 플로우는 아래와 같다.

1. [연차 보드]에 팀원의 입사일을 적으면, 생성 연차와 월차를 자동 계산
2. [휴가 제도]에 회사에서 제공하는 휴가 유형을 저장
3. 팀원이 휴가를 신청하면, [연차 기록 대장]에 해당 신청을 기록
4. 이때, [휴가 제도]에서 신청한 휴가 유형이 무엇인지 선택
5. [연차 기록 대장]에서 기록한 내용은 [연차 보드]에 바로 반영되고, 잔여 연차를 계산함


1. 연차 기록하기

 우선 연차를 기록할 공간인 [연차 기록 대장]을 만든다. 노션에서 Table DB를 만들고 아래와 같은 칼럼을 만든다

[휴가자] 칼럼 : 휴가를 신청한 사람을 선택
[휴가 기간(시작-끝)] : 휴가 기간을 입력
[휴가일 수] : 입력한 휴가 기간을 활용해 총 휴가일 수를 계산

 [휴가일 수] 칼럼은 휴가 기간을 입력하면, 자동으로 휴가일 수를 집계할 수 있도록 함수 칼럼을 활용한다. 함수 칼럼은 노션에서 제공하는 기능으로, 엑셀의 함수처럼 DB 내 데이터를 불러오고 여러 계산을 할 수 있다. 여기서 활용하는 함수는 dateBetween과 start, end 함수다. dateBetween(date 1, date 2, type) 함수는 서로 다른 두 날짜 사이의 시간을 특정한 유형(월, 일, 시 등)으로 바꿔서 Return 한다. start(date range)와 end(date range) 함수는 날짜 범위에서 시작과 끝을 각각 return 한다. 아래와 같이 함수를 입력하면, [휴가 기간(시작-끝)]에 입력한 기간의 일 수를 계산할 수 있다. 마지막에 +1을 더한 이유는 휴가가 끝나는 날도 포함시키기 위해서다.  


2. 휴가 제도 설정하기

 이 정도 수준에 만족한다면 '궁극의 노션 휴가 관리 시스템'이라 말할 수 없다. 앞서 말했듯이, 휴가 유형 중에는 '연차를 소진하는 휴가'와 '그렇지 않은 휴가'가 있다. 예를 들어 본인이나 자녀의 결혼인 경우, 연차를 소진하지 않고 회사를 쉴 수 있는데 결혼, 출산, 친족 관계 사망 등은 근로기준법상으로 회사가 의무적으로 보장해야 하는 휴가다. 이 모든 것을 하나하나 다 외울 수 있을까? 절대 불가능이다. 따라서, 굳이 외울 필요 없이 휴가를 신청할 때, 어떤 휴가 유형을 사용할지 선택할 수 있는 기능을 구현해야 한다. 이를 위해선, 각각의 휴가 유형에 대한 정보를 저장한 [휴가 제도] DB를 만들어야 한다.


 [휴가 제도] DB를 만들기 위해, 다시 새로운 Table DB를 만들고 아래와 같은 칼럼을 만든다.

[연차 소비] 칼럼 : 해당 휴가 유형이 연차를 소비하는지 알려줌
[연차 단위] 칼럼 : 단위 당 회사를 얼마나 쉬는지 보여줌
[소진 단위] 칼럼 : 단위 당 보유한 연차를 얼마나 소진하는지 보여줌

 반차는 한 번 쓸 때마다 0.5일을 쉬고, 0.5의 연차가 소진된다. 따라서, [연차 소비] 칼럼은 True가 되고, [연차 단위]와 [소진 단위] 칼럼은 모두 0.5다. 반면, 본인 결혼은 한 번 쓸 때마다 5일을 쉬는데, 이때 근로기준법상으로 연차는 소진되지 않는다. 따라서, [연차 소비] 칼럼은 False가 되고, [연차 단위]는 5, [소진 단위]는 0이다. 이처럼 회사에서 제공하고 있는 휴가 유형을 해당 DB에 모두 만든다. 유급 휴가/무급 휴가를 알려주는 칼럼 등을 추가해 더 많은 정보를 전달할 수도 있다.


 여기서 끝나면 뭔가 섭섭하다. 이런 식으로 우리 회사의 휴가 제도를 보여주면 사람들이 재밌어할까? '보기 좋은 떡이 먹기도 좋다!'라는 말이 있듯이, 디자인이 이뻐야지 계속 보는 맛이 난다. 이걸 살짝 더 이쁘게 만들고 싶다면, 2개의 함수 칼럼을 추가해주자. 함수 칼럼을 이용해 [연차 단위]와 [소진 단위] 칼럼을 더 이쁘고 직관적으로 보여줄 수 있다. 이번에 사용할 함수는 format()과 concat() 함수다. format(number)은 number 타입을 str 타입으로 바꿔주고, concat(str1, str2)는 str 타입끼리 이어준다. 두 함수를 아래처럼 이용해서 누구나 쉽게 이해 가능한 표현으로 바꿀 수 있다. 


이제 이렇게 완성된 [휴가 제도] DB의 View를 Table 형식이 아니라, Gallery 형식으로 바꿔준다. 


 이렇게 설정한 갤러리 뷰에서 [속성] - [property] - [card preview]에서 'None'을 선택한다. 그러면, 아래와 같이 깔끔한 휴가 제도판을 만들 수 있다.



3. 휴가 신청 시, 유형 선택하기

 이렇게 완성한 [휴가 제도] DB를 앞서 작업한 [연차 기록 대장] DB와 Relation 기능을 통해 이어준다면, [연차 기록 대장]에서 팀원의 휴가 신청을 기록할 때마다 휴가 유형을 선택할 수 있다. 또한, role up 기능을 이용한다면, 선택한 유형과 관련된 데이터도 불러올 수 있다. 


 이때, [연차 기록 대장] DB를 구성하는 [휴가 일 수] 함수 칼럼에 약간의 수정이 필요하다. 왜냐하면, '반차'를 고려해야 하기 때문이다. 예를 들어 2021년 12월 2일에 연차를 쓴다고 해보자. 그러면 [휴가 기간(시작 - 끝)]은 2021.12.2 ~ 2021.12.2를 범위로 설정하면 된다. 하지만, 이때 연차가 아니라 반차를 쓴다면? 마찬가지로 [휴가 기간(시작 - 끝)]은 2021.12.2 ~ 2021.12.2를 범위로 한다. 하지만 전자와 후자에서 소비하는 연차 수는 각각 1과 0.5이다. 즉, 동일한 칼럼 값을 갖고 있지만, 실제로 소비하는 연차 수는 다르다. 하지만, 앞서 만든 [휴가일 수] 칼럼에서는 이를 반영하지 못한다.


 앞서 [휴가 제도] DB와 [연차 기록 대장] DB를 연결함으로써, 쓰고자 하는 휴가 유형을 선택할 수 있다. 여기서 선택한 휴가 유형이 '반차'라면, [휴가일 수] 칼럼에서 다른 계산법을 적용하면 된다. 즉, '반차'를 쓴다면 0.5의 휴가일이라고 예외적으로 처리하면 되는데, 이는 if()와 contains() 함수를 사용하면 된다. if(boolean, val 1, val 2) 함수는 boolean이 True인 경우에 val 1을, False인 경우에 val 2를 return 한다. contains(str 1, str 2)는 str 2가 str 1 안에 들어가는지에 대한 boolean을 return 한다. 아래의 이미지처럼 함수를 구성하면, (1) 반차인 경우에 휴가 일 수를 0.5로, (2) 그 외의 경우에는 이전과 마찬가지로 서로 다른 두 날 사이의 일 수를 계산하게 만들 수 있다. 


  이제 앞서 계산한 휴가일 수를 기반으로, 실제로 연차가 얼마나 소진됐는지를 보여주는 [연차 소진일 수] 칼럼을 만들 차례다. 예를 들어, 12월 1일부터 12월 3일까지 나간다고 해보자. 이때 사유가 자녀의 결혼 때문이라면, 근로기준법에 의해서 연차를 소진하지 않고 그냥 나갔다 오면 된다. 하지만, 별다른 이유 없이 그냥 쉬고 싶은 것이라면, 총 3개의 연차를 소비해야 한다. 우리는 팀원이 선택한 휴가 유형이 연차를 소비하는지 그렇지 않은지에 대한 정보를 [휴가 제도] DB에서 이미 갖고 있다. 


 [연차 기록 대장] DB에서 선택한 휴가 유형이 연차를 소비하는지 보여주기 위해 Role up 칼럼을 이용한다. Role up 칼럼은 관계를 맺은 DB의 아이템이 갖고 있는 특정 칼럼의 데이터를 불러올 수 있다. 예를 들어, 본인 결혼은 연차를 소비하지 않는 의무 휴가이므로, [휴가 제도]에서 [연차 소비] 칼럼이 'X' 값으로 설정했다. 이 데이터를 불러오는 [연차 소비 여부] 칼럼은 아래처럼 'X' 값을 보여주고 있다. 



 이제 실제로 얼마큼의 연차가 소비되는지를 보여주는 [연차 소진일 수] 함수 칼럼을 만들면 된다. 아래의 이미지처럼, 선택한 휴가 유형이 연차를 소비하지 않는 경우에 if() 함수를 통해 0으로 인식하면 된다. 



적용 예시로 101% 이해하기

 위 과정을 통해서 팀원이 (1) 얼마나 휴가를 나갔다 오고, (2) 이때 어떤 휴가 유형으로 나갈 수 있는지 선택 가능하며 (3) 선택한 유형에 따라 얼마나 내가 보유한 휴가일 수가 소진되는지 알 수 있다. 더 쉬운 이해를 위해 예를 들어보자. 


 위의 [연차 기록 대장] DB를 보면 이명성이 총 2번의 휴가를 나갔음을 알 수 있다. 우선 10월 28일부터 11월 1일까지 결혼을 사유로 휴가를 나갔다. 본인 결혼인 경우, 근로기준법상으로 개인이 갖고 있는 휴가일 수를 소비하지 않는다. 이는 [연차 소비 여부] role up 칼럼에서 확인할 수 있다. 따라서, [휴가일 수] 칼럼을 보면 총 5일 휴가를 나갔지만, [연차 소진일 수] 칼럼은 0일을 보여준다. 물론 필자는 아직 대학생이라 전혀 해당하지 않는다!  


 그다음으로 11월 1일부터 11월 3일까지 여름휴가를 감을 알 수 있다. [휴가 종류] relation 칼럼을 보면, 휴가 유형이 '연차'가 아니라 '여름 특별 휴가 제도'를 활용했음을 알 수 있다. 해당 제도는 리프레쉬 휴가 차원으로, 개인이 보유한 휴가일 수를 소비하지 않으므로 [연차 소진일 수] 칼럼이 동일하게 0이 된다.


여기서 만족하면 '궁극'이 아니다!

다음번 글에는 (1) 팀원의 입사일만 입력한 것만으로 이번 연도의 현재 시점에서 얼마큼의 휴가일 수가 생성되는지를 자동 계산하고, (2) [연차 기록 대장] DB에서 입력한 값을 활용해 잔여 휴가일 수가 얼마나 있는지를 보여주는 [연차 보드] DB를 구현하는 방법을 다뤄보자!


다음 글 바로가기


매거진의 이전글 노션 200% 활용기_노코드 프로덕트 런칭 AtoZ 2
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari