AI 연동 (도입 X)

비속어 필터링 (매핑 테이블만 사용)

다른 단어가 붙어 있는 경우(예: 바보가 들어간 바보자식)도 잡히도록 전체 비속어 리스트를 가져와서 패턴 매칭 방식

기존 방식

const curseWords = await this.getWordsFromRedis();
  if (curseWords.length === 0) {
    return { sanitized: message, hasCurse: false };
  }

let sanitized = message;
let hasCurse = false;

for (const word of curseWords) {
  if (!word) continue;
  // 대소문자 구분 없이 전체에서 순수한 리터럴 텍스트로 word를 찾기 위한 패턴을 만듦
  const pattern = new RegExp(word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');
  if (!pattern.test(sanitized)) continue;

  hasCurse = true;
  const mask = '*'.repeat(word.length);
  sanitized = sanitized.replace(pattern, mask);
}

...

private async getWordsFromRedis(): Promise<string[]> {
  try {
    const members = await this.redisClient.sMembers(this.REDIS_SET_KEY);
    return members ?? [];
  } catch (e) {
    const msg = e instanceof Error ? e.message : String(e);
    this.logger.error(`Redis에서 비속어 조회 실패: ${msg}`);
      return [];
  }
}

성능 및 최적화

즉, 단어 수가 적다면 크게 문제 없을 가능성이 높지만, 안정적인 저지연을 위해 로드 시 캐싱 + 정규식 사전 컴파일Redis 왕복을 제거하는 게 가장 현실적인 최적화

Q. 메모리에 들고있는게 redis에서 찾는것보다 빠른가? redis도 메모리 기반이니 큰 차이가 없지 않나?

A.

타협안으로 진행

메모리 캐싱 + 정규식 사전 컴파일로 타협안을 적용