회원가입 | 고객센터 |
DESIGNONEX
디자인원엑스
About
Service
Q&A
PR리그
자유게시판N
갤러리
포인트게임
공지사항N
통계
로그인 회원가입
고객센터
5. 관리자 기능 사용법

메뉴 관리

A Administrator
2026.04.21 01:22(수정됨) 110 0

1. 메뉴 관리 개요

DXCMS 관리자 패널의 [메뉴 관리] 메뉴는 사이트 프론트엔드에 표시되는 내비게이션 메뉴 구조와 링크를 설정하는 도구입니다. 게시판•정적 페이지•외부 URL을 메뉴 항목으로 등록하고, 2단계 계층 구조(상위 메뉴 + 하위 메뉴)로 구성할 수 있습니다. 메뉴 순서는 드래그 앤 드롭으로 직관적으로 변경합니다.

📌  접근 경로: 관리자 대시보드 → 메뉴 관리 (또는 URL: /admin/menus)


1.1 주요 기능 요약

기능 설명
2단계 계층 메뉴 최상위 메뉴(1차) 아래 하위 메뉴(2차)를 생성하는 2단계 계층 구조 지원. 3단계 이상의 중첩은 지원하지 않습니다.
드래그 앤 드롭 정렬 핸들을 드래그하여 메뉴 순서를 직관적으로 변경. 변경 즉시 서버에 AJAX로 저장(sort_reorder). 마우스·터치 모두 지원.
빠른 선택(Quick Select) 게시판 목록과 정적 페이지 목록에서 선택하면 메뉴명·URL이 자동 입력됩니다. 이미 사용 중인 항목은 회색으로 비활성 표시.
멀티사이트 지원 글로벌 탭과 도메인별 탭으로 구분하여 사이트마다 독립적인 메뉴 구조를 관리합니다.
URL 보안 검증 blocked:, blocked:, data: 등 위험한 URL을 자동 감지하여 제거합니다.
접근 권한 제어 메뉴 항목별로 전체 공개·로그인 회원·관리자 전용으로 접근 권한을 설정합니다.
메뉴 활성/비활성 체크박스 한 번으로 메뉴를 즉시 숨기거나 표시할 수 있습니다.


1.2 화면 레이아웃

메뉴 관리 화면은 사이트 탭 → 메뉴 목록(좌측) + 등록/수정 폼(우측)의 2열 구조로 구성됩니다.
 
영역 설명
사이트 탭 글로벌 탭과 도메인별 탭. 탭 클릭 시 해당 사이트의 메뉴 목록이 표시됩니다. 각 탭에 메뉴 수가 괄호로 표시됩니다.
메뉴 목록 (좌측) 현재 선택된 사이트의 메뉴가 계층 구조로 표시. 드래그 핸들과 순번, 메뉴명, URL, 배지, 수정/삭제 버튼 포함.
등록/수정 폼 (우측) 새 메뉴 추가 또는 기존 메뉴 수정 폼. 빠른 선택(Quick Select) 영역과 직접 입력 영역으로 구성. 화면 고정(sticky).
사이트 미선택 화면 탭을 선택하지 않으면 "관리할 사이트를 선택하세요" 안내 화면이 표시됩니다.


2. 사이트 탭 — 관리 대상 선택

메뉴 관리 화면 상단에 사이트 선택 탭이 표시됩니다. 탭을 클릭하여 관리할 메뉴 그룹을 선택하는 것이 첫 번째 단계입니다.


2.1 탭 종류

URL 파라미터 표시 내용
🌍 글로벌 ?site=__global__ site_domain이 빈 문자열인 메뉴. 모든 사이트에 공통 적용되는 메뉴 그룹.
도메인별 ?site={도메인} 해당 도메인에 귀속된 메뉴만 표시. 각 탭에 해당 도메인명과 메뉴 수가 표시됩니다.


2.2 메뉴 그룹(menu_group)과 사이트 도메인의 관계

DXCMS 메뉴 시스템은 site_domain 컬럼으로 메뉴를 구분합니다. 관리자 화면에서 선택한 탭에 따라 메뉴 저장 시 site_domain 값이 자동으로 설정됩니다.
 
글로벌 탭 선택 시 site_domain = "" (빈 문자열). menu_group = "main". 모든 사이트에서 공통으로 사용할 메뉴.
도메인 탭 선택 시 site_domain = 선택한 도메인(예: example.com). menu_group = 도메인명. 해당 도메인 전용 메뉴.
폼의 메뉴 그룹 표시 입력 폼에 현재 선택된 사이트가 읽기 전용으로 표시됩니다. 저장 시 자동으로 적용되므로 별도 선택 불필요.


3. 메뉴 목록 패널

왼쪽의 메뉴 목록 패널에는 선택된 사이트의 메뉴가 최상위 메뉴와 서브 메뉴 계층으로 표시됩니다.


3.1 최상위 메뉴(1차 메뉴) 행 구성

구성 요소 설명
드래그 핸들 (⠿) 좌측의 세로 점선 아이콘. 마우스로 드래그하여 메뉴 순서 변경. 드래그 중 파란색 점선 플레이스홀더로 위치 미리보기.
순번 숫자 현재 표시 순서를 나타내는 번호. 드래그로 순서 변경 시 즉시 갱신됩니다.
아이콘 설정된 이모지 아이콘. 흰색 배경의 둥근 박스에 표시됩니다. 아이콘 미설정 시 표시되지 않습니다.
메뉴명 굵은 글씨로 표시되는 메뉴 표시 이름입니다.
URL 경로 메뉴에 연결된 URL 경로(회색 코드 텍스트). 최대 180px 너비에서 말줄임 처리됩니다.
"숨김" 배지 status=0인 메뉴에 빨간색 "숨김" 배지가 표시됩니다. 프론트엔드에 표시되지 않는 메뉴임을 나타냅니다.
"회원"/"관리자" 배지 access_level=1이면 파란색 "회원" 배지, access_level=9이면 "관리자" 배지가 표시됩니다.
"하위 N개" 배지 하위 메뉴가 있는 경우 하늘색 "하위 N개" 배지로 서브 메뉴 수를 표시합니다.
[✏️ 수정] 버튼 /admin/menus/{id}?site={도메인}으로 이동하여 우측 폼에 해당 메뉴 정보가 채워집니다.
[🗑 삭제] 버튼 "삭제 시 서브메뉴도 함께 삭제됩니다. 계속하시겠습니까?" 확인 후 삭제. 해당 메뉴의 모든 하위 메뉴도 함께 삭제됩니다.


3.2 서브 메뉴(2차 메뉴) 행 구성

최상위 메뉴 아래 들여쓰기(ml-10)되어 └ 기호와 함께 표시됩니다.
 
드래그 핸들 서브 메뉴도 핸들로 드래그 순서 변경 가능. 서브 메뉴 간의 순서만 변경되며, 다른 상위 메뉴로 이동은 불가능합니다.
서브 순번 서브 메뉴 안에서의 순번. 상위 메뉴와 독립적으로 관리됩니다.
기호 서브 메뉴임을 나타내는 시각적 기호.
메뉴명 / URL 굵은 회색 텍스트 + 회색 URL 코드. 최대 130px에서 말줄임.
(숨김) 텍스트 status=0인 서브 메뉴에 빨간색 (숨김) 표시.
[수정] / [삭제] 버튼 최상위 메뉴보다 작은 크기(w-6 h-6)의 아이콘 버튼. 서브 메뉴 삭제 시 하위가 없으므로 단순 확인 후 삭제.


3.3 드래그 앤 드롭 정렬 상세

메뉴 목록에서 핸들(⠿)을 드래그하면 메뉴 순서를 변경할 수 있습니다.
 
항목 동작 설명
드래그 단위 최상위 메뉴: 전체 블록(최상위 메뉴 + 그 서브 메뉴들)이 함께 이동. 서브 메뉴: 해당 상위 메뉴의 서브 메뉴들 내에서만 순서 변경.
서버 저장 드래그 완료(mouseup/touchend) 즉시 AJAX POST(Content-Type: application/json)로 sort_reorder 요청 전송. 모든 메뉴의 sort_order와 parent_id가 한꺼번에 업데이트됩니다.
저장 확인 표시 저장 성공 시 목록 헤더 옆에 초록색 "✓ 저장됨" 텍스트가 2초간 표시됩니다.
플레이스홀더 드래그 중 파란 점선 박스가 현재 삽입될 위치를 미리 보여줍니다.
고스트 복제본 드래그 중 마우스 포인터 위치에 반투명(opacity 0.85) 복제 요소가 따라다닙니다.
sort_order 자동 계산 순서 저장 시 각 메뉴의 sort_order는 위치×10으로 계산됩니다. 예: 1번째=10, 2번째=20, 3번째=30.
터치 지원 모바일/태블릿 터치 이벤트(touchstart/touchmove/touchend)도 지원합니다.
CSRF 보안 AJAX 요청 시 JSON body에 _csrf 토큰이 포함되어 서버에서 검증합니다.

서브 메뉴는 자신이 속한 상위 메뉴 안에서만 순서를 변경할 수 있습니다. 서브 메뉴를 다른 상위 메뉴로 이동하려면 해당 메뉴를 삭제 후 원하는 상위 메뉴 아래에 다시 추가해야 합니다.


4. 메뉴 추가 및 수정 폼

우측 사이드바에 새 메뉴를 추가하거나 기존 메뉴를 수정하는 폼이 고정(sticky) 표시됩니다. 폼은 상단의 빠른 선택(Quick Select) 영역과 하단의 직접 입력 영역으로 구성됩니다.


4.1 빠른 선택 영역 (Quick Select)

하늘색 배경 박스로 구분된 빠른 선택 영역에서 게시판•페이지•공통 링크를 클릭하면 메뉴명과 URL이 자동으로 입력 필드에 채워집니다. 이미 이 사이트 메뉴에서 사용 중인 URL은 회색(비활성)으로 표시되어 중복 등록을 방지합니다.


(1) 게시판 선택 드롭다운

표시 범위 활성화된(status=1) 게시판 전체. 가나다(board_name) 오름차순 정렬.
미사용 게시판 아직 이 사이트 메뉴에 등록되지 않은 게시판만 선택 가능한 옵션으로 표시됩니다.
사용 중 게시판 이미 사용 중인 게시판은 회색 "✓ [게시판명] — 사용 중" 텍스트로 비활성 표시됩니다.
선택 시 자동 입력 게시판 선택 시 메뉴명(메뉴 이름이 비어있는 경우에만 자동 입력)과 URL(/게시판키)이 입력 필드에 채워집니다.
URL 형식 /게시판키 형식으로 자동 생성됩니다. 예: /notice, /free, /gallery.


(2) 정적 페이지 선택 드롭다운

표시 범위 활성화된(status=1) 정적 페이지 중 is_standalone=0(독립형 아님)인 페이지만 표시됩니다. 가나다(title) 오름차순 정렬.
독립형 페이지 제외 is_standalone=1인 팝업·랜딩 페이지는 메뉴와 무관하므로 목록에서 제외됩니다.
선택 시 자동 입력 페이지 선택 시 메뉴명(비어있으면 자동)과 URL(/슬러그)이 입력됩니다.
URL 형식 /페이지슬러그 형식. 예: /about, /terms, /privacy.


(3) 공통 링크 버튼

자주 사용하는 내부 링크를 버튼 한 번으로 빠르게 입력합니다.
 
버튼 자동 입력 URL 용도
/ 사이트 메인 홈페이지 링크.
로그인 /auth/login 로그인 페이지 링크.
가입 /auth/register 회원가입 페이지 링크.
마이 /auth/mypage 마이페이지(내 정보) 링크.

💡  공통 링크 버튼 클릭 시 메뉴명 필드가 비어있으면 버튼 텍스트(홈, 로그인 등)가 자동 입력됩니다. URL은 항상 자동 입력됩니다.


4.2 자동 입력 동작 규칙

빠른 선택에서 어떤 항목을 선택해도 동일한 규칙이 적용됩니다.
 
상황 동작
메뉴명 필드가 비어있을 때 메뉴명과 URL이 모두 자동 입력됩니다.
메뉴명 필드에 이미 값이 있을 때 URL만 자동 입력됩니다. 기존 메뉴명은 유지됩니다.
URL 입력 후 1초 URL 입력 필드가 하늘색으로 1초간 강조 표시되어 자동 입력되었음을 시각적으로 알려줍니다.
게시판/페이지 둘 다 선택 마지막에 선택한 것이 적용됩니다. 한쪽을 선택하면 다른 드롭다운은 자동으로 초기화됩니다.


5. 직접 입력 필드 전체 설명

빠른 선택 영역 아래 직접 입력 영역의 각 필드를 상세히 설명합니다. 빠른 선택을 사용하면 대부분 자동 입력되지만, 필요에 따라 수동으로 값을 변경할 수 있습니다.


5.1 메뉴 그룹 (자동 설정, 읽기 전용)

현재 선택된 사이트 탭에 따라 자동으로 결정되는 읽기 전용 필드입니다. 변경하려면 상단 사이트 탭에서 다른 탭을 선택해야 합니다.
 
탭 선택 저장되는 값
글로벌 탭 site_domain = "" (빈 문자열), menu_group = "main"
도메인 탭 site_domain = "example.com", menu_group = "example.com"

 

5.2 메뉴 표시 이름 (title) — 필수

내비게이션 바에 실제로 표시되는 메뉴 텍스트입니다.
 
필수 항목 비워두면 "메뉴 이름은 필수입니다." 오류가 발생합니다.
표시 위치 프론트엔드 내비게이션 바의 메뉴 링크 텍스트, 관리자 목록의 메뉴명.
권장 형식 간결하게 작성하세요. 예: 공지사항, 자유게시판, 고객센터, 회사소개.


5.3 이동할 URL (url)

메뉴 클릭 시 이동할 링크 경로입니다. 비워두면 클릭 불가능한 메뉴 헤더로만 작동합니다.
 
URL 형식 예시 및 설명
내부 경로 (슬래시 시작) /notice, /free, /about — 사이트 내부 페이지. 가장 일반적인 형식.
외부 URL (https://) https://example.com/page — 외부 사이트 링크. 새 창 열기(_blank)와 함께 사용 권장.
빈 값 (URL 없음) URL을 비우면 클릭해도 이동하지 않는 메뉴 제목(드롭다운 헤더)으로 활용 가능.

⚠️  blocked:, blocked:, data:, blocked: 로 시작하는 URL은 저장 시 자동으로 빈 값으로 초기화되고 "위험한 URL이 감지되어 자동 제거되었습니다." 경고가 표시됩니다.


5.4 아이콘 (icon)

메뉴 이름 앞에 표시할 이모지나 특수문자를 입력합니다.
 
입력 형식 이모지(🏠, 📋, ⚙️ 등) 또는 텍스트를 직접 입력합니다.
Font Awesome 테마가 Font Awesome을 로드하는 경우 <i class="fas fa-home"></i> 형식의 HTML도 사용 가능합니다. 단, 이 경우 htmlspecialchars가 적용되어 이스케이프될 수 있으므로 테마 템플릿에서 이스케이프 해제 처리가 필요합니다.
표시 위치 관리자 목록에서는 흰색 둥근 박스 안에 표시. 프론트엔드에서는 테마 템플릿의 처리 방식에 따릅니다.
선택사항 비워두면 아이콘 없이 텍스트만 표시됩니다.


5.5 소속 상위 메뉴 (parent_id)

이 메뉴를 어느 상위 메뉴의 서브 메뉴로 설정할지 선택합니다.
 
선택값 동작
최상위 (1차 메뉴) — parent_id=0으로 저장. 독립된 최상위 메뉴로 생성됩니다. 메뉴 목록에서 왼쪽 파란 세로선으로 구분되어 표시됩니다.
[메뉴명] 선택 선택한 상위 메뉴의 서브 메뉴로 생성됩니다. 드롭다운에는 현재 사이트의 최상위 메뉴만 표시됩니다.

💡  서브 메뉴로 설정하면 메뉴 목록에서 상위 메뉴 아래 └ 기호와 함께 들여쓰기되어 표시됩니다. 2단계 이상 중첩(서브의 서브)은 지원하지 않습니다.


5.6 열기 방식 (target)

옵션 동작
현재 창 (_self) 메뉴 클릭 시 현재 탭에서 URL로 이동합니다. 사이트 내부 링크에 적합합니다. 기본값.
새 창 (_blank) 메뉴 클릭 시 새 탭에서 URL이 열립니다. 외부 사이트 링크에 권장합니다.


5.7 접근 권한 (access_level)

이 메뉴 항목이 표시될 최소 사용자 권한 레벨을 설정합니다.
 
권한 레벨 관리자 목록 배지 표시 대상 및 설명
0 — 전체 공개 배지 없음 비회원 포함 모든 방문자에게 표시됩니다. 일반적인 메뉴에 사용합니다.
1 — 로그인 회원 회원 로그인한 회원에게만 표시됩니다. 관리자 목록에 파란색 "회원" 배지가 표시됩니다.
9 — 관리자 전용 관리자 관리자 권한(access_level=9) 계정에만 표시됩니다. 관리자 목록에 "관리자" 배지 표시.

💡  접근 권한은 메뉴 표시 여부만 제어합니다. 실제 페이지•게시판 접근 권한은 각 게시판/페이지의 설정에서 별도로 관리합니다.


5.8 정렬 순서 (sort_order)

메뉴의 초기 정렬 순서를 지정합니다. 드래그로 변경하면 이 값이 자동으로 업데이트됩니다.
 
기본값 0. 신규 등록 시 0으로 저장됩니다.
정렬 기준 sort_order 오름차순 → 같은 값이면 ID 오름차순.
드래그 변경 시 드래그로 순서를 변경하면 서버에서 sort_order가 위치×10으로 자동 재계산됩니다. 이 필드의 값도 함께 업데이트됩니다.
수동 입력 권장 드래그 사용 시 이 값을 직접 입력할 필요가 거의 없습니다. 드래그 없이 순서를 정밀하게 제어할 때만 입력하세요.


5.9 메뉴 활성화 (status)

체크박스로 메뉴의 표시/숨김을 제어합니다.
 
체크 (status=1) 메뉴가 프론트엔드에 표시됩니다. 기본값.
미체크 (status=0) 메뉴가 프론트엔드에서 숨겨집니다. 관리자 목록에서 "숨김" 배지가 표시됩니다. 메뉴는 DB에 유지됩니다.


6. 저장 및 삭제 처리


6.1 메뉴 저장(save) 처리

  1. CSRF 토큰 검증
  2. 메뉴 이름(title) 필수 검증 — 빈 값이면 "메뉴 이름은 필수입니다." 오류
  3. URL DxSanitizer::menuUrl()로 위험 URL 검증 및 정리
  4. site_domain 컬럼 자동 추가 (menus 테이블에 컬럼 없으면 ALTER TABLE)
  5. menus 테이블 INSERT(신규) 또는 UPDATE(수정)
  6. DxCache::deletePrefix("menu_") — 메뉴 캐시 초기화
  7. PRG 패턴으로 리다이렉트 — 저장 후 ?site={도메인} 파라미터 유지하며 목록으로 이동


6.2 메뉴 삭제(delete) 처리

  1. CSRF 토큰 검증
  2. 삭제 대상 메뉴의 site_domain 조회 (삭제 후 리다이렉트 시 탭 유지용)
  3. menus 테이블에서 id={삭제 ID} 레코드 삭제
  4. menus 테이블에서 parent_id={삭제 ID} 레코드 삭제 (서브 메뉴 일괄 삭제)
  5. DxCache::deletePrefix("menu_") — 메뉴 캐시 초기화
  6. PRG 패턴으로 리다이렉트

🚨  최상위 메뉴를 삭제하면 그 아래의 모든 서브 메뉴도 함께 삭제됩니다. 삭제 전 확인 창에 "삭제 시 서브메뉴도 함께 삭제됩니다." 경고가 표시되므로 반드시 확인 후 진행하세요.


6.3 드래그 정렬 저장(sort_reorder) 처리

  1. Content-Type: application/json인 POST 요청 감지
  2. JSON body에서 act, _csrf, items 파싱
  3. CSRF 토큰 검증 (Secure::getInstance()->csrfToken()과 비교)
  4. items 배열의 각 항목에서 id, sort_order, parent_id를 읽어 menus 테이블 UPDATE
  5. DxCache::deletePrefix("menu_") 호출
  6. JSON 응답 반환: {"success":true,"updated":N}


6.4 오류 메시지 및 대처

오류 메시지 원인 및 해결
메뉴 이름은 필수입니다. 메뉴 표시 이름 필드가 비어있습니다. 메뉴명을 입력하고 다시 저장하세요.
위험한 URL이 감지되어 자동 제거되었습니다. URL 필드에 blocked: 등 위험 프로토콜이 입력되어 자동으로 빈 값으로 처리되었습니다. 올바른 URL로 수정하세요.
CSRF token mismatch (드래그 정렬 시) 세션이 만료되었거나 보안 토큰이 불일치합니다. 페이지를 새로고침(F5)한 후 다시 시도하세요.


7. 전체 사용 절차


7.1 새 메뉴 추가 절차

  1. 관리자 대시보드 → [메뉴 관리] 메뉴 클릭
  2. 상단 탭에서 관리할 사이트(글로벌 또는 특정 도메인) 탭 클릭
  3. 우측 사이드바 폼 상단 Quick Select 영역에서 연결할 게시판 또는 페이지 선택 (또는 공통 링크 버튼 클릭)
  4. 메뉴명 확인 (자동 입력된 경우) 또는 직접 입력
  5. URL 확인 (자동 입력된 경우) 또는 직접 입력
  6. 아이콘 입력 (이모지 등, 선택사항)
  7. 소속 상위 메뉴 선택 (최상위 또는 기존 1차 메뉴 중 선택)
  8. 열기 방식 선택 (현재 창 / 새 창)
  9. 접근 권한 선택 (전체 공개 / 로그인 회원 / 관리자 전용)
  10. [메뉴 활성화] 체크박스 확인 (기본값: 체크됨)
  11. [메뉴 생성하기] 버튼 클릭
  12. 저장 완료 후 목록에 새 메뉴 추가됨 확인


7.2 메뉴 순서 변경 절차

  1. 해당 사이트 탭 선택
  2. 메뉴 목록에서 이동할 메뉴 행의 ⠿ 핸들 위에 마우스 포인터 올리기 (커서가 grab으로 변경됨)
  3. 마우스 버튼을 누른 채로 원하는 위치로 드래그
  4. 파란 점선 플레이스홀더로 위치 확인 후 마우스 버튼 해제
  5. 상단 "✓ 저장됨" 메시지로 서버 저장 확인


7.3 메뉴 수정 절차

  1. 해당 사이트 탭 선택
  2. 수정할 메뉴의 [✏️] 버튼 클릭
  3. 우측 폼에 기존 설정이 자동으로 채워짐 확인
  4. 변경할 항목 수정 (이름, URL, 아이콘, 상위 메뉴, 권한, 상태 등)
  5. [설정 내용 저장] 버튼 클릭
  6. 취소 시 [취소] 버튼 클릭


8. 실전 메뉴 구성 예시

다양한 사이트 유형별 메뉴 구조 예시를 안내합니다.


예시 1: 일반 커뮤니티 사이트 메뉴

계층 메뉴명 URL 상위 메뉴 접근 권한 순서
1 🏠 / 최상위 전체 10
1 📋 커뮤니티   최상위 전체 20
2   └─ 자유게시판 /free 커뮤니티 회원 10
2   └─ 유머 /humor 커뮤니티 회원 20
1 📢 공지사항 /notice 최상위 전체 30
1 🙋 고객센터 /cs 최상위 전체 40


예시 2: 기업 홈페이지 메뉴

계층 메뉴명 URL 상위 메뉴 접근 권한 열기
1 회사소개 /about 최상위 전체 _self
1 서비스   최상위 전체 _self
2   └─ 서비스A /service-a 서비스 전체 _self
1 📰 뉴스룸 /news 최상위 전체 _self
1 채용 https://recruit.example.com 최상위 전체 _blank

💡  외부 채용 사이트처럼 외부 URL은 열기 방식을 _blank(새 창)로 설정하세요.


9. 자주 묻는 질문 (FAQ)


Q1. 메뉴를 저장했는데 프론트엔드에 반영이 안 됩니다.

A. 다음을 확인하세요. ① 메뉴 활성화 체크박스가 체크되어 있는지 확인. ② 접근 권한이 전체 공개(0)인지 확인. ③ 테마 템플릿이 올바르게 메뉴를 불러오는지 확인. ④ DxCache가 활성화된 환경이면 캐시가 초기화될 때까지 잠시 기다리거나 캐시 초기화 기능을 사용하세요.


Q2. 드래그로 순서를 변경했는데 "저장됨"이 표시되지 않습니다.

A. 세션이 만료되어 CSRF 토큰이 불일치하거나 서버 연결 문제일 수 있습니다. 페이지를 새로고침(F5) 후 다시 드래그하세요. 새로고침 후에도 문제가 지속되면 서버 오류 로그를 확인하세요.


Q3. 서브 메뉴를 다른 상위 메뉴로 이동할 수 있나요?

A. 드래그로는 현재 상위 메뉴 내에서만 순서 변경이 가능합니다. 다른 상위 메뉴로 이동하려면 해당 서브 메뉴를 삭제하고 원하는 상위 메뉴 아래에 새로 추가해야 합니다. [수정] 버튼으로 parent_id만 변경하는 방법도 가능합니다.


Q4. 3단계 이상의 중첩 메뉴(서브의 서브)를 만들 수 있나요?

A. 현재 버전에서는 2단계 계층(최상위 + 서브)만 지원합니다. 3단계 이상의 중첩은 지원하지 않습니다. 복잡한 메뉴 구조가 필요한 경우 상위 메뉴를 URL 없는 헤더로 만들고 하위를 구성하는 방식으로 시각적 그룹화를 구현하세요.


Q5. 같은 URL을 여러 메뉴에서 사용하는 것이 가능한가요?

A. 같은 URL을 여러 메뉴에서 사용하는 것이 기술적으로 가능합니다. 단, 빠른 선택 드롭다운에서는 이미 사용 중인 URL을 비활성으로 표시하여 중복 추가를 시각적으로 방지합니다. 직접 입력 필드에서는 제한 없이 동일 URL을 입력할 수 있습니다.


Q6. 글로벌 메뉴와 도메인별 메뉴를 동시에 사용할 수 있나요?

A. 네, 가능합니다. 프론트엔드 테마에서 글로벌 메뉴(site_domain="")와 현재 도메인 메뉴(site_domain=현재도메인)를 각각 또는 합쳐서 불러올 수 있습니다. 구체적인 구현 방식은 테마 개발자에게 문의하세요.


Q7. 메뉴 이름에 HTML 태그를 사용할 수 있나요?

A. 메뉴명은 htmlspecialchars()로 이스케이프 처리되어 저장됩니다. HTML 태그 입력 시 태그가 그대로 텍스트로 표시됩니다. 아이콘 삽입이 필요하면 이모지를 사용하거나 테마 템플릿에서 직접 처리하세요.


Q8. 메뉴 캐시 초기화는 언제 자동으로 이루어지나요?

A. 메뉴 저장•수정•삭제•드래그 정렬 변경 시마다 DxCache::deletePrefix("menu_")가 자동 호출되어 메뉴 관련 캐시가 초기화됩니다. 별도의 수동 캐시 초기화가 필요하지 않습니다.


10. 용어 정리

용어 설명
menus 메뉴 데이터를 저장하는 DB 테이블. id, site_domain, menu_group, parent_id, title, url, target, icon, access_level, status, sort_order 컬럼.
site_domain 메뉴가 귀속된 도메인. 빈 문자열이면 글로벌(모든 사이트 공통). 도메인 탭 선택 시 해당 도메인명으로 저장.
menu_group 사이트별 메뉴 그룹 식별자. 글로벌이면 "main", 도메인이면 도메인명. site_domain과 연동.
parent_id 상위 메뉴 ID. 0이면 최상위(1차) 메뉴. 상위 메뉴 ID이면 서브(2차) 메뉴.
title 메뉴 표시 이름. 내비게이션 바에 표시되는 텍스트.
url 메뉴 클릭 시 이동할 URL. 내부 경로(/게시판키) 또는 외부 URL.
target 링크 열기 방식. _self(현재 탭) 또는 _blank(새 탭).
icon 메뉴 이름 앞에 표시할 이모지 또는 아이콘 코드.
access_level 메뉴 표시 최소 권한. 0(전체), 1(로그인 회원), 9(관리자).
status 메뉴 활성화 여부. 1(표시), 0(숨김).
sort_order 메뉴 표시 순서. 드래그 변경 시 위치×10으로 자동 계산.
sort_reorder 드래그 정렬 저장 AJAX 액션명. JSON body로 전체 메뉴 순서·parent_id를 한 번에 업데이트.
Quick Select 게시판·페이지·공통 링크를 선택하면 메뉴명·URL이 자동 입력되는 빠른 선택 UI.
글로벌 탭 site_domain이 빈 문자열인 메뉴를 관리하는 탭. 모든 사이트 공통 메뉴.
DxSanitizer::menuUrl() URL 입력 시 blocked:, blocked: 등 위험 프로토콜을 검증·제거하는 메서드.
DxCache::deletePrefix("menu_") 메뉴 변경 시 menu_ 프리픽스 캐시를 일괄 삭제하는 메서드.
드래그 핸들 메뉴 행 좌측의 세로 점선(⠿) 아이콘. 이 영역을 드래그하여 순서 변경.
플레이스홀더 드래그 중 삽입 위치를 보여주는 파란색 점선 박스.
PRG 패턴 Post-Redirect-Get. 저장 후 리다이렉트하여 새로고침 시 중복 제출 방지.
CSRF 토큰 폼 위조 공격 방지 토큰. 일반 POST와 AJAX JSON 요청 모두에 검증.

댓글0

로그인 후 댓글을 작성할 수 있습니다.
5. 관리자 기능 사용법 DX 마켓 2026.04.21 5. 관리자 기능 사용법 사이트 설정 2026.04.21 5. 관리자 기능 사용법 소셜 로그인 2026.04.21 5. 관리자 기능 사용법 멀티사이트 2026.04.21 5. 관리자 기능 사용법 테마 2026.04.21 5. 관리자 기능 사용법 플러그인 2026.04.21 5. 관리자 기능 사용법 실시간 소켓 2026.04.21 5. 관리자 기능 사용법 다운로드 통계 2026.04.21 5. 관리자 기능 사용법 통계 2026.04.21 5. 관리자 기능 사용법 회원 랭킹 2026.04.21 5. 관리자 기능 사용법 포인트샵 2026.04.21 5. 관리자 기능 사용법 레벨 관리 2026.04.21 5. 관리자 기능 사용법 포인트 관리 2026.04.21 5. 관리자 기능 사용법 문자 서비스 2026.04.21 5. 관리자 기능 사용법 메일 보내기 2026.04.21 5. 관리자 기능 사용법 회원 관리 2026.04.21 5. 관리자 기능 사용법 메뉴 관리 2026.04.21 5. 관리자 기능 사용법 인기글 2026.04.21 5. 관리자 기능 사용법 카테고리 2026.04.21 5. 관리자 기능 사용법 게시판 그룹 2026.04.21
30
전체 회원
269
전체 게시글
144
전체 댓글
2
오늘 방문
28,533
전체 방문
2
현재 접속
인기글 7일 이내
최신글
최신댓글
목록