BOARD

문제 해결

그누보드 소셜로그인 회원가입 시 닉네임 중복 체크 쿼리 최적화 방법

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 1회 작성일 26-11-03 15:49

본문

그누보드 소셜로그인 회원가입 시 닉네임 중복 체크 쿼리 최적화 방법

그누보드 소셜로그인 이용 시 발생하는 고부하 쿼리 원인을 파악하고, 재귀 함수 로직을 수정하여 RDS CPU 사용량을 낮추는 방법을 확인합니다.

그누보드 소셜로그인 RDS CPU 과부하 원인

그누보드 소셜로그인(네이버, 다음 등) 과정에서 RDS CPU 사용량이 급증하는 원인은 소셜로그인 시 닉네임이 넘어오지 않을 때 회원 테이블에서 닉네임 존재 여부를 확인하는 재귀 함수(exist_mb_nick_recursive)가 0부터 순차적으로 수천 번의 중복 조회 쿼리를 반복 실행하기 때문입니다.

상세 원인 및 구조

  • 발생 위치: plugin/social/includes/functions.php 파일 내 exist_mb_nick_recursive 함수
  • 동작 방식: 소셜로그인 시 닉네임이 전달되지 않으면 count 변수를 0부터 1씩 증가시키면서 g5_member 테이블을 대상으로 SELECT COUNT(*) AS cnt FROM g5_member WHERE mb_nick =? AND mb_id!= '' 쿼리를 반복 호출합니다.
  • 영향 범위: 소셜 회원수가 적은 사이트에서는 영향이 적으나, 수천 명 이상의 소셜 회원이 활동 중인 중규모 이상 서비스 사이트에서는 count가 0부터 2,000번 이상까지 조회를 반복하면서 1초에도 수십 개의 동일 계열 쿼리가 발생해 데이터베이스(RDS) CPU 과부하를 유발합니다.

existmbnick_recursive 함수의 구조와 과부하 원인

그누보드 소셜로그인 회원가입 과정에서 발생하는 쿼리 과부하는 닉네임 중복을 확인하는 exist_mb_nick_recursive 함수의 재귀 호출 구조 때문입니다. 소셜로그인(네이버, 다음 등) 연동 시 닉네임 값이 정상적으로 넘어오지 않거나 중복될 때 이 함수가 호출됩니다.

함수 코드 및 동작 방식

과부하를 유발하는 원본 코드는 plugin/social/includes/functions.php 파일에 위치합니다.

function exist_mb_nick_recursive($mb_nick){
 static $count = 0;
 $mb_nick_add = ($count > 0)? $mb_nick.(string)$count: $mb_nick;
 if(! exist_mb_nick($mb_nick_add, '') ){
 return $mb_nick_add;
 }
 $count++;
 return exist_mb_nick_recursive($mb_nick);
}

함께 호출되는 lib/register.lib.php의 exist_mb_nick 함수는 회원 테이블에서 중복 닉네임을 조회합니다.

function exist_mb_nick($reg_mb_nick, $reg_mb_id) {
 global $g5;
 $row = sql_fetch(" select count(*) as cnt from {$g5['member_table']} where mb_nick = '$reg_mb_nick' and mb_id <> '$reg_mb_id' ");
 if ($row['cnt']) return "이미 존재하는 닉네임입니다.";
 else return "";
}

문제점

  • 반복적인 DB 조회: 소셜 회원수가 많은 중규모 이상의 서비스 사이트에서는 닉네임이 비어 있거나 중복될 때 $count를 0부터 시작하여 수천 번(예: 2000번 이상)까지 SELECT COUNT(*) 쿼리를 순차적으로 실행합니다.
  • RDS 고부하 발생: 1초에 수십~수백 개의 쿼리가 지속해서 발생하면서 데이터베이스(RDS)의 CPU 사용량이 급증하는 원인이 됩니다.

그누보드 5.4.5.1 이하 버전 소셜로그인 닉네임 중복 쿼리 과부하 해결 방법

그누보드 5.4.5.1 이하 버전에서 소셜로그인 시 닉네임이 전달되지 않으면, 시스템이 회원 테이블에서 0부터 순차적으로 닉네임 존재 여부를 반복 조회하여 RDS CPU 과부하를 유발합니다. 이를 해결하기 위해 plugin/social/includes/functions.php 파일의 exist_mb_nick_recursive 함수를 그누보드 5.4.5.2 패치 내용으로 수정해야 합니다.

수정 절차

  1. 파일 경로: plugin/social/includes/functions.php 파일을 엽니다.
  2. 함수 수정: exist_mb_nick_recursive 함수를 찾아 아래와 같이 변경합니다.
function exist_mb_nick_recursive($mb_nick){
 global $mb_id;
 static $count = 0;
 // 기존 코드 주석 처리 또는 삭제
 // $mb_nick_add = ($count > 0)? $mb_nick.(string)$count: $mb_nick;
 
 // 수정된 코드 적용
 $mb_nick_add = ($count > 0)? str_replace('_','',$mb_id).substr(md5(microtime()), 0, 3).(string)$count: $mb_nick;
 
 if(! exist_mb_nick($mb_nick_add, '') ){
 return $mb_nick_add;
 }
 $count++;
 return exist_mb_nick_recursive($mb_nick);
}

주의사항

  • 이 수정은 반복적인 SQL 쿼리 호출을 방지하여 서버 부하를 줄이는 목적입니다.
  • 수정 후에는 소셜로그인을 통해 회원가입을 시도하여 닉네임이 정상적으로 생성되는지 확인하십시오.
  • 해당 패치는 그누보드 5.4.5.2 버전부터 공식 적용되었습니다.

그누보드 소셜로그인 닉네임 중복 체크 쿼리 최적화

그누보드 5.4.5.1 이하 버전에서 소셜로그인 시 닉네임이 넘어오지 않을 경우, exist_mb_nick_recursive 함수가 닉네임 뒤에 숫자를 붙여가며 수천 번의 SELECT 쿼리를 반복 실행하여 RDS CPU 사용량이 급증하는 문제가 발생합니다. 이를 해결하기 위해 해당 함수를 최적화해야 합니다.

1. 문제 원인

소셜로그인 가입 시 닉네임 값을 받아오지 못하면, 시스템은 중복을 피하기 위해 닉네임 뒤에 숫자를 0부터 순차적으로 붙여가며 DB에 존재 여부를 확인합니다. 소셜 회원이 많은 경우 이 재귀 호출이 수천 번 반복되어 DB 부하를 유발합니다.

2. 해결 방법: 코드 수정

plugin/social/includes/functions.php 파일의 exist_mb_nick_recursive 함수를 수정하여 반복적인 DB 조회를 줄이고, 고유한 닉네임 값을 생성하도록 변경합니다.

수정 전:

function exist_mb_nick_recursive($mb_nick){
 static $count = 0;
 $mb_nick_add = ($count > 0)? $mb_nick.(string)$count: $mb_nick;
 if(! exist_mb_nick($mb_nick_add, '') ){
 return $mb_nick_add;
 }
 $count++;
 return exist_mb_nick_recursive($mb_nick);
}

수정 후 (5.4.5.2 패치 적용):

function exist_mb_nick_recursive($mb_nick){
 global $mb_id;
 static $count = 0;
 $mb_nick_add = ($count > 0)? str_replace('_','',$mb_id).substr(md5(microtime()), 0, 3).(string)$count: $mb_nick;
 // 이후 로직은 동일하게 유지
}

3. 주의사항 및 확인

  • 백업 필수: 파일을 수정하기 전 반드시 원본 파일을 백업하십시오.
  • 버전 확인: 그누보드 5.4.5.2 버전 이상에서는 이미 해당 패치가 적용되어 있습니다. 사용 중인 버전이 5.4.5.1 이하인지 먼저 확인하십시오.
  • 성능 모니터링: 수정 후 소셜로그인 가입 시 RDS CPU 사용량이 안정화되는지 모니터링하십시오.

소셜로그인 닉네임 중복 체크 과부하 해결 가이드

그누보드 5.4.5.1 이하 버전에서 소셜로그인 시 RDS CPU 사용량이 급증한다면, 닉네임 중복 확인 함수(exist_mb_nick_recursive)의 재귀 호출 로직을 최적화해야 합니다.

상황별 판단 및 행동

내 상황선택 기준다음 행동
소셜로그인 시 RDS CPU 급증5.4.5.1 이하 버전 사용 중plugin/social/includes/functions.php 코드 수정
5.4.5.2 이상 버전 사용 중이미 패치 적용됨DB 슬로우 쿼리 로그 및 서버 환경 점검
닉네임 중복 체크가 불필요함로직 비활성화 고려exist_mb_nick_recursive 함수 호출부 주석 처리

적용 절차

  1. 백업: plugin/social/includes/functions.php 파일을 반드시 백업합니다.
  2. 코드 수정: exist_mb_nick_recursive 함수 내 $mb_nick_add 생성 로직을 고유값(회원 아이디 + microtime)을 사용하도록 변경합니다.
  3. 검증: 소셜로그인 가입 테스트를 진행하여 닉네임이 정상적으로 생성되는지 확인합니다.

실전 FAQ

Q. 수정 후 닉네임 중복은 어떻게 처리되나요?

기존에는 0부터 숫자를 붙여가며 DB를 수천 번 조회했으나, 수정된 로직은 회원 아이디와 microtime을 조합하여 고유한 닉네임을 즉시 생성하므로 DB 부하가 발생하지 않습니다.

Q. 5.4.5.2 패치를 적용했는데도 CPU 부하가 여전합니다.

해당 패치는 닉네임 중복 체크로 인한 재귀 쿼리 과부하를 해결하는 것이며, 다른 원인(예: 대량의 접속자, 인덱스 미설정 등)으로 인한 부하일 수 있습니다. RDS 슬로우 쿼리 로그를 확인하여 다른 쿼리가 원인인지 먼저 파악하십시오.

Q. 닉네임 중복 체크 기능을 아예 끄고 싶습니다.

plugin/social/includes/functions.php에서 해당 함수를 호출하는 부분을 주석 처리하면 중복 체크를 건너뛸 수 있으나, 회원 테이블의 닉네임 유니크 제약 조건에 따라 가입 오류가 발생할 수 있으므로 권장하지 않습니다.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.