Files
jongryangje/docs/기본 개발계획/25-메뉴_추가수정_개발_계획.md
2026-04-08 00:23:55 +09:00

11 KiB

메뉴 추가·수정 개발 계획

1. 목적 및 범위

  • 목적
    • 관리자 화면과 일반 사이트 화면의 상단 메뉴를 지자체별·역할별로 DB에서 동적으로 관리할 수 있도록 확장한다.
    • 1차 메뉴뿐 아니라 2차/3차 하위 메뉴까지 등록·수정·삭제·순서 변경 가능하게 하고, 상단 <nav>드롭다운 구조로 반영한다.
  • 범위
    • 테이블: menu_type, menu
    • 모델: MenuModel, MenuTypeModel
    • 컨트롤러: App\Controllers\Admin\Menu
    • 뷰: app/Views/admin/layout.php, app/Views/admin/menu/index.php
    • 헬퍼: app/Helpers/admin_helper.php

2. 데이터 구조 및 기본 정책

2.1 메뉴 종류 (menu_type)

  • 컬럼
    • mt_idx : PK
    • mt_code : 코드 (admin, site 등)
    • mt_name : 표시명
    • mt_sort : 정렬 우선순위
  • 기본 데이터
    • admin : 관리자 상단 메뉴
    • site : 일반 사이트 상단 메뉴

2.2 메뉴 항목 (menu)

  • 컬럼
    • mm_idx : PK
    • mt_idx : 메뉴 종류 FK (menu_type.mt_idx)
    • lg_idx : 지자체 FK (지자체별 메뉴 분리)
    • mm_name : 메뉴명 (1차/2차/3차 공통)
    • mm_link : 링크 경로 (예: admin, admin/users, site/inventory/list)
    • mm_pidx : 부모 메뉴 PK (0 = 최상위 1차 메뉴)
    • mm_dep : 깊이 (0=1차, 1=2차, 2=3차 …)
    • mm_num : 형제 내 정렬 순서
    • mm_cnode : 자식 개수
    • mm_level : 노출 허용 mb_level 쉼표 구분 (빈값=전체, super admin은 무시하고 항상 전체)
    • mm_is_view : Y=노출, N=숨김
  • 인덱스
    • idx_mt_lg (mt_idx, lg_idx) : 메뉴 종류·지자체별 조회용
    • idx_mm_pidx (mm_pidx) : 하위 메뉴 존재 여부 확인용
    • idx_mm_dep_num (mm_dep, mm_num) : 트리 정렬용

2.3 기본 메뉴 정책

  • 관리자 상단 메뉴 (mt_code='admin')

    • 각 지자체별로 다음과 같은 1차 메뉴가 기본 등록되어야 한다.
      • 대시보드 (admin)
      • 회원 관리 (admin/users)
      • 로그인 이력 (admin/access/login-history)
      • 승인 대기 (admin/access/approvals)
      • 역할 (admin/roles)
      • 메뉴 (admin/menus)
      • 지자체 전환 (admin/select-local-government, super admin 전용)
      • 지자체 (admin/local-governments, super admin 전용)
      • 지정판매소 (admin/designated-shops)
    • 각 1차 메뉴 아래에 2차/3차 하위 메뉴를 둘 수 있으며, 상단 <nav>에서 드롭다운으로 노출한다.
  • 일반 사이트 상단 메뉴 (mt_code='site')

    • 각 지자체별로 다음과 같은 1차 메뉴 세트를 기본 등록한다.
      • 기본정보관리
      • 발주 입고 관리
      • 불출 관리
      • 재고 관리
      • 판매 관리
      • 판매 현황
      • 봉투 수불 관리
      • 통계 분석 관리
      • 도움말
    • 각 1차 메뉴 아래의 2차/3차 메뉴 구성은 CSV의 “1차 메뉴정리” 파일을 기준으로 초기 등록한다.
  • 역할·권한 정책

    • mm_level 빈값: 모든 역할 노출 (일반 사용자, 지정판매소, 지자체관리자, super admin).
    • mm_level에 숫자(1,2,3) 지정: 해당 mb_level 사용자에게만 노출.
    • super admin(4): DB mm_level 값과 관계없이 해당 지자체의 모든 메뉴를 볼 수 있도록 모델에서 처리.

3. 기능 요구사항 (관리자 메뉴 관리)

3.1 공통 동작

  • 지자체 선택 필수

    • admin_effective_lg_idx()를 사용해 현재 작업 지자체를 결정한다.
    • 값이 null이면 지자체 선택 화면(/admin/select-local-government)으로 리다이렉트하고,
      “메뉴를 관리하려면 먼저 지자체를 선택하세요.” 메시지를 표출한다.
  • 메뉴 종류 선택

    • menu_type 목록에서 mt_code(admin/site 등)를 선택하여 관리 대상 메뉴 종류를 바꾼다.
    • 선택된 mt_idx + 현재 lg_idx 기준으로 메뉴 목록과 등록/수정 폼을 동작시킨다.

3.2 목록 영역 (트리 + 들여쓰기)

  • 선택한 mt_idx, 현재 lg_idx 기준으로 트리 구조를 평면 리스트로 렌더링한다.

    • mm_dep 값에 따라 좌측 padding을 주어 1차/2차/3차 메뉴를 시각적으로 구분한다.
    • 각 행에 다음 정보를 표시한다.
      • 메뉴명 (mm_name)
      • 링크 (mm_link)
      • 노출 대상 (mm_level → 역할 이름으로 변환, 빈값이면 “전체”)
      • 노출 여부 (mm_is_view Y/N)
    • 삭제 버튼
      • 현재 지자체(lg_idx) 소속인지 검증 후 삭제 허용.
      • 하위 메뉴가 있으면 삭제 불가.
  • 하위 메뉴 등록 버튼

    • 각 행 우측에 “하위 메뉴 추가” 버튼을 배치한다.
    • 클릭 시:
      • 우측 폼의 hidden 값에 mm_pidx=해당 행 mm_idx, mm_dep=해당 행 mm_dep+1을 세팅한다.
      • 폼 타이틀을 “하위 메뉴 등록”으로 변경(표시용).
    • 이렇게 등록된 메뉴는 동일한 컨트롤러(/admin/menus/store)를 통해 2차/3차 메뉴로 저장된다.
  • 순서 변경

    • 현재 구현과 동일하게 리스트 순서를 조정한 뒤, “순서 적용” 버튼으로 mm_idx[] 순서를 서버로 보낸다.
    • 서버에서는 현재 지자체(lg_idx) 기준으로만 mm_num을 재부여하여 순서를 저장한다.

3.3 등록/수정 폼

  • hidden 필드

    • mt_idx : 현재 선택된 메뉴 종류
    • mm_pidx : 부모 메뉴 PK (기본값 0, “하위 메뉴 추가” 시 부모 ID로 변경)
    • mm_dep : 깊이 (기본값 0, “하위 메뉴 추가” 시 부모+1)
    • mm_idx_edit : 수정 대상 PK (수정 모드일 때만 값 설정)
  • 입력 필드

    • mm_name : 필수, 메뉴명
    • mm_link : 링크 경로 (1차/하위 메뉴 모두 동일 규칙)
    • mm_level : 체크박스(전체 + 각 역할), super admin은 별도로 저장하지 않는다.
    • mm_is_view : 체크박스, 기본값 Y (노출)
  • 동작 모드

    • 등록 모드
      • mm_idx_edit 비어 있음.
      • mm_pidx=0, mm_dep=0이면 1차 메뉴 등록.
      • 하위 메뉴 추가로 진입한 경우, mm_pidx/mm_dep에 부모 정보가 채워진 상태로 등록.
    • 수정 모드
      • “수정” 버튼 클릭 시 해당 행의 정보를 폼에 로딩한다.
      • mm_pidx, mm_dep는 변경하지 않고, mm_name/mm_link/mm_level/mm_is_view만 수정.

4. 네비게이션 드롭다운 설계

4.1 공통 트리 헬퍼/서비스

  • 함수 예시: get_menu_tree(string $typeCode, int $lgIdx, int $mbLevel): array
    • menu_type.mt_codemt_idx 조회.
    • MenuModel::getVisibleByLevel(mt_idx, mbLevel, lgIdx)로 현재 지자체/역할 기준 메뉴 목록 조회.
    • 조회 결과(평면 배열)를 mm_idx/mm_pidx 기준으로 트리 구조로 변환:
      • 1차 메뉴: mm_pidx=0
      • children: mm_pidx=부모 mm_idx
      • 각 노드에 children 배열을 추가.

4.2 관리자 레이아웃(nav)

  • 파일: app/Views/admin/layout.php
  • 변경 내용
    • 기존 get_admin_nav_items()는 1차 메뉴 리스트만 반환하는 형태에서,
      트리 형태를 반환하는 헬퍼를 사용하도록 변경한다.
    • 상단 <nav>에서:
      • 1차 메뉴(트리 루트)를 루프 돌며 <a>를 렌더링.
      • 자식 메뉴가 있는 경우:
        • 1차 메뉴를 <div class="relative group">로 감싼 후,
        • group-hover:block 형태의 <div> 안에 children 메뉴들을 <a> 리스트로 렌더링.
    • <a>hrefbase_url(mm_link)로 풀 페이지 전환을 사용한다.

4.3 일반 사이트 레이아웃(nav)

  • (향후) 사이트용 레이아웃 파일에서:
    • get_menu_tree('site', 현재 lg_idx, 현재 사용자 레벨) 을 호출.
    • 관리자와 동일한 드롭다운 패턴으로 1차/하위 메뉴를 렌더링.
    • 링크 클릭 시 역시 풀 페이지 전환을 사용한다.

5. 지자체·권한 정책 정리

  • 지자체별 메뉴 분리

    • 모든 메뉴 조회·등록·수정·삭제·순서 변경은 mt_idx + lg_idx를 조건으로 수행한다.
    • 북구청에서 만든 메뉴(lg_idx=북구청)는 다른 구청(lg_idx가 다른 값)에서는 보이지 않고, 관리도 불가하다.
  • 역할별 노출

    • mm_level이 빈값인 메뉴는 모든 역할에 노출된다.
    • mm_level에 1,2,3이 포함된 경우, 해당 mb_level만 노출한다.
    • super admin(4)은 mm_level과 관계없이, 현재 지자체의 모든 mm_is_view='Y' 메뉴를 노출한다.

6. CSV 기반 초기 데이터 등록 계획

  1. CSV 구조 확인
    • “1차 메뉴정리” 파일의 컬럼 구조를 확정한다.
    • 최소 필요 컬럼 예시:
      • 메뉴 종류(admin/site)
      • 1차 메뉴명 / 1차 메뉴 링크
      • 2차 메뉴명 / 2차 메뉴 링크 (선택)
      • 3차 메뉴명 / 3차 메뉴 링크 (선택)
      • 노출 대상 역할, 사용 여부 등
  2. 초기 시드/Import 스크립트 작성
    • CSV 한 행당 menu 테이블 1개 또는 다수 행으로 변환.
    • 1차 메뉴는 mm_pidx=0, mm_dep=0 으로 insert.
    • 2차/3차 메뉴는 상위 메뉴의 mm_idxmm_pidx로 참조하여 insert.
    • 초기에는 특정 지자체(예: 대구 전체 or 테스트용 하나의 지자체) 기준으로만 시드하고,
      필요 시 “메뉴 복사” 기능으로 다른 지자체로 복제하는 방식을 고려.
  3. 개발/테스트 DB에 적용 및 검증
    • 관리자 /admin/menus에서 트리 구조와 드롭다운 노출 상태를 확인한다.
    • 역할별 노출, 지자체별 분리가 기대대로 동작하는지 검증한다.
  4. 운영 반영 절차 문서화
    • 운영 DB 초기 세팅 시, CSV → SQL/스크립트 실행 순서를 별도 문서에 정리한다.

7. 구현 순서 제안

  1. menu 테이블에 lg_idx 컬럼 및 인덱스 추가, 시드 SQL 정리 (완료 기준 재확인).
  2. MenuModellg_idx를 반영한 조회/정렬 메서드 정리 (getAllByType, getVisibleByLevel, getNextNum, setOrder 등).
  3. Admin\Menu 컨트롤러에서 지자체 필수 체크 및 지자체 소속 검증 로직 보완.
  4. admin/menu/index 뷰에서:
    • 하위 메뉴 등록 버튼 추가
    • mm_pidx/mm_dep 값을 활용한 2차/3차 메뉴 등록/표시 기능 구현.
  5. 트리 헬퍼(get_menu_tree 류) 구현 및 admin_helper에 연동.
  6. admin/layout 상단 네비게이션을 DB 트리 기반 드롭다운으로 교체.
  7. CSV 기반 초기 데이터 스크립트 작성 및 개발 환경에서 시범 적용.
  8. 통합 테스트 후 운영 반영 계획 수립.