HJW's IT Blog

[CodeIt] 17주 스터디 본문

카테고리 없음

[CodeIt] 17주 스터디

kiki1875 2024. 11. 12. 15:46

Redis 란?

Redis는 Remote Dictionary Server의 약자로, 데이터를 메모리(RAM)에 저장하여 빠른 데이터 액세스를 제공하는 오픈 소스 인메모리 데이터베이스이다. 다음과 같은 특징과 용도로 사용된다:


Redis의 특징

  1. 인메모리 데이터 저장
    • 데이터를 디스크가 아닌 메모리에 저장하여 매우 빠른 읽기/쓰기 속도를 제공한다.
    • 하지만 데이터가 메모리에 있기 때문에 서버가 종료되거나 전원이 꺼지면 데이터가 손실될 수 있다. 이를 방지하기 위해 **스냅샷(snapshot)**이나 **AOF(Append-Only File)**를 통해 데이터를 디스크에 백업할 수 있다.
  2. Key-Value 저장소
    • Redis는 기본적으로 Key-Value 구조를 제공하며, 다양한 데이터 타입을 지원한다.
      • String: 기본적인 값 저장.
      • List: 순서가 있는 값의 배열 (예: 큐나 스택).
      • Set: 중복이 없는 값의 집합.
      • Sorted Set: 값에 점수를 매겨 정렬된 집합.
      • Hash: Key-Value 쌍으로 구성된 값.
      • Stream, Bitmap, HyperLogLog 등: 특수 데이터 타입 지원.
  3. 빠른 성능
    • 메모리 기반이므로 밀리초 단위의 읽기/쓰기 응답 속도를 제공한다.
    • 이는 캐시, 세션 관리, 실시간 분석과 같은 애플리케이션에서 매우 유용하다.
  4. 분산 및 클러스터링
    • Redis는 클러스터 모드를 통해 데이터를 분산하여 저장할 수 있다.
    • 이를 통해 데이터가 많아져도 여러 노드로 확장 가능하며, **High Availability(고가용성)**을 보장하기 위해 Sentinel과 같은 기능도 지원한다.
  5. 퍼시스턴스 지원
    • 메모리에 저장된 데이터를 디스크에 저장하여 영구적으로 유지할 수 있는 옵션을 제공한다.
    • 스냅샷 저장(RDB) 또는 변경사항을 로그로 저장(AOF)하는 방식을 사용한다.

Redis 설치 (Windows)

1. 우선 linux cli를 사용해야 하기 때문에 WSL 을 설치해야 한다.

2. WSL 설치 후, 터미널 접속

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis

이후 redis-server를 통해 잘 설치되었는지 확인할 수 있다.

redis-server 를 하게 되면, redis 가 터미널을 채우기에 해당 터미널을 사용할 수 없는데, 이때 --deamonize yes 옵션을 주어 백그라운드로 실행 시킬 수 있다.

redis 가 실행중이면, redis-cli 를 통해 command line interface 에 접근이 가능하다.

다음은 이번 예제에서 알아볼 간단한 api 이다.

import express from "express";
import * as redis from "redis";

const LIST_KEY = "messages";
const PORT = 4000;

const createApp = async () => {
  const app = express();

  const client = redis.createClient({url:"redis://localhost:6379"});
  await client.connect();

  app.use(express.json());
  app.get("/", (request, response) => {
    response.send(200).send("hello from express");
  });

  app.post("/messages", async (request, response) => {
    const {message} = request.body;
    await client.lPush(LIST_KEY, message);
    response.status(200).send("Message added")
  });

  app.get("/messages", async (request, response) => {
    const messages = await client.lRange(LIST_KEY, 0, -1);
    response.status(200).send(messages);
  })

  return app;
} 

createApp().then((app) => {
  app.listen(PORT, () => {
    console.log("APP listening at port");
  });
})

Redis 와 Express 를 사용하여 REST API 의 테스트 코드를 작성할 수 있다. Redis 를 간단한 데이터 저장소로 활용하여 Get 과 Post 요청을 검증할 수 있다.

import request from "supertest";
import { createApp, LIST_KEY, RedisClient } from "./app";
import { Application } from "express";
import * as redis from "redis";

let app : Application
let client: RedisClient

beforeAll(async () => {
  client = redis.createClient({url:"redis://localhost:6379"});
  await client.connect();
  app = createApp(client);
})

beforeEach(async () => {
  await client.flushDb();
})

afterAll(async () => {
  await client.flushDb();
  await client.quit();
})
describe("POST /messages", () => {
  it("respons with a success message", async () => {
    const response = request(app).post("/messages").send({message:"testing with redis"})

    expect((await response).statusCode).toBe(200);
    expect((await response).text).toBe("Message added");
  })
})

describe("GET /messages", () => {
  it("responds with all messages", async() => {
    await client.lPush(LIST_KEY, ["msg1","msg2"]);
    const response = await request(app).get("/messages");
    expect(response.status).toBe(200);
    expect(response.body).toEqual(["msg2","msg1"]);
  })
})

AWS Lightsail

가상머신 이란?

  • OS 위에 분리된 OS 를 설치하는 것
  • 클라우드상에선 대부분 가상머신을 사용
  • 각각의 서버를 따로 둔다면 관리 및 유지보수가 힘들다
  • 자원을 나누어 쓸 수 있는 것이다

AWS Lightsail vs EC2

  • Lightsail도 내부적으로는 EC2를 사용한다
  • EC2는 완벽하게 모든것을 이해하고 있지 않으면 사용하기 부담스럽다
  • 학습 곡선이 있다
  • Lightsail은 간단하게 생성할 수 있다
  • Lightsail 은 비용이 명확하다

Lightsail 인스턴스 만들기

  • 네트워킹, 스토리지, 도메인, DNS 등등 모든 설정을 간소화 시켰기에 편한 서비스이다.
  • 하지만 그렇다고 취약하다는 뜻은 아니다
  • Create instance → OS only → Ubuntu 24.04 LTS → create instance

 


lightsail 인스턴스를 실행하게 되면, 다음과 같이 터미널을 활용하여 접속할 수 있다. 해당 VM에 이제, 코드를 다운받고, .env 파일 작성, port 를 열어준 뒤, npm start 를 하면, 

 

이와 같이 접속이 가능하다.

 

Http 보다 Https 의 보안이 훨씬 강력하다. → 데이터가 encrypted 되었기에 안전하다.

Lightsail → 기본적으로 ip가 dynamic 이기에 바뀔 수 있다. → Static IP를 붙여야 한다.

Loadbalancer : lightsail은 ssl/tls 인증서가 있어야 HTTPS 를 지원한다. create loadbalancer → 끝. 엄청 간단하게 생성할 수 있다. → DNS가 생성된다. → 하지만 아직 연결된 instance 가 없다 →

  • Target instance → lightsail instance
  • Health Check → 주기적으로 매주 몇분에 한번씩 특정 API 로 요청을 보낸다.
  • 80 port 로의 외부 접근을 막아도, dns 를 통해 접근 가능