DB

[Redis] redis 스터디 - DB를 redis 로 이용한 ToDo리스트 만들기

죵욜이 2024. 12. 22. 03:35

redis 스터디 2번째로 각자

 

DB 를 Redis 를 이용하여 간단한 ToDo리스트 만들기로 했다.

 

주 목적이 Redis 를 이용해보자

 

라는 것이었기 때문에 FastAPI 를 사용해 간단하게  만들고 나머지는 지피티의 도움을 받아서 완성 시켰다.


먼저 Redis 를 다운을 받아야 했다.

 

다운을 받은후 

$ redis-server

명령어를 통해 입력하였지만

 

환경변수 설정을 안해서 레디스가 있는 폴더로 경로변경을 해야만 실행이 가능했다.

 

이과정이 너무 귀찮아서 바로 저 명령어로만 실행되게 환경변수 설정을 해주었고

 

 

이렇게 6379 포트로 서버가 실행된걸 볼 수 있었다.

종료할거면 Ctrl + C 로 종료할 수 있다.

 

그후

$ redis-cli

명령어를 통해 서버에 연결할수 있었다.

  • redis-server : 6379번 포트에서 Redis가 실행되고, 이포트가 외부에서 접속 가능하도록 열리게 됨
  • redis-cli : 실행된 Redis 서버와 연결하여 명령을 실행할 수 있다.
    • 기본적으로 로컬머신에서 6379 포트로 연결을 시도한다.
    • 만약 Redis 서버가 다른 포트에서 실행 중이라면,  -p  옵션을 사용하여 포트를 지정할 수 있다.

 

연결을 하고나선 잘 된건지 확인하기위해

ping 을 날리면 

pong 이라고 답이 온다.

 


그후 FastAPI 를 이용해 간단한 ToDo리스트를 만들기인데 지피티의 도움을 받았다.

파일이름은 todo.py 이고 코드를 보자면

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import redis
import json

# FastAPI 앱 생성
app = FastAPI()

# Redis 클라이언트 연결
redis_client = redis.Redis(host="localhost", port=6379, decode_responses=True)

# Todo 모델 정의
class Todo(BaseModel):
    id: str  # 고유 ID
    title: str
    description: str = None
    completed: bool = False

# Redis에 키 저장 형식
TODO_KEY_PREFIX = "todo:"

# Redis에서 모든 Todo 가져오기
@app.get("/todos")
def get_all_todos():
    keys = redis_client.keys(f"{TODO_KEY_PREFIX}*")
    todos = [json.loads(redis_client.get(key)) for key in keys]
    return {"todos": todos}

# 특정 Todo 가져오기
@app.get("/todos/{todo_id}")
def get_todo(todo_id: str):
    key = f"{TODO_KEY_PREFIX}{todo_id}"
    todo = redis_client.get(key)
    if not todo:
        raise HTTPException(status_code=404, detail="Todo not found")
    return json.loads(todo)

# Todo 생성
@app.post("/todos", status_code=201)
def create_todo(todo: Todo):
    key = f"{TODO_KEY_PREFIX}{todo.id}"
    if redis_client.exists(key):
        raise HTTPException(status_code=400, detail="Todo with this ID already exists")
    redis_client.set(key, json.dumps(todo.dict()))
    return {"message": "Todo created successfully"}

# Todo 업데이트
@app.put("/todos/{todo_id}")
def update_todo(todo_id: str, todo: Todo):
    key = f"{TODO_KEY_PREFIX}{todo_id}"
    if not redis_client.exists(key):
        raise HTTPException(status_code=404, detail="Todo not found")
    redis_client.set(key, json.dumps(todo.dict()))
    return {"message": "Todo updated successfully"}

# Todo 삭제
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: str):
    key = f"{TODO_KEY_PREFIX}{todo_id}"
    if not redis_client.exists(key):
        raise HTTPException(status_code=404, detail="Todo not found")
    redis_client.delete(key)
    return {"message": "Todo deleted successfully"}

이렇게 간단하게 구성되었다.

 

FastAPI 를 사용하여 터미널에서

$ uvicorn todo:app --reload

명령어를 통해 실행하면

이렇게 실행이된걸 볼수있다.

 

FastAPI 는 기본적으로 Swagger UI 와 ReDoc API 문서를 제공해준다 

  • Swagger UI : /docs
  • ReDoc : /redoc

그래서 서버주소/docs 로 이동하면

이런식으로 스웨거를 사용할수있고

 

내가 잘 짠게 맞는지 포스트맨으로 확인하였다.

post 요청으로 ToDo 생성도 잘되고

get 요청으로 모든 ToDO 를 가져오는것도 잘 되는걸 확인하였다.

 

 

 

redis 명령어로 확인하기위해 

$ redis-cli

명령어를 통해 연결한후

 

key값 todo:3 의 데이터를 조회하기위해 명령어를 보내봤다.

이런식으로 잘 들어오는걸 확인할 수 있었다.


나는 이 짧은시간내에 내가 해낼줄 몰랐는데

 

스터티 같이하시는분들이 워낙 실력이 좋으시고 친절히 알려주셔서 성공한것같다.

 

추후에 팀프로젝트를 같이 진행할수도 있으니 민폐가 되지않게 부단히 따라가도록 노력해야겠다.