Node.js 및 Redis OM과 함께 Redis를 데이터베이스로 사용하는 방법

소개



Redis는 더 빠른 응답뿐만 아니라 데이터베이스에 대한 부담을 덜어주기 때문에 데이터베이스에 저장된 데이터를 캐싱하는 것으로 널리 알려져 있습니다. 작업 대기열 등의 시스템을 만드는 데 사용되는 것과 같습니다.

그러나 그 기능은 거기서 멈추지 않습니다. Redis는 사용할 수 있는 많은 모듈을 제공하며 그 중 하나는 Redis에서 JSON 지원을 제공하는 RedisJSON으로, 애플리케이션의 기본 데이터베이스로 사용을 향상시킵니다.

그리고 제목과 이 서문에 적힌 내용에서 알 수 있듯 오늘은 간단한 crud로 api를 생성해 보지만 이번에는 Redis를 데이터베이스로 사용하겠습니다.

시작하기



시작하려면 새 프로젝트를 생성해 보겠습니다.

mkdir redis-node-crud
cd redis-node-crud


폴더 안에 노드 환경을 만듭니다.

npm init -y


다음으로 필요한 종속성을 설치합니다.

npm install koa @koa/router koa-body redis-om --save
npm install nodemon standard --save-dev


그런 다음 package.json에 다음 스크립트를 추가합니다.

{
  "type": "module",
  "scripts": {
    "dev": "nodemon src/main.js",
    "lint": "standard --fix"
  },
}


프로젝트 설정이 완료되면 Redis 인스턴스에 대한 연결을 구성할 수 있습니다.

// @/src/db.js
import { Client } from 'redis-om'

export const client = new Client()

export const createClient = async () => {
  if (!client.isOpen()) {
    await client.open('redis://localhost:6379')
  }
}


다음 단계는 API의 entityschema을 생성하는 것입니다(더 간단하게 하기 위해 데이터베이스 구성과 동일한 파일에 넣었습니다).

// @/src/db.js
import { Client, Entity, Schema } from 'redis-om'

export const client = new Client()

export const createClient = async () => {
  if (!client.isOpen()) {
    await client.open('redis://localhost:6379')
  }
}

class Post extends Entity {}

export const postSchema = new Schema(Post, {
  title: { type: 'string' },
  content: { type: 'string' },
  isPublished: { type: 'boolean' }
})


Redis에 대한 연결 구성이 완료되고 스키마가 정의되었으므로 이제 CRUD를 수행할 api 라우터에서 작업을 시작할 수 있습니다. 이를 통해 이제 필요한 종속성과 모듈을 가져올 수 있습니다.

// @/src/routes.js
import Router from '@koa/router'

import { client, postSchema } from './db.js'

const router = new Router()

// ...

export { router }


생성할 첫 번째 경로는 데이터베이스에 저장한 모든 데이터를 반환합니다.

router.get('/posts', async (ctx) => {
  const postRepository = client.fetchRepository(postSchema)
  await postRepository.createIndex()
  const allPosts = await postRepository.search().returnAll()
  ctx.body = allPosts
})


그리고 항상 모든 게시물을 받고 싶지는 않으므로 요청 매개변수에 제공된 id 매개변수에 따라 하나의 게시물만 반환하는 경로를 생성해 보겠습니다.

router.get('/posts/:id', async (ctx) => {
  const postRepository = client.fetchRepository(postSchema)
  const post = await postRepository.fetch(ctx.params.id)
  ctx.body = post
})


데이터를 반환하는 것 외에도 스키마에서 지정하는 속성을 추가할 수 있는 경로를 생성하기 위해 일부를 삽입해야 합니다.

router.post('/post', async (ctx) => {
  const postRepository = client.fetchRepository(postSchema)
  const post = await postRepository.createAndSave({
    ...ctx.request.body
  })
  ctx.body = post
})


특정 게시물의 속성 중 하나를 업데이트해야 하는 경우 매개 변수에서 게시물의 id를 보내고 요청 본문에서 업데이트하려는 속성을 보낼 경로를 만듭니다. :

router.put('/post/:id', async (ctx) => {
  const postRepository = client.fetchRepository(postSchema)
  const post = await postRepository.fetch(ctx.params.id)

  Object.entries(ctx.request.body).forEach(([key, val]) => {
    post[key] = val
  })

  const postId = await postRepository.save(post)
  ctx.body = { postId, post }
})


마지막으로 데이터베이스에서 데이터를 삭제해야 합니다. 특정 게시물만 삭제하기 위해 요청 매개변수에서 id 매개변수를 허용하는 경로를 생성할 것이기 때문입니다.


router.delete('/post/:id', async (ctx) => {
  const postId = ctx.params.id
  const postRepository = client.fetchRepository(postSchema)
  await postRepository.remove(postId)
  ctx.body = { postId }
})


CRUD가 완료되면 이제 경로를 설정하고 데이터베이스와의 연결을 설정할 api 항목 파일을 만들 수 있습니다.

// @/src/main.js
import Koa from 'koa'
import koaBody from 'koa-body'

import { router } from './routes.js'
import { createClient, client } from './db.js'

const startServer = async () => {
  const app = new Koa()
  await createClient()

  app.use(koaBody())
  app.use(router.routes())

  return app
}

startServer()
  .then(async (app) => {
    await new Promise(resolve => app.listen({ port: 3333 }, resolve))
  })
  .catch(async (err) => {
    console.error(err)
    await client.close()
    process.exit(1)
  })


실행 방법



API 프로세스를 시작하려면 다음 명령을 실행합니다.

npm run dev


코드 형식을 수정하려면 다음 명령을 실행합니다.

npm run lint


결론



늘 그렇듯이 기사가 마음에 드셨기를 바라며 기존 프로젝트에 도움이 되었거나 단순히 사용해 보고 싶으셨기를 바랍니다.

기사에서 잘못된 부분을 발견했다면 댓글로 알려주시면 수정하겠습니다. 마치기 전에 이 기사의 소스 코드에 액세스하려면 github 저장소에 대한 링크here를 남겨둡니다.

좋은 웹페이지 즐겨찾기