Skip to content

[BE] redis 설치 및 연동

SeongHyeon edited this page Nov 16, 2024 · 2 revisions

redis 설치

$ sudo apt-get install redis-server
$ vi /etc/redis/redis.conf

image

  • private db서버에 redis 설치 및 외부 접속 허용 설정

ncp acg설정

image

  • redis용 6379 포트 개방

main.ts

import { config } from 'dotenv';

config();

async function bootstrap() {
  await setupSshTunnel();
  const app = await NestFactory.create(AppModule);
  • dotenv .env파일 config를 main.ts로 이동
  • 터널링을 메인에서 실행

ssh터널링 추가

ssh-tunnel.ts

export async function setupSshTunnel(): Promise<void> {
  const env = process.env.NODE_ENV || 'development';
  
  if (env !== 'development') {
    console.log('SSH 터널링은 개발 환경에서만 활성화됩니다.');
    return;
  }
  try {
    await Promise.all([tunnelMySQL(), tunnelRedis()]);
    console.log('MySQL 및 Redis 터널링 설정 완료');
  } catch (error) {
    console.error('SSH 터널링 설정 중 오류 발생:', error);
    throw error;
  }
}
function tunnelRedis(): Promise<void> {
	return tunnel(
		{
			host: process.env.SSH_HOST,
			port: Number(process.env.SSH_PORT),
			username: process.env.SSH_USER,
			password: process.env.SSH_PASSWORD,
		},
		{
			srcAddr: process.env.REDIS_HOST,
			srcPort: Number(process.env.REDIS_PORT),
			dstAddr: process.env.SSH_REDIS_HOST,
			dstPort: Number(process.env.SSH_REDIS_TUNNEL_PORT),
		},
	);
}
  • 로컬 환경에서 접속하기 위해 redis용 터널링 포트 개방

redis 모듈 생성

redis.module.ts

import { Module, Global } from '@nestjs/common';
import Redis from 'ioredis';
import { redisConfig } from 'src/configs/redis.config';
import { RedisRepository } from './redis.repository';

@Global() // 전역 모듈로 설정하여 어디서든 사용할 수 있게 함
@Module({
  providers: [
    {
      provide: 'REDIS_CLIENT',
      useFactory: () => {
        const client = new Redis(redisConfig);
        client.on('connect', () => console.log('Redis 연결 성공'));
        client.on('error', (error) => console.error('Redis 연결 실패:', error));
        return client;
      },
    },
  ],
  exports: ['REDIS_CLIENT', RedisRepository],
})
export class RedisModule {}
  • Redis 클라이언트 초기화:
    • Redis 설정(redisConfig)을 기반으로 Redis 클라이언트를 생성합니다.
    • 연결 상태(성공/실패)를 모니터링하고 로그로 출력합니다.
  • 전역 모듈로 설정:
    • @Global() 데코레이터로 모든 모듈에서 Redis 클라이언트와 레포지토리를 사용할 수 있도록 설정합니다.
    • 다른 모듈에서 RedisModuleimports에 추가하지 않아도 사용할 수 있습니다.
  • RedisRepository 제공:
    • Redis 작업(get, set 등)을 캡슐화하여 재사용성을 높이고, 직접 Redis 클라이언트를 다룰 필요가 없도록 추상화합니다.
  • 의존성 주입(DI):
    • REDIS_CLIENTRedisRepository를 NestJS의 DI 컨테이너에 등록하여 다른 서비스에서 쉽게 주입받아 사용할 수 있습니다.

redis.repository.ts

import { Injectable, Inject } from '@nestjs/common';
import Redis from 'ioredis';

@Injectable()
export class RedisRepository {
  constructor(
    @Inject('REDIS_CLIENT') private readonly redisClient: Redis, // DI로 Redis 클라이언트 주입
  ) {}

  async get(key: string): Promise<string | null> {
    return this.redisClient.get(key);
  }

  async set(key: string, value: string, ttl?: number): Promise<string> {
    if (ttl) {
      return this.redisClient.set(key, value, 'EX', ttl); // TTL이 있는 경우
    }
    return this.redisClient.set(key, value); // TTL이 없는 경우
  }

  async delete(key: string): Promise<number> {
    return this.redisClient.del(key);
  }

  async exists(key: string): Promise<number> {
    return this.redisClient.exists(key);
  }
}

@Inject('REDIS_CLIENT')

  • 의미:
    • RedisRepositoryREDIS_CLIENT 토큰으로 제공된 ioredis 클라이언트를 주입받습니다.
    • REDIS_CLIENT는 일반적으로 RedisModule에서 제공하는 Redis 클라이언트입니다.
  • 사용 목적:
    • NestJS의 DI 컨테이너에서 Redis 클라이언트를 주입받아, 동일한 클라이언트를 애플리케이션 전체에서 재사용할 수 있습니다.

2) Redis 명령 메서드

get(key: string)

  • 역할:
    • Redis에서 특정 키에 저장된 값을 가져옵니다.
    • 반환값은 문자열 또는 null입니다. (키가 존재하지 않는 경우 null 반환)
  • Redis 명령어: GET key

set(key: string, value: string, ttl?: number)

  • 역할:
    • Redis에 키-값을 저장합니다.
    • TTL(Time-To-Live)을 설정하면, 지정된 시간(초) 후 해당 키가 자동으로 만료됩니다.
  • Redis 명령어:
    • TTL 있는 경우: SET key value EX ttl
    • TTL 없는 경우: SET key value

delete(key: string)

  • 역할:
    • Redis에서 특정 키를 삭제합니다.
    • 반환값은 삭제된 키의 개수입니다.
  • Redis 명령어: DEL key

exists(key: string)

  • 역할:
    • Redis에 특정 키가 존재하는지 확인합니다.
    • 반환값은 존재하면 1, 없으면 0입니다.
  • Redis 명령어: EXISTS key

💻 개발 일지

💻 공통

💻 FE

💻 BE

🙋‍♂️ 소개

📒 문서

☀️ 데일리 스크럼

🤝🏼 회의록

Clone this wiki locally