초보자도 쉽게, Stateless하게, 업데이트 할 수 있는 방법은 무엇일까?
문제 상황
내일(1/12 수요일) 강의 후 직접 봇을 만들기 위한 과제를 내려고 하는데 계속 나를 괴롭히는 문제가 있다.
초보자도 직관적으로 이해할 수 있으면서, Stateless(앱과 DB의 분리)한 상태의 DB를 어떻게 만들 수 있는 것인가?
라는 문제다.
일단 SQL 쿼리를 처음부터 가르치는 것은 상당히 무리라서 다른 방법을 찾고 있는데 그 중 그나마 현실적인 방안이
JSON을 이용한 데이터 IO를 하는 것이다.
물론 동적으로 수정도 할 수 있고, 파이썬이 JSON 파일을 읽기도 쉬운 난이도도 낮은 방법이긴 하지만
나는 이 코드를 이어서 AWS에 배포 후 Stateless하게 DB를 분리할 계획이라
이 둘을 어떻게 자연스럽게 이어 놓을지가 고민이다.
물론
그냥 각각 만들면 되는 간단한 문제다.
이렇게 간단히 끝날 거라면 애초에 글을 쓰지 않았을 터다.
내 프로젝트는 솔직히 어느 정도 클라우드와 자동화 자동배포에 관심을 갖는 사람이 한 두명이라도 존재하지 않을까 하는 마음에 시작했던 것이다.
그러나 모집 인원이 얼마 없고, 처음 연락을 주신 두 분 마저 프로그래밍을 처음 배우는 분들이라면 공감하는
일단은 프로그래밍 언어는 어느정도 익숙해 졌는데, 뭘 만들어 보고 싶기도 하고… 프로젝트나 같이 하면서 배울까?
라는 마음을 어느정도 눈치 챘고, 비슷한 투의 건의를 넣으신 분들이 많아 결국 스터디로 하게 되었다.
나도 이런 완전 초보자 시절의 (상대적인) 고수와 함께 일을 하면서 배우는, 인턴과 다를게 없는 협업을 늘 하고 싶었기 때문에
기존의 프로젝트 : 스터디 (9 : 1)
의 비율로 일정을 짜놨으면, 이제는 프로젝트 : 스터디 (1:9)
의 비율로 임하고 있다.
그래서 지금까지 이어 온 것이고,
바뀐 목표는 이렇게 스터디를 이어가서 AWS를 이용한 CI/CD를 구축하는 것이었다.
문제 상황(다시 본론으로)
현재 구조는 아래와 같다
봇 서버, 그리고 나중에 이미지로 만들어 ECR, CI/CD를 한다는 내용
지금은 파이썬도 처음이고, 디스코드도 처음인 분들이 봇 서버를 만들어서 데이터를 참고해야하는 상황이다.
혼자 했더라면 바로 DynamoDB와 AWS RDS 중에서 하나를 고민하고 있었을 테지만
난이도와 파이썬 / 디스코드 초보에서 CI/CD, DB 독립성까지 갈 수 있는 도로를 만들기 위해 고민하는 중이다.
그야말로 코딩 학원에서 말도 안되는 진도 진행 과정을 보여주면서
6개월 동안 하라는 대로 하면 구글 입사 가능!!라고
말하는 것과 (생각해보니) 비슷해 보였다.
그래도 내가 초보자였을 때 이렇게 했으면 참 좋았을텐데…라는 마음으로 임하고 있다.
아무튼 어떻게 잘 구현 할 것인지 지금까지 생각한 대안을 살펴보자.
해결안 1 : JSON을 이용한 방법
파이썬에서 JSON을 읽는 거야 잘 알려져 있다시피 쉽다.
그리고 바이너리 형태로 저장되어 있는 것이 아니고, 키-값이라는 간단한 구조 덕분에 직관적이다.
다만, 마음에 걸리는 것은 JSON로 저장하고, 읽게 된다면 통합 개발을 하는 순간 직접 키를 참고하다보면 하드 코딩이 될 수 밖에 없고,
협업이 제대로 될리가 없다.
파이썬 코드-읽어주는 코드(추상화)-JSON(DB)
그래서 추상화를 위해서 파이썬으로 봇의 메인 로직과 DB(json) 사이에 코드를 읽을 수 있는 코드를 만들어
라이브러리처럼 만들까하는 고민도 하고 있다.
JSON을 참고해서 데이터를 읽는 방식은 데이터가 도서관 운영시간 같은 사적인 내용이 아니면 괜찮지만,
유저를 관리함에 있어, 개인 정보가 사용될 가능성은 높기 때문에 확장성에 있어서 고민이 되었다.
공적인 정보야 JSON으로 공개를 하든 상관 없지만,
단순히 Json 파일 때문에 PR을 통해서 지속적으로 업데이트를 하면 버전관리에 너무 쓰잘데기 없는 커밋이 남아서 선호하지 않는다.
그리고 실시간으로 바꿀 수 있는 쉬운 인터페이스(예를 들어 봇 채팅을 통해서 변경을 한다던지)도 아니기 때문에
길게 내다보면 단점이 많지만, 단기적으로 ‘학습’의 측면으로 봤을 때 간단한 방법이다.
해결안 2 : 로컬 DB I/O가 가능한 파이썬 인터페이스를 직접 만들어 베포한다
파이썬 코드-읽어주는 코드(추상화)-DB
DB를 잘 모르는 사람에게 아무리 정적 파일을 읽는 sqlite3를 사용한다고 해도
봇을 만드는 강의와 맥락을 벗어나기 때문에 쉽게 하자고 말을 할 수 없다.
그래서 파이썬 코드로 쉽게 접근 할 수 있는 인터페이스와 같은 코드를 제공하는 방법을 생각해보기도 했다.
# ----- main.py --------
import discord
@bot.event
async def on_message(ctx, ... ):
...
data = read( ... )
await ctx.send( data )
# ----- db.py ----------
def write(key : str, value):
with open(...) as fp:
...
return True
return False
def read(key : str):
with open(...) as fp:
...
return data
이렇게 한다고 내가 들이는 노력에 비해서 앞서 언급한 DB를 업데이트하는 PR 문제
그리고 발생하는 DB 업데이트 불편한 인터페이스 같은 문제가 따라오기 때문에
더 나아지는 건 없고, 오버헤드만 커진다.
배우는 사람의 입장이라면 단순히 이번 프로젝트에서 배우는 것이 봇 말고도 앞으로 자주 사용하게 될 DB에 대해서
어느정도 경험을 할 수 있으니 전혀 이득이 없는 것은 아니지만,
나는 나중에 DB 핸들러로 AWS Lambda를 이용해 DB를 호출하는 형태로 만들어갈 예정이기 때문에
이 해결안은 포기했다.
결론
일단 교육 과정에서는 JSON을 이용하기로 결정했다.
나중에 앱과 분리된 DB를 말한 것처럼
그림처럼 AWS VPC 내 라우팅으로 데이터 핸들러를 만들지, 어떻게 구현할지는 고민이다.
나는 실시간으로 앱으로부터 독립적으로 데이터 베이스를 업데이트하고
데이터 베이스를 관리하기 위한 앱을 어떻게 운영하는지에 대한 방법을 못 찾아봐서 쉬운 결론을 못내리고 있다.
일단 생각하고 있는 것은
이런식으로 채팅으로 실시간으로 쉽게 DB를 업데이트 할 수 있는 방안을 모색하는 중이다.
진짜 결론
일단은 나중에도 계속 로컬로 하던간에, 데이터 베이스를 계속 수정하기 위해서 PR을 하던간에
한 번의 사이클을 끝내는게 중요하다보니 빠르고, 쉽게 구축할 수 있는 JSON을 이용한 방법을 선택했다.
미래 계획
그림 읽는 전용 DB 핸들러, 수정 작업은 따로 분리,
예를 들어 그러면 주기적으로 5초마다 읽기전용 DB (read replica)를 만들어
안정적인 요청을 수행할 수 있을것으로 보인다.