문제의 발단🤔
과거 퍼블리셔 당시 직장에서 개발했던 모듈이 PHP5 버전으로 작성되어 8.4에서
사용하니 심각한 오류가 발생하였습니다 그래서 8.4버전의 규칙에 맞게 리팩토링 하던 중 모듈을 생성을 완료하고 모듈을 삭제할때 발생하는 오류에 대한 트러블슈팅입니다
오류의 내용은 요청한 SQL쿼리에서 parent_srl 값이 전달되지 않았거나 null 값이 들어있다는 오류였습니다
원인 진단🚀
//procAdminDelete() 컨트롤러 파일
//view 파일에서 전달받은 삭제할 모듈의 고유한 module_srl값
$module_srl = Context::get('module_srl');
//코어의 module 컨트롤러를 가져오기
$oModuleController = getController('module');
//코어에서 모듈 특정모듈 삭제 (매개변수로 고유값을 보냄)
$output = $oModuleController->deleteModule($module_srl); // 문제의 오류발생 코드
// 코어 module의 deleteModule() 쿼리
<query id="deleteModule" action="delete">
<tables>
<table name="modules" />
</tables>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>
두 코드를 보면 알겠지만 deleteModule에선 하나의 매개변수만 받고있습니다 (module_srl) 을 제공하면 해당하는 모듈을 modules 테이블에서 삭제하는 SQL입니다
하지만 오류에서 나타나는 parent_srl 값은 전달받지 않고있습니다..! 혹시나 하는 마음에 module_srl 값을 찍어 봤지만 아래처럼 정상적으로 보내주고 있는 상황입니다
그렇다면 코어의 module 컨트롤러가 문제가 있다는 뜻인데... 일단 하나하나 찾으면서
parent_srl 코어단 컨트롤러를 추적해 보았습니다
function deleteModule($module_srl)
{
if(!$module_srl) return new BaseObject(-1,'msg_invalid_request');
$site_module_info = Context::get('site_module_info');
$output = ModuleModel::getModuleInfoByModuleSrl($module_srl);
$args = new stdClass();
$args->url = $output->mid;
$args->is_shortcut = 'N';
$oMenuAdminModel = getAdminModel('menu');
$menuOutput = $oMenuAdminModel->getMenuList($args);
if(is_array($menuOutput->data))
{
foreach($menuOutput->data AS $key=>$value)
{
$args->menu_srl = $value->menu_srl;
break;
}
}
$output = executeQuery('menu.getMenuItemByUrl', $args);
// menu delete
if($output->data)
{
unset($args);
$args = new stdClass;
$args->menu_srl = $output->data->menu_srl;
$args->menu_item_srl = $output->data->menu_item_srl;
$args->is_force = 'N';
$oMenuAdminController = getAdminController('menu');
$output = $oMenuAdminController->deleteItem($args, true);
if($output->toBool())
{
return new BaseObject(0, 'success_deleted');
}
else
{
return new BaseObject($output->error, $output->message);
}
}
// only delete module
{
return $this->onlyDeleteModule($module_srl);
}
}
git에서 수많은 코드사이 열심히 찾던 코어에서 모듈을 삭제하는 라인을 찾았습니다
하지만 직접 parent_srl를 요구하는 코드는 찾을 수 없었습니다 생각해 보니 애초 코어에서 문제가
있다면 이 CMS을 사용하는 사람들의 이슈가 이미 올라왔을 거라 생각했습니다
그렇게 문제가 되는 menu, menu_item, modules 테이블을 보던 중 modules 에선 삭제가 되었지만
menu, menu_item 에서는 삭제가 되지 않은 모듈을 발견했습니다
생각해 보니 코어 컨트롤을 보면 모듈을 생성할 때도 menu_item 이 같이 생성되고
삭제를 해도 menu_item은 같이 삭제된다라는 게 문뜩 떠올랐고
모듈을 만드는 테스트를 진행할 때 삭제기능을 만들어 두지 않아서 임의로 SQL을 날려서 삭제했었던
기억이 났습니다
아..! 삭제하려는 모듈과 관련된 DB가 꼬였구나😱
구버전 CMS에서는 SQL로 직접 삭제해도 상관이 없었지만 2.0 으로 올라오면서
라우팅 등 다양한 기능이 들어오면서 모듈에 추가된 듯했습니다
원인 해결🎉
개발할 때만 사용하는 로컬 서버이기 때문에 DB를 밀고 다시 CMS를 재설치하여 해결하였습니다!
간단한 문제였지만 원인파악에 시간이 좀 걸린 문제였습니다 문제의 소지가 낮았던 코어에 접근하는게 아니라 내 모듈과 연관된 데이터에 바로 추적을 했다면 좀 더 빠르게 찾을 수 있었던 오류였습니다
CMS 사용할땐 직접 SQL을 보내는건 자제해야겠다 다짐합니다