-
Notifications
You must be signed in to change notification settings - Fork 2
[BE] redis 설치 및 연동
SeongHyeon edited this page Nov 16, 2024
·
2 revisions
$ sudo apt-get install redis-server
$ vi /etc/redis/redis.conf
- private db서버에 redis 설치 및 외부 접속 허용 설정
- redis용 6379 포트 개방
import { config } from 'dotenv';
config();
async function bootstrap() {
await setupSshTunnel();
const app = await NestFactory.create(AppModule);
- dotenv .env파일 config를 main.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용 터널링 포트 개방
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 클라이언트를 생성합니다. - 연결 상태(성공/실패)를 모니터링하고 로그로 출력합니다.
- Redis 설정(
-
전역 모듈로 설정:
-
@Global()
데코레이터로 모든 모듈에서 Redis 클라이언트와 레포지토리를 사용할 수 있도록 설정합니다. - 다른 모듈에서
RedisModule
을imports
에 추가하지 않아도 사용할 수 있습니다.
-
-
RedisRepository 제공:
- Redis 작업(
get
,set
등)을 캡슐화하여 재사용성을 높이고, 직접 Redis 클라이언트를 다룰 필요가 없도록 추상화합니다.
- Redis 작업(
-
의존성 주입(DI):
-
REDIS_CLIENT
와RedisRepository
를 NestJS의 DI 컨테이너에 등록하여 다른 서비스에서 쉽게 주입받아 사용할 수 있습니다.
-
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);
}
}
-
의미:
-
RedisRepository
는REDIS_CLIENT
토큰으로 제공된ioredis
클라이언트를 주입받습니다. -
REDIS_CLIENT
는 일반적으로RedisModule
에서 제공하는 Redis 클라이언트입니다.
-
-
사용 목적:
- NestJS의 DI 컨테이너에서 Redis 클라이언트를 주입받아, 동일한 클라이언트를 애플리케이션 전체에서 재사용할 수 있습니다.
-
역할:
- Redis에서 특정 키에 저장된 값을 가져옵니다.
- 반환값은 문자열 또는
null
입니다. (키가 존재하지 않는 경우null
반환)
-
Redis 명령어:
GET key
-
역할:
- Redis에 키-값을 저장합니다.
- TTL(Time-To-Live)을 설정하면, 지정된 시간(초) 후 해당 키가 자동으로 만료됩니다.
-
Redis 명령어:
- TTL 있는 경우:
SET key value EX ttl
- TTL 없는 경우:
SET key value
- TTL 있는 경우:
-
역할:
- Redis에서 특정 키를 삭제합니다.
- 반환값은 삭제된 키의 개수입니다.
-
Redis 명령어:
DEL key
-
역할:
- Redis에 특정 키가 존재하는지 확인합니다.
- 반환값은 존재하면
1
, 없으면0
입니다.
-
Redis 명령어:
EXISTS key
- [FE] TailwindCSS @apply
- [FE] 캐러셀 구현
- [FE] 사이드 바 상태관리 도전기
- [FE] axios interceptor로 로그인 필요한 api 개선하기
- [FE] Tanstack Query API 최적화 도전기
- [FE] Tanstack Query로 구현하는 무한 스크롤 차트 도전기
- [FE] 차트 무한 스크롤링 최적화 도전기
- [FE] 차트 실시간 등락 구현 도전기
- [FE] 검색 구현 및 검색 API 호출 최적화 도전기
- [FE] 고차 컴포넌트를 활용한 인증 접근 제어
- [FE] 코드 스플릿팅으로 최적화 도전기
- [BE] Server 생성
- [BE] CI/CD
- [BE] GitAction 학습 정리
- [BE] ssh터널링으로 db연결
- [BE] 배포환경에서 DB 연결 및 테스트 완료
- [BE] https 적용
- [BE] upbit api 연결 및 SSE api
- [BE] SSE 구현
- [BE] SSE 에러
- [BE] redis 설치 및 연동
- [BE] 트랜잭션 락 구현과 최적화
- [BE] Oauth CORS
- [BE] QueryRunner 사용 시 발생한 문제점과 해결방안
- [BE] Git Action 학습 정리
- [BE] NestJS 학습 정리
- [BE] 로그인 기능 및 리프레시토큰
- [BE] 비회원 체험 기능
- [BE] Nginx 학습 정리
- [BE] Mixed Content와 HTTPS 보안 구현하기
- [BE] 매수/매도 로직 구현 및 개선 과정
- [BE] Queue, Load Balancing, Redis