| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 일급 객체
- Volatile
- spring security
- Spring
- lombok
- synchronized
- Dependency Injection
- factory
- builder
- Google OAuth
- OAuth 2.0
- java
- 일급 컬렉션
- Today
- Total
HJW's IT Blog
[CodeIt] 17주 스터디 본문
Redis 란?
Redis는 Remote Dictionary Server의 약자로, 데이터를 메모리(RAM)에 저장하여 빠른 데이터 액세스를 제공하는 오픈 소스 인메모리 데이터베이스이다. 다음과 같은 특징과 용도로 사용된다:
Redis의 특징
- 인메모리 데이터 저장
- 데이터를 디스크가 아닌 메모리에 저장하여 매우 빠른 읽기/쓰기 속도를 제공한다.
- 하지만 데이터가 메모리에 있기 때문에 서버가 종료되거나 전원이 꺼지면 데이터가 손실될 수 있다. 이를 방지하기 위해 **스냅샷(snapshot)**이나 **AOF(Append-Only File)**를 통해 데이터를 디스크에 백업할 수 있다.
- Key-Value 저장소
- Redis는 기본적으로 Key-Value 구조를 제공하며, 다양한 데이터 타입을 지원한다.
- String: 기본적인 값 저장.
- List: 순서가 있는 값의 배열 (예: 큐나 스택).
- Set: 중복이 없는 값의 집합.
- Sorted Set: 값에 점수를 매겨 정렬된 집합.
- Hash: Key-Value 쌍으로 구성된 값.
- Stream, Bitmap, HyperLogLog 등: 특수 데이터 타입 지원.
- Redis는 기본적으로 Key-Value 구조를 제공하며, 다양한 데이터 타입을 지원한다.
- 빠른 성능
- 메모리 기반이므로 밀리초 단위의 읽기/쓰기 응답 속도를 제공한다.
- 이는 캐시, 세션 관리, 실시간 분석과 같은 애플리케이션에서 매우 유용하다.
- 분산 및 클러스터링
- Redis는 클러스터 모드를 통해 데이터를 분산하여 저장할 수 있다.
- 이를 통해 데이터가 많아져도 여러 노드로 확장 가능하며, **High Availability(고가용성)**을 보장하기 위해 Sentinel과 같은 기능도 지원한다.
- 퍼시스턴스 지원
- 메모리에 저장된 데이터를 디스크에 저장하여 영구적으로 유지할 수 있는 옵션을 제공한다.
- 스냅샷 저장(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 를 통해 접근 가능