안녕하세요. 생명을 불어넣는 기록 매니아, 기록조율사 서울외고 조용희입니다. 오늘 준일샘의 이음오피스가 정말 큰 화두였어요. 국회까지 이야기가 이어지는 걸 보면서 부럽기도 하고, 한편으로는 무섭기도 했습니다. 제삼자인 저도 이런 마음인데, 정작 당사자인 준일샘은 얼마나 싱숭생숭하셨을지 감히 가늠조차 하기 어렵네요. 그런데 이음오피스처럼 엄청난 앱을 만든다는 건, 결국 그동안 겪었던 여러 불편함에 대한 고민을 바탕으로 오픈소스를 어떻게 활용할지에 대한 아이디어를 더해 만들어 낸 바이브코딩의 결과물 아닐까요? 물론 그 과정에는 단순히 코드를 생성하는 것 이상의 고민과 노하우가 필요하겠지요. 하지만 이곳에 계신 선생님들 대부분은 전문적인 코딩 지식을 바탕으로 직접 코딩하기보다는, 바이브코딩을 통해 자신에게 필요한 것을 만들어 가고 계실 거라고 생각합니다. 그렇기에 바이브코딩을 좀 더 전문적으로, 나아가 교육적으로 접근하고 계신 분들의 경험을 나누며 서로 배우고 성장할 수 있는 시간이 참 소중하게 느껴집니다. 어제 노션 오픈톡방에서 인사이트를 하나 얻었어요. 어제와 오늘 직접 시도해 봤는데 결과물이 마음에 들었습니다. 그래서 그 과정을 기록해 두고 싶다는 생각에 이렇게 키보드 앞에 앉았습니다. 저도 처음에는 제미나이 채팅창에 질문을 던지고 코드를 받아서 메모장에 붙여 넣은 뒤, 시키는 대로 저장하는 수준에서 시작했어요. 그렇게 HTML 파일도 만들고, 파이썬을 설치해 EXE 파일도 만들어 봤습니다. 중요한 코드는 제미나이가 대부분 작성해 주었지만, 정작 그 결과물을 만들어 내기까지의 과정은 달랐습니다. 코드를 복사하고, 파일을 저장하고, 실행해 보고, 오류가 나면 다시 질문하는 등 중간중간의 작업은 모두 제 손을 거쳐야 했거든요. 그렇게 하나씩 만들어 낸 것이 교회출석체크앱, 성경읽기앱, 유튜브 다운로더, 독서기록웹앱이었습니다. 그리고 이 과정에서 GAS(Google Apps Script)라는 것도 알게 되었어요. 돌이켜 보면 그때까지도 백엔드니 프론트엔드니 하는 용어가 무슨 뜻인지 제대로 알지 못했습니다. 그저 제게 필요한 것을 말로 설명하고, AI와 대화를 주고받으며 조금씩 구체화해 나갔을 뿐이에요. 백엔드 데이터베이스로 구글 스프레드시트를 선택한 것도 순전히 우연이었습니다. 제미나이가 그렇게 해 보라고 추천했기 때문이죠. 처음 접하는 방식이라 낯설었지만, 구글 생태계 안에서 GAS를 활용하는 방법은 생각보다 간편하면서도 강력했습니다. 제가 구현하고 싶었던 기능들도 꽤 만족스럽게 만들어 낼 수 있었고요. 사실 독서기록은 이미 노션으로 충분히 하고 있었습니다. 그런데 모바일에서 노션을 열고, 해당 페이지에 들어가고, 새 페이지를 만들어 기록하는 과정이 생각보다 번거로웠어요. 단축어 기능을 활용해 보기도 했지만, 여전히 아쉬움이 남았습니다. 그러던 중 독서기록을 웹앱으로 만들면 좋겠다는 이야기를 듣고 직접 시도해 보았습니다. 그렇게 탄생한 것이 바로 독서기록웹앱, 지금의 북튜닝(BookTuning)입니다.

[노션에서 독서기록하기]

[북튜닝. 지금은 v4.3까이 버전업했어요] 그렇게 만들어진 북튜닝을 개인적으로 사용하다가, 그룹원들과 함께 독서기록을 나눌 수 있도록 기능을 추가했습니다. 더 나아가 다른 그룹에서도 사용할 수 있도록 기능을 확장했어요. 각 그룹이 자신의 구글 스프레드시트만 가지고 있으면 새로운 그룹을 개설해 사용할 수 있는 방식이었습니다. 그렇게 개선한 북튜닝을 에듀집에도 등록했죠. 그런데 실제로 사용하다 보니 문제가 하나둘 눈에 들어오기 시작했습니다. 처음에는 개인정보를 따로 수집하지 않으니 괜찮다고 생각했습니다. 하지만 제가 마음만 먹으면 사용자가 입력한 구글 스프레드시트 주소를 통해 저장된 정보에 접근할 수 있겠다는 생각이 들었어요. 다른 사용자에게는 노출되지 않더라도, 개발자인 저에게는 접근 가능성이 열려 있는 정보. 이거, 위험하지 않을까요? 이때쯤 SaaS(Software as a Service)라는 방식에 대해서도 알게 되었습니다. 하나의 서비스를 여러 사용자가 함께 이용하는 구조였죠. 제가 실제로 다른 사람의 기록을 들여다보지 않는다고 해도, 접근할 수 있는 가능성 자체는 여전히 남아 있었습니다. 누군가의 정보를 다룬다는 건 생각보다 무겁고 부담스러운 일이었어요. 또 하나의 불편함도 있었습니다. 웹앱, 구글 스프레드시트, 노션이 서로 연결되어 있는 구조였다는 점입니다. 애초에 노션에서 사용하던 독서기록을 좀 더 편하게 작성하기 위해 웹앱을 만들었고, GAS를 활용하면서 구글 스프레드시트에 기록을 저장한 뒤 노션으로 아카이빙하는 방식을 택했습니다. 그러다 보니 같은 독서기록이 두 곳에 저장되는 구조가 되었어요. 백업이라는 측면에서는 나쁘지 않았습니다. 하지만 노션은 아카이빙 공간에 가까웠기 때문에, 웹앱에서 작성한 기록을 수정하거나 삭제하려면 결국 노션에 직접 들어가야 했습니다. 노션에서 수정한 내용이 웹앱에 반영되지도 않았고요. 편리하게 기록하려고 만든 앱인데, 관리 과정은 오히려 번거로워진 셈입니다. 그러던 어제, 노션 커뮤니티에서 노션을 백엔드 데이터베이스로 활용할 수 있다는 이야기를 들었습니다. 제미나이에게 물어보니, 독서기록처럼 초고속으로 생성·삭제해야 하는 데이터가 아니라면 노션도 충분히 훌륭한 백엔드 데이터베이스가 될 수 있다고 하더군요. 그렇다면 굳이 구글 스프레드시트를 중간에 둘 필요가 없겠다는 생각이 들었습니다. 그때부터 본격적으로 작업을 시작했습니다. 그리고 마침내 구글 스프레드시트에 저장하는 과정을 없애고, 웹앱에서 작성한 독서기록이 노션에 바로 저장되고 수정·삭제까지 가능하도록 시스템을 업그레이드했습니다. 이 과정에서 노션에 사용자 데이터베이스를 새로 만들고, 각 사용자의 독서기록을 해당 사용자와 관계형으로 연결했습니다. 사용자가 자신의 독서기록에만 접근할 수 있도록 권한 구조도 개선했어요. 사실 이전 구조에서는 다른 사람의 독서기록도 수정할 수 있었고, 심지어 삭제까지 가능했습니다. 최초 등록자의 닉네임이 기록에 표시되기는 했지만, 그것만으로 다른 사용자의 접근을 막을 수는 없었거든요. 이제는 사용자와 기록의 관계를 명확하게 설정하고 접근 제어를 적용하면서, 이전에 가지고 있던 문제를 해결할 수 있었습니다. 물론 실제로 다른 사용자의 데이터에 접근할 수 없도록 완전히 보장하려면 단순히 관계형 연결만으로는 충분하지 않고, 권한 검증이 제대로 작동하는지도 확인해야 합니다. 그래도 이번 개선을 통해 데이터 관리 구조를 좀 더 안전한 방향으로 바꾸었다는 점에서 의미가 있었습니다. 성능 면에서도 변화가 있었습니다. GAS를 거쳐 구글 스프레드시트에 저장하고 다시 노션으로 옮기던 과정이 사라지면서, 기존에 느꼈던 버벅임도 많이 개선되었습니다. 무엇보다 반가웠던 건 노션 자체가 이미 훌륭한 UI를 갖추고 있다는 사실을 다시 활용할 수 있게 되었다는 점입니다. 이제는 기록을 빠르고 편하게 작성할 때는 웹앱을 이용하고, 전체적인 독서기록을 살펴보거나 관리할 때는 노션을 이용하는 방식이 가능해졌습니다. 예전에는 노션에서 수정한 내용이 웹앱에 반영되지 않았지만, 이제는 같은 데이터를 기반으로 양쪽에서 기록을 확인하고 관리할 수 있게 된 것이죠. 대신 한 가지는 포기했습니다. 바로 여러 그룹이 하나의 서비스에 가입해 사용하는 SaaS 방식입니다. 처음 SaaS 방식을 선택했던 이유는 사실 단순했습니다. 제가 만든 앱의 코드를 공개하고 싶지 않았거든요. 물론 정확히 말하면 제가 모든 코드를 직접 작성한 것도 아니고, 제미나이가 대부분 만들어 준 코드였습니다. (참 부끄럽습니다. 이음오피스도 오픈소스인데, 이게 뭐라고 그랬을까요? ) 결국 다른 그룹이 북튜닝을 사용하려면 깃허브에서 코드를 복제한 뒤 각자 자신의 환경에 배포하도록 방식을 바꾸었습니다. 이렇게 하면 각 그룹이 독립적인 웹앱을 갖게 됩니다. 다른 그룹의 데이터가 하나의 서비스 안에 모이지 않고, 각자 자신의 환경에서 관리할 수 있게 되는 것이죠. 누군가에게 편리한 서비스를 제공하는 것도 중요하지만, 다른 사람의 데이터를 책임지고 관리해야 한다는 부담을 덜어 내는 것도 중요하다고 생각했습니다. 편리함을 조금 내려놓더라도 각자가 자신의 기록을 직접 관리하는 구조가 제게는 더 적합하다고 판단했습니다. 그리고 북튜닝에는 또 하나의 특징이 있습니다. 제 개인 독서기록은 챌린지 방식으로 운영됩니다. 매달 새로운 챌린지를 시작하죠. 한 달 동안 매일 책을 읽어 보자는 다짐에서 출발한 방식입니다. 매월 챌린지 페이지를 따로 만들고, 한 달의 도전을 마치면 그동안 쌓인 개인 독서기록을 바탕으로 독서 리포트를 만들기도 합니다. 책을 읽고 기록하는 데서 그치지 않고, 한 달 동안의 독서 과정을 돌아보고 그 안에서 무엇을 얻었는지 살펴보는 것이죠.
이렇게 독서 리포트를 작성하면 또 다른 책을 추천받을 수 있습니다. 지난달의 독서를 돌아보는 데서 그치지 않고, 새로운 책을 만나 다음 챌린지에서 독서의 폭을 넓히는 계기로 삼는 것이죠. 이번에 개인용 웹앱을 새로 만들면서 이 기능까지 함께 넣었습니다. 이제 웹앱에서도 월별 챌린지를 확인하고 새롭게 생성할 수 있게 되었습니다. 기록을 더 편하게 남기는 것을 넘어, 독서의 시작과 과정, 마무리까지 하나의 흐름으로 연결해 가고 있습니다.

이번 작업은 안티그래비티(Antigravity)에서 진행했습니다. 기존 GAS 코드를 통째로 안티그래비티에 전달하고, 구글 스프레드시트를 제거한 뒤 노션을 백엔드 데이터베이스로 사용하는 웹앱으로 이관해 달라고 요청했어요. 물론 요청 한 번으로 모든 것이 완벽하게 끝난 것은 아닙니다. 결과물을 확인하고, 원하는 방향으로 수정하며 조금씩 완성해 나갔습니다. 오늘의 과정을 정리해 보면 이렇습니다. 제미나이 채팅으로 시작한 바이브코딩은 어느새 제 삶의 불편한 부분을 발견하고, 개선하고, 조율해 가는 과정이 되었습니다. 제가 필요로 하는 것을 직접 만들어 사용하고, 사용하면서 발견한 문제를 다시 개선하는 일이 무척 재미있습니다. 요즘 제가 주로 사용하는 도구는 노션 AI, 제미나이 채팅, 안티그래비티입니다. 각 도구를 활용해 조금씩 배우고, 직접 시도하고, 그 과정에서 얻은 경험을 바탕으로 다시 성장하고 있습니다. 아직 모르는 것도 많고, 기술적인 부분을 완전히 이해했다고 말하기도 어렵습니다. 그래도 처음에는 코드가 무엇인지도 제대로 모른 채 복사하고 붙여 넣는 것으로 시작했는데, 이제는 데이터가 어디에 저장되는지, 어떤 구조가 더 편리한지, 다른 사람의 정보를 다룰 때 무엇을 고려해야 하는지 고민하게 되었습니다. 천천히, 느리지만 꼼꼼하게 배우고 싶습니다. 당장 모든 것을 잘하려 하기보다는 제가 만든 것을 직접 사용하면서 문제를 발견하고, 하나씩 해결해 나가려고 합니다. 그러다 보면 언젠가는 저도 준일샘의 이음오피스처럼 많은 선생님에게 실질적인 도움을 줄 수 있는 멋진 앱을 만들어 볼 수 있지 않을까요? 아직은 갈 길이 멀지만, 오늘도 한 걸음 나아갑니다.
댓글 0