From aa50eb72eed365edc3f56d03553ba7cff4d03700 Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Thu, 9 Apr 2026 12:20:35 +0900 Subject: [PATCH] fix: add runtime logging for code-kind lookup failures Capture detailed runtime context when /bag/code-kinds and /bag/code-details fail so production logs reveal the exact exception source and request/session scope. --- app/Controllers/Bag.php | 68 +++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/app/Controllers/Bag.php b/app/Controllers/Bag.php index ae75b80..9f7486b 100644 --- a/app/Controllers/Bag.php +++ b/app/Controllers/Bag.php @@ -349,13 +349,27 @@ class Bag extends BaseController { $kindModel = model(CodeKindModel::class); $detailModel = model(CodeDetailModel::class); - $kinds = $kindModel->orderBy('ck_code', 'ASC')->findAll(); - $lgIdx = $this->lgIdx(); + $kinds = []; $countMap = []; - foreach ($kinds as $row) { - $countMap[$row->ck_idx] = (int) $detailModel->where('cd_ck_idx', $row->ck_idx) - ->filterByTenantScope($lgIdx) - ->countAllResults(); + $lgIdx = $this->lgIdx(); + try { + $kinds = $kindModel->orderBy('ck_code', 'ASC')->findAll(); + foreach ($kinds as $row) { + $countMap[$row->ck_idx] = (int) $detailModel->where('cd_ck_idx', $row->ck_idx) + ->filterByTenantScope($lgIdx) + ->countAllResults(); + } + } catch (\Throwable $e) { + log_message('error', '[codeKinds] 실패: {type} {message} @ {file}:{line} / lg={lg}, user={user}, level={level}', [ + 'type' => $e::class, + 'message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'lg' => $lgIdx !== null ? (string) $lgIdx : 'null', + 'user' => (string) (session()->get('mb_id') ?? ''), + 'level' => (string) (session()->get('mb_level') ?? ''), + ]); + session()->setFlashdata('error', '기본코드 조회 중 오류가 발생했습니다. 관리자에게 로그 확인을 요청해 주세요.'); } $level = (int) session()->get('mb_level'); @@ -374,18 +388,46 @@ class Bag extends BaseController { $kindModel = model(CodeKindModel::class); $detailModel = model(CodeDetailModel::class); - $kind = $kindModel->find($ckIdx); + $kind = null; + try { + $kind = $kindModel->find($ckIdx); + } catch (\Throwable $e) { + log_message('error', '[codeDetails] kind 조회 실패: {type} {message} @ {file}:{line} / ck={ck}, user={user}, level={level}', [ + 'type' => $e::class, + 'message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'ck' => (string) $ckIdx, + 'user' => (string) (session()->get('mb_id') ?? ''), + 'level' => (string) (session()->get('mb_level') ?? ''), + ]); + return redirect()->to(site_url('bag/code-kinds'))->with('error', '세부코드 조회 중 오류가 발생했습니다. 관리자에게 로그 확인을 요청해 주세요.'); + } if ($kind === null) { return redirect()->to(site_url('bag/code-kinds'))->with('error', '코드 종류를 찾을 수 없습니다.'); } $lgIdx = $this->lgIdx(); - $list = $detailModel->where('cd_ck_idx', $ckIdx) - ->filterByTenantScope($lgIdx) - ->orderBy('cd_sort', 'ASC') - ->orderBy('cd_idx', 'ASC') - ->paginate(20); - $pager = $detailModel->pager; + try { + $list = $detailModel->where('cd_ck_idx', $ckIdx) + ->filterByTenantScope($lgIdx) + ->orderBy('cd_sort', 'ASC') + ->orderBy('cd_idx', 'ASC') + ->paginate(20); + $pager = $detailModel->pager; + } catch (\Throwable $e) { + log_message('error', '[codeDetails] list 조회 실패: {type} {message} @ {file}:{line} / ck={ck}, lg={lg}, user={user}, level={level}', [ + 'type' => $e::class, + 'message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'ck' => (string) $ckIdx, + 'lg' => $lgIdx !== null ? (string) $lgIdx : 'null', + 'user' => (string) (session()->get('mb_id') ?? ''), + 'level' => (string) (session()->get('mb_level') ?? ''), + ]); + return redirect()->to(site_url('bag/code-kinds'))->with('error', '세부코드 조회 중 오류가 발생했습니다. 관리자에게 로그 확인을 요청해 주세요.'); + } helper('admin'); $level = (int) session()->get('mb_level');