Redis와 FastAPI를 활용해 CRUD 만들기

강문혁·2022년 8월 10일
2

겜린더

목록 보기
5/13

시작하기 전에 앞서...

사실 내가 뭐 튜토리얼을 만들 수준의 실력이 되질 못하지만...
이상하게 한국에는 자료가 많이 없어 보였기도 했고... 누군가에게 도움이 되길 바라면서 튜토리얼 느낌의 후기 글을 작성해 보려고 한다.
정리도 할 겸...

혹시나 개선점이 있다면 언제든지 댓글에 적어주시면 감사하겠습니다 😁


왜 만들어야 하지?!

이전 글을 보면 왜 만들려고 하는지 이유를 알 수 있다.
Redis 스터디 & 겜린더 서버 설계
보기 귀찮은 사람을 위해 한 줄 요약을 하자면
기존 사용하던 서버가 제한된 게 너무 많아 새로 만들어야겠다는 생각을 했다.
(한마디로 매우 구리다)

기존 DB가 너무 부실한 탓에 결국 백엔드를 새로 구축을 해야겠단 생각을 작년부터 했었는데 드디어 Redis와 FastAPI를 활용해 DB를 만들었다.
(기존 건 기본적인 POST도 제대로 안돼서 많이 답답했었다..)


그래서 어떤 걸 만들고 싶었는가..

일단 내가 원했던 기능을 하나씩 읊어보자면...

  1. POST로 손쉽게 새로운 게임 등록이 가능해야 한다.
  2. GET으로 특정 날짜의 게임 정보를 불러올 수 있어야 한다.
  3. DELETE로 삭제가 간편해야 한다.

이 정도가 다였는데 생각보다 오래 걸려서 고생을 많이 했던 것 같다... 😂
찾아보니깐 유튜브에도 자료가 생각보다 없었고 국내에는 매우 많이 없었던 것 같았다...
(내가 검색 실력이 없어서 못 찾았을 수도...)

그렇다고 해외에 자료가 있을까?! 하고 보니... 딱히... 없었다...
Redis랑 FastAPI 둘 다 딱히 내가 원하는 느낌의 레퍼런스가 없어서 (특히 FastAPI) 그냥 이번에 좀 삽질하겠구나 하면서 체념했었다.

가장 먼저 유튜브에 강좌를 좀 찾아보자 하고 열심히 찾아본 결과
Microservices with FastAPI – Full Course
라는 기가 막힌 튜토리얼이 있었지만... 내가 원하는 2번 기능인 GET으로 특정 날짜의 게임 정보를 불러올 수가 없었다... 그리고 해당 튜토리얼은 HASH 형식으로 자료를 저장했으나.. 내가 원했던 건 JSON 형식으로 저장해야했기 때문에... 좀 많이 아쉬운 튜토리얼이었다.
하지만 덕분에 어떤 식으로 개발을 해야 할지는 감이 잡혀서 이 강좌가 많이 도움이 되었다.
FastAPI로 Redis DB를 구현해 보고 싶다면 이 튜토리얼이 매우 좋을 것 같다...

결국 Docs를 읽어가며 직접 하나하나 구현해 보기로 하였다..


어떻게 개발했는가..?

패키지는 이렇게 설치했다.

Python

Redis-Stack
처음에 그냥 Redis를 설치했다가 JSON 모델이 적용이 안되길래 보아하니
Redis-Stack을 설치해야 ReJSON도 설치가 된다고 하여 1시간을 날려먹었다...
꼭 Redis-Stack을 설치하자...🤣

일단 FastAPI와 Redis를 연결해 주는 코드를 작성하였다.
Middleware은... 튜토리얼에서 따라 하고 공부하느라 일단은 살려두었는데 필요 없으면 지울 예정이다.

보통 FastAPI를 사용해 보신 분들은 아시겠지만 원래 보통 pydantic 패키지의 BaseModel을 보통 사용한다.
하지만 Redis-OM에서 제공해 주는 JsonModel을 활용 해야 할 것 같아서 JsonModel을 사용해보았다.

이제 POST 기능을 먼저 구현을 해보겠다. 보통 GET을 먼저 하지만 나는 이상하게도 POST를 먼저 구현해 보았다.

Redis Docs JSON 을 보면서 하면 더 좋다.

주석들은 여태까지 시도했던 흔적들이라 좋게 봐주시고 넘어가 주셨으면 한다...
코드를 보면 알 수 있듯이 먼저 jsonable_encoder() 를 사용해 form을 Json과 호환되는 데이터 유형으로 바꿔준다

Redis-py에는 execute_command() 가 있어 실제 Redis-CLI에서 작성하는 명령어를 파이썬에도 그대로 사용할 수 있는데 위에 있던 JsonModel 형식을 string으로 직렬화하는 과정이 필요해서 json.dumps를 사용해 json_form을 직렬화하면 된다.

저렇게 작성하고 이제 Postman으로 테스트하면...


Redis DB에 저장 완료가 된다.

이것으로 1번 기능 POST를 구현하였다.

다음으로 2번 기능인 GET으로 특정 날짜의 게임 정보를 불러오는 작업을 해보자
Search-indexing_Json 을 참고하면 좋다

가장 먼저 Redis-CLI를 접속해 작업해야 할 것이 있다.


바로 JSON index를 생성해야 한다.
JSON index를 생성하지 않으면 검색 기능을 사용할 수 없으니 꼭 반드시 해야 한다.

FT.CREATE gameIdx ON JSON PREFIX 1 item: SCHEMA $.name AS name TEXT $.date AS date TEXT

나는 이렇게 입력해 name과 date라는 값을 인덱싱하는 gameIdx 인덱스를 생성하였다.

name은 추후에 DELETE 기능을 구현할 때 사용할 예정이다.

실제로 Redis-CLI에 이제 날짜 검색을 해보자

FT.SEARCH를 이용해 검색을 할 수 있는데 이걸 이제 아까 직접 만든 gameIdx에 적용해 보자

FT.SEARCH gameIdx '@date:(20220805)'

를 입력하면

이런 결과가 나오게 된다.

(integer)는 해당 검색 결과의 개수이고 지금은 검색 결과가 1개밖에 안 나왔으니 1이라고 적혀있는 상태이다

원하는 대로 특정 날짜만 검색되는 결과물을 얻을 수 있을 것이다.
이걸 이제 야무지게 파이썬 코드에 잘 적용시키면 된다.


일단 간단하게 이렇게 작성해 보았다.
(주석들은 넘어가주세요...)

redis-py Docs 를 참고하여 만들었다. 좋은 예제들이 매우 많았다.

먼저 gameList로 리스트를 선언하고
totalNum 이란 변수는 아까 위에서 설명한 검색 결과의 개수를 불러온다.

FT.SEARCH gameIdx '@date:(20220805)' 이 명령어가

reDB.ft('gameIdx').search(date).docs[i].json
이 코드랑 동일한 역할을 한다고 보면 된다.

그리고 json.loads()를 이용해 json 형식에서 python 형식으로 디코딩을 하여 gameList에 추가하면 된다.

그럼 최종적으로

이렇게 출력 결과가 이쁘게 나온다!

이제 2번 기능이었던 특정 날짜의 형식까지 불러올 수 있게 되었다.

3번 기능인 DELETE는 사실 코드 한 줄 이면 완성되기 때문에 여기다가 작성은 하지 않겠다. 아마 Docs를 읽다 보면 저절로 답이 나올 것이라 생각한다.

힌트는 execute_command()를 사용하면 된다

Redis JSON랑 FastAPI랑 연동하는 글이 국내에는 없어서 이번에 한 번 직접 Docs도 읽고 레퍼런스도 찾아보면서 열심히 만들어보았다.

나같이 무식하게 삽질하면서 코딩하는 사람이 없었으면 하는 마음에
실력이 부족하지만 조금 글을 작성해 보았고, 아마 중간중간 뭔가 내용이 많이 생략된 경우도 있을 수 있다.

혹시나 틀린 내용이 있으면 언제든지 피드백해 주셨으면 한다.

profile
흔들리지 말고 나만의 공부를 하자

0개의 댓글