중년코딩
357
2019-05-14 10:51:52 작성 2019-05-15 05:40:30 수정됨
2
719

[중년코딩|2-1]코딩 없이 구글시트로 만드는 도서대여


안녕하세요. 직장생활 15년만에 코딩을 시작한 대머리 아저씨입니다. 텃밭 물주기 프로젝트를 끝내고 좀 쉬어 가는 의미로 오늘은 도서대여 프로세스를 해볼까 합니다. NLP챗봇 해보라는 말씀을 들었지만, 고민이 좀 필요해서 제가 익숙한 거부터 먼저 해봅니다. 

도서대여 프로그램은 crud게시판과 함께 db연습하는 분들은 꼭 한 번씩 해 보시지요? 흔하디 흔한 프로그램입니다.

이걸 파이썬과 db로 구현하면 남들 다 하는 거니 별로 재미가 없겠죠. 코딩 없이 구글시트의 함수와 구글설문지, 그리고 Zapier만으로 만들어 봅니다. 재밌겄쥬?

이게 왜 중년"코딩"이냐. 구글 시트도 "함수"를 쓰고, 일종의 테이블...입니다. 라고 대충 우겨 봅니다.



저희 회사에서는 직원들이 원하는 책을 주제, 가격 가리지 않고 무제한으로 사줍니다. 사람들이 모두 착해서 마구잡이로 사지는 않는데 사람이 많아지면서 좀 고민이 생겼습니다. 관심사들이 비슷하다 보니 다른 사람이 샀던 책을 신청하는 경우가 종종 생기고 자기가 읽었는데 재밌었던 책을 추천하고 싶기도 합니다. 슬랙에 책읽기 채널을 만들어서 돌려 읽는 분들도 나왔습니다. 회사에서 산 책들은 휴게실 책꽂이에 반납하게 했는데 잘 작동하지 않습니다.

그래서 1. 회사에서 구매해준 책들을 현재 누가 갖고 있는지 확인하고 2. 자기가 보고 싶은 책은 반납해달라고 조르고 3. 반납할 때는 한줄평을 남기는 프로세스를 만들어 보기로 했습니다. 프로그램이 아니라 프로세스라고 쓴 건 아까도 말했듯 코딩이 안 들어가기 때문입니다. 

얼마 전에 읽은 글 중에 디자인은 how it looks가 아니라 how it works라는 구절이 있었습니다. 사내 도서는 요금을 받는 게 아니라서 제때 반납할 유인이 별도로 없습니다. 제대로 작동하는 프로세스를 만들기 위해서는 그 프로세스를 안 지키면 매우 불편해지고, 프로세스를 지키는 게 별로 귀찮지 않도록 해줘야 합니다. 여기서는 2번이 그걸 담당합니다. 내가 읽던 책의 반납 처리를 제대로 하지 않으면 다른 사람들이 책을 내놓으라고 졸라댑니다. 귀찮겠쥬? 거기에 한줄평을 많이 남기면 사람들이 도움이 될 테니 연말에 한줄평을 제일 많이 남긴 사람과 가장 많은 사람들이 대여한 책을 구매신청한 사람에게 10만원 도서상품권을 주기로 합니다.

남은 것은 도서 대여, 반납이 귀찮지 않게 만들어주는 일입니다. 구글시트를 선택한 이유는 회사에서 구글 이메일을 쓰고 있기 때문입니다. 즉, 회사에서는 거의 모든 직원이 gmail로그인 상태이므로 도서대여처리를 하기 위해 별도의 인증을 거칠 필요가 없습니다. 귀찮음을 한 단계 줄였습니다. 사람들은 생각보다 매우 게으른 존재입니다. 토스가 1조짜리 회사가 된 게 다 사람들이 공인인증서 암호 입력하기 귀찮아해서 아닙니까? 이 도서대여 구글시트가 몇 억짜리가 될지도 모릅니다. 

만, 취미생활이므로 업무시간 끝나고 만들어 봅니다.


세 가지가 필요합니다.

1. DB역할을 할 시트의 구조

2. DB에 자료를 입력할 구글 설문지

3. 반납조르기를 할 슬랙 연결

아까도 얘기했듯 3번이 핵심입니다. 사람은 기본적으로 게으르기 때문에 졸라야 합니다. 인사 총무 업무를 하다보니 성악설을 믿게 됩니다. 아, 물론 다 좋은 사람들이죠. 그 좋은 사람들이 왜.... 아닙니다.

어쨌든,

1. DB설계

2. 설문지 작성

DB설계와 설문지 작성은 모두 구글 시트에서 이뤄지니 하나로 합쳐 적습니다.

DB설계를 하려다 보니 막막합니다. 대학교 때 교양으로 배웠던 정보처리개론에서 관계형 데이터베이스가 어쩌고 배웠는데 20년 전 일이니 어제 먹은 술 종류도 기억 안나는 제가 기억하고 있을리 없습니다. 구글링을 해봅니다. 역시 대중적인 코딩주제이니만큼 많은 학부생들이 과제로 만들어 놓은 도서대여DB구조들이 있습니다. DB설계를 할때는 마스터DB와 트랜잭션DB를 만들어야 한다고 하네요. 그럴듯 합니다. 마스터 DB로는 책 정보 마스터와 회원정보 마스터를 만들어야 하는데, 구글 인증을 쓰기로 했으니 회원정보 마스터는 인사팀에서 관리하는 직원 리스트를 갖다 씁니다. 책정보 마스터를 만들고, 한줄평을 관리할 리뷰 마스터를 만듭니다. 키값으로는 그냥 일련번호를 씁니다. ISBN을 쓰려고 했는데 총무 직원이 ISBN입력을 절반쯤 하다 말았습니다. "쓸 일이 없는 거 같아서"라고 하시네요... 빅데이터 시대에 쓸 일이 없는 데이터가 어디있냐고 하려다가 그 쓸일이 제 취미 생활이라는 게 민망해서 그냥 제가 시간날 때 입력하기로 합니다.

도서정보 마스터에는 ISBN을 바탕으로 인터넷서점의 책 정보를 크롤링해서 가져올 겁니다. 구글시트에는 importhtml혹은 importxml이라는 걸출한 크롤링 툴이 있습니다. 게다가 구글시트니까 동일한 함수를 여러 셀 값에 따라 적용하면 됩니다. 네. 코딩할 때 리스트 안에 있는 값들에 대해 순환문 돌리는 거랑 똑같습니다. 

휴대폰으로 쓰고 있어서 날라갈까봐 일단 여기서 저장 한 번 하고 계속 쓰겠습니다. 백업은 필수죠. 다들 아시잖아요?ㅎ(역시 날아갔군요. 복사해 놓은 게 남아 있어서 다행입니다.)

트랜잭션DB의 액티비티?는 구매(=대여), 대여, 반납으로만 관리합니다. 예약 트랜잭션을 만들까 했다가 복잡성이 올라가서 포기합니다. 구매 마스터DB는 구매담당 직원이 관리합니다. 신청을 받고 구매한 도서가 오면 신청자와 구매도서 정보를 시트에 기록합니다. 기존 프로세스와 동일합니다. 이 정보를 이제 가져와서, 1. 도서 정보를 크롤링으로 가공하고 2. 신청자가 대여를 했다는 트랜잭션을 생성해 줍니다. 

책 제목으로는 결과값이 여러 개 나와서 크롤링이 힘듭니다. 교보문고는 도서 상세 정보 url이 ISBN으로 되어 있습니다. 완전 땡큐입니다. 구매직원이 ISBN만 다시 입력해주면 도서 상세 정보 url을 구글함수로 생성해서 importxml로 크롤링해올 수 있습니다. 자세한 함수는 2편에 적습니다. 네, 이것도 3편 시리즈물입니다.

구매=대여로 처리해서 클릭질 한 번을 줄였습니다. 인간은 게으르니까요. 이제 나머지 트랜잭션인 반납, 대여 처리를 할 설문지를 만듭니다. 구글 시트는 구글 설문지라는 쓸만한 입력도구를 갖고 있습니다. 게다가 응답을 워드나 파워포인트가 아니라 시트에 넣어줍니다. 응답자의 이메일도 수집할 수 있습니다. 짱입니다. 

대여와 반납은 동일한 트랜잭션입니다. 누가, 언제, 어떤책을, 대여인지 반납인지만 입력 받으면 됩니다. 설문지를 하나로 만듭니다. 설문 응답을 받아오는 시트는 대여, 반납 정보만 갖고 있으므로 구매 결과를 합쳐서 별도의 트랜잭션 DB용 시트를 만들어 줍니다. 그리고 반납시에는 한줄평을 남길 수 있게 문항을 하나 더 넣어줍니다. 

사용자들이 접근할 화면용 시트도 만들어 줍니다. 책 현황과 한줄평 목록입니다. 하... 한줄평 목록은 아쉽게도 동적 필터가 지원이 안 돼서 그냥 전체 한줄평이 쫙 나오는 방식으로 구현합니다. 여기서 더 하려면 구글 앱 스크립트 써야 하는데 그러긴 싫습니다. 구글 데이터스튜디오에서는 동적 필터를 쓸 수 있다고도 합니다. 그냥 넘어갑니다. 전 게으르니까요.

구글 설문지는 입력값을 URL에 채워서 만들 수 있습니다. 즉 클릭을 하면 이미 책번호, 트랜잭션 유형, 날짜가 들어간 설문지 링크를 만들 수 있습니다. 즉 사용자 접근 화면에 책들을 리스팅하고 열을 하나 추가해서 대여/반납 설문지 링크를 넣어줍니다. 이 링크에는 책 리스트의 정보중 책 코드, 도서명을 가져오고, today()함수로 오늘 날짜를 넣어줍니다. https://docs.google.com/forms/d/e/설문지번호/viewform?entry.xxxx=도서번호&entry.xxxx=도서명&entry.xxxx=대여or반납&entry.xxxx=2019-05-14 이런 식으로 링크를 만들어주면 됩니다. 링크를 만들어주는 함수는 hyperlink(링크, 링크텍스트)입니다. 완전 친절하지 않습니까? 대여를 하고 싶은 사람은 대여링크만 클릭하고 설문지 submit버튼만 한 번 더 눌러주면 됩니다. 물론 입력되어 있는 값들을 임의로 수정하면 이 모든 프로세스가 망가지지만, 사람들은 그렇게 부지런하지 않다는 점을 믿어봅시다.

설문지에 응답을 하면 위 정보들(도서번호, 도서명, 대여/반납, 날짜, 한줄평(옵션), 그리고 구글 설문지에서 주는 작성자 이메일)을 받아옵니다. 필요한 정보가 모두 모였지요?

아까 구매 = 대여 트랜잭션과 대여/반납 설문지 결과를 트렌잭션 history 시트에 몰아 넣습니다. filter함수를 씁니다. 아주 편리한 함수입니다. 대여 횟수와 반납 횟수를 비교해서 도서의 현재 상태를 판단합니다.

if 대여>반납, then 대여중, elif 대여=반납 then 대여가능, else 함수가 뭔가 이상한데?

"함수가 뭐가 이상한데?"의 상황이 발생할 가능성을 막기 위해서 대여 링크는 대여가능시에만, 반납 링크는 대여중에만 뜨도록 만듭니다. switch()함수를 씁니다. 엑셀의 choose()랑 비슷한 놈입니다. filter함수를 조정하면 반납 링크의 응답은 현재 대여중인 사람이 작성한 것만 가져오는 걸로 만들 수도 있습니다. 만, 역시 사람들의 게으름을 믿어보도록 합니다.

이제 북마스터에서 책정보를, 트랜잭션 DB에서 책 상태값과 최종대여자를 가져오고, 한줄평 갯수, 대여횟수를 가져와서 사용자에게 보여주면 됩니다. 책 코드가 키값이므로 간단한 vlookup만 있어도 만들 수 있습니다. 여기에 교보문고에서 크롤링해서 가져온 도서분류(국내도서/경제경영/경영전략/e-비즈니스)를 넣어줍니다. 

3. 조르기 링크

핵심입니다.

사람은 다 게으르므로, 책을 반납할 유인이 필요합니다. 뒤집어 얘기하면 다른 사람이 별로 보고싶어하지 않는 책은 굳이 반납할 필요가 없습니다. 사내 변호사님이 구입하신 "주석 신탁법", 이런 책을 한 달 넘었으니 돌려달라고 해봤자 서로 피곤하기만 합니다. 제목만 봐도 피곤하네요. 피곤한 일은 할 필요가 없습니다. 또 뒤집어서, 해야 하는 일은 안 하면 피곤하게 만들어줘야 합니다.

요약해서, 책을 보고 싶은 사람이 빌려간 사람한테 반납하라고 조르는 버튼을 만들어 봅니다.

버튼을 누르면, 메시지가 갑니다.

버튼을 누르는 걸 여러가지로 만들 수 있겠지만 우리는 구글 시트로 만들기로 했으니까 구글 설문지 링크로 만들어봅니다. 아까 채워진 양식으로 설문지 만드는 걸 또 써먹습니다. 최종 대여자 정보(고맙게도 이메일로 되어 있습니다.)와 도서 코드로 "반납조르기"링크가 들어가 있는 열을 하나 만들어 줍니다.

이제 사용자는 반납조르기 링크를 누르고 submit버튼을 누르면 반납조르기 응답이 시트에 기재됩니다.

이제 응답을 대여자에게 보내주면 됩니다. 어떻게?

구글시트나 구글설문지는 엑셀VBA와 비슷한 앱 스크립트가 있습니다. 자바 스크립트 문법이고, 저는 개인적으로 구글 앱 스크립트가 엑셀VBA보다 훨씬 좋습니다. 기본적으로 구글 앱은 클라우드에 올라가 있기 때문에 여기서 스크립트를 돌리면 서버 역할도 해주기 때문입니다. 개발자들에게 서버를 구걸해야 하는 인사/총무 담당자로서는 매우 고마운 툴입니다. 앱 스크립트는 파일을 열 때, 변경사항이 생길 때, 설문지를 등록할 때 등을 트리거로 설정할 수 있습니다. 딱이죠? 그러나 우리는 코드를 쓰지 않기로 했기 때문에, Zapier로 해결합니다. 

메시지는 이메일이나 메신저로 보내는 게 좋겠죠. 이메일은 저희 회사에서는 잘 안쓰고 너무 private하기 때문에 슬랙 공개 채널에 문자를 보내기로 합니다. 문자를 보내기 위해 필요한 데이터는 역시 도서명, 현재 대여자, 대여 신청자(설문지 응답에서 가져옴), 채널명, 그리고 대여자와 신청자의 이메일 주소에서 가공한 슬랙id입니다.

설문지 응답이 오면 -> 응답자의 id를 확인하고 -> 메시지를 보낸다

이렇게 설계했는데, zapier무료 버전은 두 개 스텝만 넣을 수 있습니다. 취미생활에 회사 돈을 쓸 수는 없으니 두 개 스텝으로 줄입니다. 슬랙은 gmail아이디로 로그인하기 때문에 그냥 @뒤를 날려주면 됩니다. left(find())함수 씁니다.

설문지 응답이 오면 -> 구글 시트 함수로 가공한 응답자의 id로 메시지를 보낸다.

이야... 구글 시트 함수로 돈을 아꼈습니다. 아예 취미생활을 안했으면 시간도 아낄 수 있었을 텐데요... 

Zapier는 참 잘 만든 서비스입니다. 앱 스크립트로 하루 종일 짤 액션이 클릭 몇 번으로 완성됩니다. DM으로 보내려다 다른 사람들도 이런 프로세스가 있는 걸 알게 하고, 또 반납을 계속 안하는 사람이 좀더 민망하도록 공개채널로 올립니다. 하지만 관심없는 사람들을 귀찮게 하면 안 되니까 새로 공개채널을 하나 팠습니다.

이제 책을 대여해 갔는데 반납을 안 하는 사용자는 시시때때로 다른 사람이 요청할 때마다 아래와 같은 슬랙 메시지를 받게됩니다.

@OOOOOO 좋은 책은 나눠 봐요~! 
`자바스크립트 패턴과 테스트`을 `OOO`님께 넘겨 주시면 유혈사태는 일어나지 않을 것입니다.



끝~!

2편에서는 실제 적용한 함수를,

3편에서는 반성과 배운 점을 정리해 보겠습니다.

4
1
  • 댓글 2

  • 스쿨드
    1k
    2019-05-14 11:11:43

    중년이라 그런가 이상하게 끝까지 읽게되네여..

    고생하셨네여. 잘 읽었습니다. zapier가 흥미롭네여.

    0
  • sbroh
    8k
    2019-05-14 18:12:45

    '인사/총무'도 물론 잘하시겠지만. Product Manager 하셔도 잘 하셨겠네요. 대단하십니다.

    단순한 '인사/총무' 역할 하실 분 같지는 않지만. ㅎㅎㅎ

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.