TIL

Tower Defense Online Project 트러블 슈팅 - 2

추운날_너를_기다리며 2024. 11. 12. 10:00

MySQL, Redis가 연결이 안된 경우 계속 시도하는 문제

레디스의 경우 연결이 실패한 경우 계속해서 연결 시도를 반복함.

이 과정에서 무의미하게 로그가 계속해서 쌓임.

DB연결에 실패한 경우 서버가 종료되도록 수정함.

 

해결 코드

import dbPool from '../../db/database.js';
import { config } from '../../config/config.js';

export const testConnection = async () => {
  try {
    const [rows] = await dbPool.query('SELECT 1 + 1 AS solution');
    console.log(`${config.database.database} 테스트 쿼리 결과:`, rows[0].solution);
  } catch (e) {
    console.error(
      `test 쿼리 실행 실패 : ${e}\nDB 연결에 실패하였습니다. DB의 상태를 확인해주세요.`,
    );
    console.log('서버를 종료합니다.');
    process.exit(1);
  }
};
import Redis from 'ioredis';
import { config } from '../config/config.js';

export const redisClient = new Redis({
  port: config.redis.port, // Redis port
  host: config.redis.host, // Redis host
  family: config.redis.family, // 4(IPv4) or 6(IPv6)
  password: config.redis.password,
  db: 0,
});

redisClient.on('error', (err) => {
  console.error('Redis 클라이언트 오류:', err.errno);
  switch (err.errno) {
    case -4078:
      console.error('Redis DB와 연결할 수 없습니다. Redis 상태를 확인해주세요.');
      break;
    default:
      console.error('알 수 없는 오류코드:', JSON.stringify(err));
  }
  console.log('서버를 종료합니다.');
  process.exit(1);
});

// redisClient.on('connect', () => console.log('Redis에 연결되었습니다.'));
export const connectRedis = async () => {
  try {
    if (redisClient.status === 'ready') {
      console.log('Redis에 연결 준비 중.');
    }

    // 이미 연결되었거나 연결 중이라면 connect()를 호출하면 안돼
    if (!redisClient.status || redisClient.status === 'wait') {
      console.log('redisClient.status => ', redisClient.status);
      await redisClient.connect();
      console.log('Redis에 연결되었습니다.');
    } else {
      console.log('레디스 현재 상태 => ', redisClient.status);
    }
  } catch (error) {
    console.error('Redis에 연결할 수 없습니다:', error);
  }
};

await connectRedis();