1장. 데이터베이스 스키마 개요
DXCMS v8.1.0의 데이터베이스는 MySQL 5.6+ / MariaDB 10.1+ 를 지원합니다. 모든 테이블은 utf8mb4_unicode_ci 문자셋과 InnoDB 엔진을 사용합니다.
1.1 전체 테이블 목록
| # |
테이블명 |
분류 |
설명 |
| 1 |
dx_members |
회원 |
회원 기본 정보, 포인트, 경험치, 소셜 계정 |
| 2 |
dx_boards |
게시판 |
게시판 설정 (권한, 스킨, 기능 ON/OFF) |
| 3 |
dx_posts |
게시판 |
게시글 (FULLTEXT 인덱스, 인기점수) |
| 4 |
dx_comments |
게시판 |
댓글 (트리 구조, depth 기반) |
| 5 |
dx_post_files |
게시판 |
첨부파일 (썸네일 경로 포함) |
| 6 |
dx_post_links |
게시판 |
게시글 다중 링크 |
| 7 |
dx_link_clicks |
게시판 |
링크 클릭 로그 (IP+일자 중복 방지) |
| 8 |
dx_categories |
게시판 |
무한 분류 카테고리 (path 기반) |
| 9 |
dx_board_groups |
게시판 |
게시판 그룹 |
| 10 |
dx_post_drafts |
게시판 |
글쓰기 임시저장 |
| 11 |
dx_social_accounts |
인증 |
소셜 로그인 연결 계정 |
| 12 |
dx_member_logs |
인증 |
로그인/로그아웃 이벤트 로그 |
| 13 |
dx_member_sessions |
인증 |
회원 접속 세션 상세 기록 |
| 14 |
dx_session_rescue |
인증 |
세션 만료 긴급 구조 임시저장 ★신규 |
| 15 |
dx_memos |
소통 |
회원 간 쪽지 |
| 16 |
dx_notifications |
소통 |
실시간 알림 (소켓 + DB 병행) |
| 17 |
dx_friends |
소통 |
친구/차단 관계 (단방향) |
| 18 |
dx_likes |
소통 |
좋아요 (게시글/댓글 대상) |
| 19 |
dx_scraps |
소통 |
게시글 스크랩 |
| 20 |
dx_dm_messages |
소통 |
1:1 채팅 메시지 |
| 21 |
dx_point_log |
포인트 |
포인트 변동 내역 |
| 22 |
dx_exp_log |
포인트 |
경험치 변동 내역 |
| 23 |
dx_level_config |
포인트 |
레벨 설정 (기본 150레벨) |
| 24 |
dx_shop_items |
포인트샵 |
포인트샵 상품 |
| 25 |
dx_shop_purchases |
포인트샵 |
구매 내역 |
| 26 |
dx_settings |
시스템 |
시스템 설정 키-값 스토어 |
| 27 |
dx_pages |
시스템 |
관리 페이지 |
| 28 |
dx_menus |
시스템 |
메뉴 (트리 구조) |
| 29 |
dx_themes |
시스템 |
테마 상태 추적 |
| 30 |
dx_plugins |
시스템 |
플러그인 (공유/설정 포함) |
| 31 |
dx_sites |
시스템 |
멀티사이트 |
| 32 |
dx_popups |
시스템 |
팝업 |
| 33 |
dx_global_notices |
시스템 |
전체 공지 (게시판 상단 표시) |
| 34 |
dx_visits |
통계 |
일별 방문자 집계 |
| 35 |
dx_visit_logs |
통계 |
방문자 상세 로그 (봇/브라우저 분석) |
| 36 |
dx_search_keywords |
통계 |
검색어 통계 (FULLTEXT) |
| 37 |
dx_api_keys |
API |
소켓 API 키 관리 |
| 38 |
dx_api_logs |
API |
API 접근 로그 |
| 39 |
dx_surveys |
설문 |
설문 기본 정보 |
| 40 |
dx_survey_questions |
설문 |
설문 문항 |
| 41 |
dx_survey_answers |
설문 |
설문 응답 |
| 42 |
dx_survey_votes |
설문 |
설문 참여 중복 방지 |
| 43 |
dx_download_log |
기타 |
파일 다운로드 이력 |
| 44 |
dx_sms_logs |
기타 |
SMS 발송 로그 |
1.2 공통 설계 규칙
엔진: InnoDB (트랜잭션, 외래키 지원)
문자셋: utf8mb4_unicode_ci (이모지 지원)
PK 전략: INT AUTO_INCREMENT (일반 테이블)
BIGINT 밀리초 타임스탬프 (dx_posts, dx_comments)
BIGINT microtime (dx_api_keys)
논리 삭제: status=0 또는 is_deleted=1 (물리 삭제 최소화)
소프트 삭제 예외: dx_likes, dx_scraps, dx_link_clicks (물리 삭제)
시각: DATETIME (timezone: Asia/Seoul)
인덱스: 복합 인덱스 우선 (쿼리 패턴 기반)
FULLTEXT: dx_posts(title,content), dx_search_keywords(keyword)
2장. 회원 및 인증 테이블
2.1 dx_members — 회원
사이트 회원의 모든 기본 정보를 저장합니다. 포인트, 경험치, 레벨, 소셜 SNS 정보, 프로필까지 통합 관리합니다. 탈퇴는 status=0으로 처리하며 데이터를 보존합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK — 회원 고유 ID |
| login_id |
VARCHAR(50) |
NO |
|
UNIQUE — 로그인 아이디 (영문/숫자 4~50자) |
| password |
VARCHAR(255) |
NO |
|
BCrypt 해시. 소셜 전용 계정은 랜덤 해시 |
| name |
VARCHAR(100) |
NO |
|
이름 또는 닉네임 |
| email |
VARCHAR(191) |
NO |
|
UNIQUE — 이메일 (소셜 미연동 시 @social.local) |
| phone |
VARCHAR(30) |
YES |
NULL |
전화번호 (선택) |
| role |
ENUM(member,manager,admin) |
NO |
member |
권한. admin만 관리자 접근 |
| status |
TINYINT(1) |
NO |
1 |
1=활성, 0=비활성(탈퇴). 0이면 로그인 불가 |
| profile_img |
VARCHAR(500) |
YES |
NULL |
"profiles/{파일명}" 형식 (GD 400×400 리사이즈) |
| point |
INT(11) |
NO |
0 |
현재 보유 포인트 |
| exp |
INT(11) |
NO |
0 |
누적 경험치 |
| level |
SMALLINT(5) |
NO |
1 |
현재 레벨 (dx_level_config 기준) |
| last_login |
DATETIME |
YES |
NULL |
마지막 로그인 일시 |
| last_ip |
VARCHAR(45) |
YES |
NULL |
마지막 로그인 IP (IPv6 대응 45자) |
| login_fail |
TINYINT(3) |
NO |
0 |
연속 로그인 실패 횟수. 10 이상이면 계정 잠금 |
| join_date |
DATETIME |
NO |
|
가입 일시. HMAC 토큰 생성에 사용 (불변) |
| reg_ip |
VARCHAR(45) |
YES |
NULL |
가입 시 IP |
| reg_ua |
VARCHAR(500) |
YES |
NULL |
가입 시 User-Agent |
| reg_device |
VARCHAR(10) |
YES |
NULL |
가입 디바이스: pc|mobile|tablet |
| reg_os |
VARCHAR(50) |
YES |
NULL |
가입 OS (Windows, macOS, Android 등) |
| reg_browser |
VARCHAR(50) |
YES |
NULL |
가입 브라우저 |
| memo |
TEXT |
YES |
NULL |
관리자 메모 |
| bio |
TEXT |
YES |
NULL |
자기소개 (마이페이지 표시) |
| website |
VARCHAR(500) |
YES |
NULL |
개인 사이트 URL |
| blog |
VARCHAR(500) |
YES |
NULL |
블로그 URL |
| sns_instagram |
VARCHAR(200) |
YES |
NULL |
Instagram URL |
| sns_twitter |
VARCHAR(200) |
YES |
NULL |
Twitter/X URL |
| sns_facebook |
VARCHAR(200) |
YES |
NULL |
Facebook URL |
| sns_youtube |
VARCHAR(200) |
YES |
NULL |
YouTube URL |
| sns_github |
VARCHAR(200) |
YES |
NULL |
GitHub URL |
| remember_token |
VARCHAR(128) |
YES |
NULL |
Remember Me 64자 hex 토큰 (migrate 추가) |
| remember_expires |
DATETIME |
YES |
NULL |
Remember Me 만료 일시 (migrate 추가) |
| 인덱스명 |
종류 |
컬럼 |
| PRIMARY KEY |
PK |
id |
| uk_login_id |
UNIQUE |
login_id |
| uk_email |
UNIQUE |
email |
| idx_role |
INDEX |
role |
| idx_status |
INDEX |
status |
| idx_level |
INDEX |
level |
| idx_join_date |
INDEX |
join_date — 가입일 정렬 최적화 (v5.0.0) |
💡 remember_token / remember_expires 컬럼
schema.sql에는 없고 migrate.php에서 ALTER TABLE로 추가됩니다.
신규 설치 시에는 migrate.php 실행 필요.
Auth::tryRememberMe()와 /api/session_extend가 이 컬럼을 사용합니다.
2.2 dx_social_accounts — 소셜 로그인 연결
카카오, 네이버, 구글, GitHub 소셜 계정과 DXCMS 회원을 연결합니다. 한 회원이 여러 소셜 계정을 연결할 수 있으며, (provider, provider_id) 조합이 UNIQUE입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
dx_members.id — 연결된 DXCMS 회원 |
| provider |
VARCHAR(30) |
NO |
|
kakao | naver | google | github |
| provider_id |
VARCHAR(191) |
NO |
|
소셜 서비스 내 사용자 고유 ID |
| email |
VARCHAR(191) |
YES |
NULL |
소셜 계정 이메일 |
| name |
VARCHAR(100) |
YES |
NULL |
소셜 계정 이름/닉네임 |
| profile_img |
VARCHAR(500) |
YES |
NULL |
소셜 프로필 이미지 URL |
| access_token |
TEXT |
YES |
NULL |
액세스 토큰 (보안상 빈 문자열로 저장) |
| created_at |
DATETIME |
NO |
|
최초 연결 일시 |
| last_login |
DATETIME |
YES |
NULL |
이 소셜 계정으로 마지막 로그인 시각 |
| 인덱스명 |
종류 |
컬럼 |
| PRIMARY KEY |
PK |
id |
| uk_provider |
UNIQUE |
provider, provider_id |
| idx_member_id |
INDEX |
member_id |
2.3 dx_member_logs — 로그인/로그아웃 이벤트
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
dx_members.id |
| event |
ENUM(login,logout,session_expire) |
NO |
|
이벤트 종류 |
| ip |
VARCHAR(45) |
YES |
NULL |
접속 IP |
| user_agent |
VARCHAR(300) |
YES |
NULL |
브라우저/OS 정보 |
| created_at |
DATETIME |
NO |
|
이벤트 발생 시각 |
2.4 dx_member_sessions — 접속 세션 기록
로그인부터 로그아웃(또는 세션 만료)까지의 접속 이력을 기록합니다. session_key는 SHA256(session_id)로 원본 세션 ID를 노출하지 않습니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
dx_members.id |
| session_key |
VARCHAR(64) |
NO |
|
UNIQUE — SHA256(session_id) |
| login_at |
DATETIME |
NO |
|
로그인 시각 |
| logout_at |
DATETIME |
YES |
NULL |
로그아웃 시각 (NULL=접속중 or 만료) |
| last_seen_at |
DATETIME |
NO |
|
마지막 요청 시각 |
| end_reason |
ENUM(logout,session_expire,unknown) |
YES |
NULL |
종료 사유 |
| ip |
VARCHAR(45) |
YES |
NULL |
접속 IP |
| user_agent |
VARCHAR(300) |
YES |
NULL |
브라우저/OS |
| duration_sec |
INT(11) UNSIGNED |
YES |
NULL |
총 접속 시간 (초) |
2.5 dx_session_rescue — 세션 긴급 구조 ★ 신규
v8.2.1에서 추가된 테이블입니다. 세션 만료 시 글쓰기/수정 중이던 내용을 임시 보관하고, 재로그인 후 복원하는 데 사용합니다. 24시간 후 자동 만료됩니다.
★ v8.2.1 신규 테이블
글쓰기/수정 페이지 진입 즉시 rescue_key와 함께 레코드를 INSERT합니다.
30초마다 JS가 제목과 내용을 UPDATE합니다.
세션 만료 시 로그인 후 rescue_key로 내용을 복원하고 DELETE합니다.
extend/bottom/01_session_rescue_gc.php가 2% 확률로 만료 레코드를 자동 삭제합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| rescue_key |
VARCHAR(32) |
NO |
|
UNIQUE — 32자 hex UUID. URL 파라미터로 전달 |
| member_id |
BIGINT(20) UNSIGNED |
NO |
0 |
dx_members.id — 해당 회원 ID |
| board_key |
VARCHAR(100) |
NO |
|
작성 중인 게시판 키 |
| board_name |
VARCHAR(200) |
NO |
|
게시판 한글 이름 (복원 시 토스트 메시지에 표시) |
| edit_post_id |
VARCHAR(32) |
NO |
0 |
수정 중인 게시글 ID. 신규 글이면 0 |
| title |
VARCHAR(255) |
NO |
|
임시 저장된 제목 |
| content |
MEDIUMTEXT |
YES |
NULL |
임시 저장된 본문 (에디터 HTML 포함) |
| created_at |
DATETIME |
NO |
|
레코드 생성 시각 (진입 즉시) |
| updated_at |
DATETIME |
NO |
|
마지막 업데이트 시각 (30초마다 갱신) |
| expires_at |
DATETIME |
NO |
|
만료 시각 (생성 후 24시간) |
| 인덱스명 |
종류 |
컬럼 |
| PRIMARY KEY |
PK |
id |
| uk_rescue_key |
UNIQUE |
rescue_key |
| idx_expires |
INDEX |
expires_at — GC 쿼리 최적화 |
| idx_member |
INDEX |
member_id |
3장. 게시판 관련 테이블
3.1 dx_boards — 게시판 설정
게시판의 모든 설정값을 저장합니다. board_key가 URL로 사용되며 UNIQUE입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| board_key |
VARCHAR(100) |
NO |
|
UNIQUE — URL 경로명 (예: free, notice) |
| board_name |
VARCHAR(191) |
NO |
|
게시판 표시 이름 |
| description |
TEXT |
YES |
NULL |
게시판 설명 |
| board_type |
ENUM(normal,gallery,qa,faq,news) |
NO |
normal |
게시판 유형 |
| skin |
VARCHAR(100) |
NO |
default |
게시판 스킨 |
| group_id |
INT(11) UNSIGNED |
NO |
0 |
dx_board_groups.id |
| read_level |
TINYINT(1) |
NO |
0 |
읽기 권한: 0=전체, 1=회원, 9=관리자 |
| write_level |
TINYINT(1) |
NO |
1 |
쓰기 권한: 1=회원, 9=관리자 |
| comment_level |
TINYINT(1) |
NO |
1 |
댓글 권한 |
| per_page |
TINYINT(3) |
NO |
20 |
페이지당 게시글 수 |
| use_comment |
TINYINT(1) |
NO |
1 |
댓글 사용 여부 |
| use_file |
TINYINT(1) |
NO |
1 |
파일 첨부 사용 여부 |
| use_notice |
TINYINT(1) |
NO |
1 |
공지 기능 사용 여부 |
| use_category |
TINYINT(1) |
NO |
0 |
카테고리 사용 여부 |
| use_tag |
TINYINT(1) |
NO |
0 |
태그 사용 여부 |
| use_anonymous |
TINYINT(1) |
NO |
0 |
비회원 작성 허용 |
| use_survey |
TINYINT(1) |
NO |
0 |
설문 기능 사용 |
| file_count |
TINYINT(2) |
NO |
5 |
최대 첨부파일 수 |
| thumb_type |
VARCHAR(20) |
NO |
crop |
썸네일 유형: fit|crop|width|height |
| thumb_w |
SMALLINT(5) |
NO |
300 |
썸네일 가로(px) |
| thumb_h |
SMALLINT(5) |
NO |
200 |
썸네일 세로(px) |
| site_domain |
VARCHAR(191) |
NO |
|
멀티사이트 도메인 (빈값=전체 공통) |
| status |
TINYINT(1) |
NO |
1 |
1=활성, 0=비활성 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
3.2 dx_posts — 게시글
게시글의 내용과 메타 정보를 저장합니다. id는 밀리초 타임스탬프로 생성되어 시간순 정렬이 가능합니다. FULLTEXT 인덱스로 전문 검색을 지원합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED |
NO |
|
PK — 밀리초 타임스탬프 (AUTO_INCREMENT 아님) |
| board_id |
INT(11) UNSIGNED |
NO |
|
dx_boards.id |
| parent_id |
BIGINT(20) UNSIGNED |
NO |
0 |
답글 부모 ID (0=최상위) |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
dx_members.id (비회원=0) |
| author_name |
VARCHAR(100) |
YES |
NULL |
비회원 작성자 이름 |
| author_pass |
VARCHAR(255) |
YES |
NULL |
비회원 비밀번호 (BCrypt) |
| title |
VARCHAR(191) |
NO |
|
게시글 제목 |
| content |
LONGTEXT |
NO |
|
게시글 본문 (HTML, LONGTEXT) |
| category |
VARCHAR(100) |
YES |
NULL |
카테고리 |
| tags |
VARCHAR(191) |
YES |
NULL |
태그 (쉼표 구분) |
| thumbnail |
VARCHAR(191) |
YES |
NULL |
대표 썸네일 경로 |
| view_count |
INT(11) |
NO |
0 |
조회수 |
| like_count |
INT(11) |
NO |
0 |
좋아요 수 (비정규화 캐시) |
| comment_count |
INT(11) |
NO |
0 |
댓글 수 (비정규화 캐시) |
| is_notice |
TINYINT(1) |
NO |
0 |
공지 여부 |
| is_secret |
TINYINT(1) |
NO |
0 |
비밀글 여부 |
| dl_level |
TINYINT(1) |
NO |
0 |
다운로드 권한: 0=전체, 1=회원, 2=관리자 |
| dl_limit |
INT(11) |
NO |
0 |
1인당 최대 다운로드 횟수 (0=무제한) |
| dl_point |
INT(11) |
NO |
0 |
다운로드 시 차감 포인트 |
| ip |
VARCHAR(45) |
YES |
NULL |
작성자 IP |
| status |
TINYINT(1) |
NO |
1 |
1=정상, 0=삭제 |
| popular_score |
INT(11) |
NO |
0 |
인기점수 (조회×1 + 좋아요×5 + 댓글×3, 7일 감쇠) |
| created_at |
DATETIME |
NO |
|
작성 일시 |
| updated_at |
DATETIME |
YES |
NULL |
수정 일시 |
| 인덱스명 |
종류 |
컬럼 |
| PRIMARY KEY |
PK |
id |
| idx_board_id |
INDEX |
board_id |
| idx_member_id |
INDEX |
member_id |
| idx_status |
INDEX |
status |
| idx_notice |
INDEX |
is_notice |
| idx_created |
INDEX |
created_at |
| idx_board_status_id |
COMPOSITE |
board_id, status, id — 목록 쿼리 최적화 |
| idx_popular_score |
COMPOSITE |
board_id, status, popular_score — 인기글 정렬 |
| ft_title_content |
FULLTEXT |
title, content — MATCH AGAINST 전문검색 |
3.3 dx_comments — 댓글
댓글과 대댓글을 저장합니다. depth와 parent_id로 트리 구조를 구현합니다. id는 밀리초 타임스탬프입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED |
NO |
|
PK — 밀리초 타임스탬프 |
| post_id |
BIGINT(20) UNSIGNED |
NO |
|
dx_posts.id |
| parent_id |
BIGINT(20) UNSIGNED |
NO |
0 |
부모 댓글 ID (0=최상위 댓글) |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
dx_members.id (비회원=0) |
| author_name |
VARCHAR(100) |
YES |
NULL |
비회원 작성자 이름 |
| author_pass |
VARCHAR(255) |
YES |
NULL |
비회원 비밀번호 (BCrypt) |
| content |
TEXT |
NO |
|
댓글 내용 |
| ip |
VARCHAR(45) |
YES |
NULL |
작성자 IP |
| depth |
TINYINT(3) |
NO |
0 |
댓글 깊이 (0=댓글, 1=대댓글) |
| status |
TINYINT(1) |
NO |
1 |
1=정상, 0=삭제 |
| created_at |
DATETIME |
NO |
|
작성 일시 |
3.4 dx_post_files — 첨부파일
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| post_id |
BIGINT(20) UNSIGNED |
NO |
0 |
dx_posts.id |
| orig_name |
VARCHAR(191) |
NO |
|
원본 파일명 |
| save_name |
VARCHAR(191) |
NO |
|
저장 파일명 (랜덤화) |
| save_path |
VARCHAR(191) |
NO |
|
저장 경로 |
| file_size |
INT(11) |
NO |
0 |
파일 크기 (bytes) |
| file_ext |
VARCHAR(20) |
NO |
|
파일 확장자 |
| download_count |
INT(11) |
NO |
0 |
다운로드 횟수 |
| is_thumb |
TINYINT(1) |
NO |
0 |
썸네일 여부 |
| thumb_path |
VARCHAR(191) |
YES |
NULL |
썸네일 저장 경로 |
| created_at |
DATETIME |
NO |
|
업로드 일시 |
3.5 dx_post_links — 게시글 다중 링크
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| post_id |
BIGINT(20) UNSIGNED |
NO |
|
dx_posts.id |
| url |
VARCHAR(500) |
NO |
|
링크 URL |
| label |
VARCHAR(100) |
YES |
NULL |
링크 제목 (선택) |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| click_count |
INT(11) UNSIGNED |
NO |
0 |
총 클릭 수 (비정규화) |
| created_at |
DATETIME |
NO |
|
생성 일시 |
3.6 dx_link_clicks — 링크 클릭 로그
IP와 날짜 조합으로 중복 클릭을 방지합니다. (link_id, ip, click_date) 가 UNIQUE 키입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| link_id |
INT(11) UNSIGNED |
NO |
|
dx_post_links.id |
| ip |
VARCHAR(45) |
NO |
|
클릭한 IP |
| click_date |
DATE |
NO |
|
클릭 날짜 (중복 방지 기준) |
| created_at |
DATETIME |
NO |
|
클릭 일시 |
3.7 dx_categories — 카테고리 (무한 분류)
path 컬럼에 조상 ID 경로를 저장하여 트리 탐색을 O(1)로 처리합니다. 예: path="0/5/12" 는 루트→5→12 순서를 의미합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| board_id |
INT(11) UNSIGNED |
NO |
0 |
0=공통 카테고리, >0=특정 게시판 전용 |
| parent_id |
INT(11) UNSIGNED |
NO |
0 |
부모 카테고리 ID (0=최상위) |
| name |
VARCHAR(191) |
NO |
|
카테고리 이름 |
| slug |
VARCHAR(100) |
NO |
|
URL 슬러그 |
| depth |
TINYINT(3) |
NO |
0 |
깊이 (0=최상위) |
| path |
VARCHAR(500) |
NO |
|
조상 ID 경로 (예: 0/5/12) |
| color |
VARCHAR(20) |
NO |
blue |
카테고리 색상 |
| badge_color |
VARCHAR(20) |
NO |
blue |
배지 색상 |
| show_in_list |
TINYINT(1) |
NO |
1 |
목록 페이지 표시 여부 |
| show_in_view |
TINYINT(1) |
NO |
1 |
뷰 페이지 표시 여부 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
3.8 dx_post_drafts — 글쓰기 임시저장
사용자가 명시적으로 저장하는 임시저장입니다. 세션 긴급 구조(dx_session_rescue)와는 별개로 관리됩니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
BIGINT(20) UNSIGNED |
NO |
0 |
회원 ID (비회원=0) |
| session_id |
VARCHAR(128) |
NO |
|
비회원 세션 ID |
| board_key |
VARCHAR(100) |
NO |
|
게시판 키 |
| title |
VARCHAR(255) |
NO |
|
임시저장 제목 |
| content |
MEDIUMTEXT |
YES |
NULL |
임시저장 본문 |
| category |
VARCHAR(100) |
NO |
|
카테고리 |
| tags |
VARCHAR(500) |
NO |
|
태그 |
| created_at |
DATETIME |
NO |
|
최초 저장 일시 |
| updated_at |
DATETIME |
NO |
|
마지막 저장 일시 |
4장. 소통 관련 테이블
4.1 dx_memos — 쪽지
회원 간 1:1 쪽지입니다. 발신자/수신자 각각 독립적으로 삭제할 수 있습니다. 양쪽 모두 삭제해도 레코드는 남습니다(논리 삭제).
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| from_id |
INT(11) UNSIGNED |
NO |
|
발신자 dx_members.id |
| to_id |
INT(11) UNSIGNED |
NO |
|
수신자 dx_members.id |
| content |
TEXT |
NO |
|
쪽지 내용 |
| is_read |
TINYINT(1) |
NO |
0 |
0=미읽음, 1=읽음 |
| read_at |
DATETIME |
YES |
NULL |
읽은 시각 |
| is_deleted_sender |
TINYINT(1) |
NO |
0 |
발신자 삭제 여부 |
| is_deleted_receiver |
TINYINT(1) |
NO |
0 |
수신자 삭제 여부 |
| created_at |
DATETIME |
NO |
|
발송 일시 |
4.2 dx_notifications — 실시간 알림
소켓으로 즉시 전달하는 동시에 DB에도 저장합니다. 비접속 회원도 로그인 후 확인 가능합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| to_member_id |
INT(11) UNSIGNED |
NO |
|
수신자 회원 ID |
| from_member_id |
INT(11) UNSIGNED |
NO |
0 |
발신자 회원 ID (0=시스템 알림) |
| type |
VARCHAR(30) |
NO |
|
comment|like|scrap|friend|memo 등 |
| message |
VARCHAR(255) |
NO |
|
알림 메시지 |
| url |
VARCHAR(500) |
NO |
|
클릭 시 이동 URL |
| extra |
TEXT |
YES |
NULL |
추가 데이터 (JSON) |
| is_read |
TINYINT(1) |
NO |
0 |
0=미읽음, 1=읽음 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
4.3 dx_friends — 친구/차단
단방향(follow) 구조입니다. A→B 레코드와 B→A 레코드가 모두 있으면 서로친구입니다. type=block은 차단 관계입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
요청자 (추가한 사람) |
| target_id |
INT(11) UNSIGNED |
NO |
|
대상자 (추가된 사람) |
| type |
ENUM(friend,block) |
NO |
friend |
관계 유형 |
| status |
TINYINT(1) |
NO |
1 |
1=활성, 0=삭제 (논리 삭제) |
| created_at |
DATETIME |
NO |
|
관계 생성 일시 |
| 인덱스명 |
종류 |
컬럼 |
| PRIMARY KEY |
PK |
id |
| uk_friend |
UNIQUE |
member_id, target_id, type |
| idx_member_id |
INDEX |
member_id |
| idx_target_id |
INDEX |
target_id |
| idx_type |
INDEX |
type |
4.4 dx_likes — 좋아요
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| target_type |
ENUM(post,comment) |
NO |
|
좋아요 대상 유형 |
| target_id |
BIGINT(20) UNSIGNED |
NO |
|
대상 ID |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
회원 ID (비회원=0) |
| ip |
VARCHAR(45) |
YES |
NULL |
비회원 중복 방지 IP |
| created_at |
DATETIME |
NO |
|
좋아요 일시 |
| 인덱스명 |
종류 |
컬럼 |
| uk_like |
UNIQUE |
target_type, target_id, member_id |
| idx_target |
INDEX |
target_type, target_id |
4.5 dx_scraps — 스크랩
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
스크랩한 회원 ID |
| post_id |
BIGINT(20) UNSIGNED |
NO |
|
스크랩한 게시글 ID |
| memo |
VARCHAR(191) |
YES |
NULL |
스크랩 메모 (선택) |
| created_at |
DATETIME |
NO |
|
스크랩 일시 |
4.6 dx_dm_messages — 1:1 채팅 메시지
소켓 dm_invite → 수락 후 열리는 실시간 1:1 채팅 메시지를 저장합니다. chat_group은 두 회원 login_id의 MD5입니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT(20) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| chat_group |
VARCHAR(32) |
NO |
|
MD5 그룹 키 (두 사용자 ID 조합) |
| member_id |
INT(11) UNSIGNED |
NO |
|
발신자 회원 ID |
| message |
TEXT |
NO |
|
메시지 내용 (최대 2000자) |
| created_at |
DATETIME |
NO |
|
발송 일시 |
5장. 포인트 및 레벨 테이블
5.1 dx_point_log — 포인트 변동 내역
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
회원 ID |
| type |
VARCHAR(50) |
NO |
|
유형: write|comment|login|admin|purchase 등 |
| point |
INT(11) |
NO |
|
변동 포인트 (음수=차감) |
| balance |
INT(11) |
NO |
0 |
변동 후 잔액 |
| ref_type |
VARCHAR(30) |
YES |
NULL |
연관 대상 유형 (post, comment 등) |
| ref_id |
BIGINT UNSIGNED |
YES |
NULL |
연관 대상 ID |
| note |
VARCHAR(191) |
YES |
NULL |
메모 |
| created_at |
DATETIME |
NO |
|
변동 일시 |
5.2 dx_exp_log — 경험치 변동 내역
dx_point_log와 동일한 구조입니다. point 컬럼 대신 exp 컬럼을 사용합니다.
5.3 dx_level_config — 레벨 설정
기본 150레벨이 설치 시 INSERT됩니다. 관리자가 레벨 이름, 필요 경험치, 아이콘, 색상을 커스터마이징할 수 있습니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| level |
SMALLINT(5) UNSIGNED |
NO |
|
PK — 레벨 번호 (1~150) |
| name |
VARCHAR(50) |
NO |
|
레벨 이름 (예: 새싹, 마스터) |
| exp_required |
INT(11) UNSIGNED |
NO |
0 |
해당 레벨 진입에 필요한 누적 경험치 |
| icon |
VARCHAR(10) |
NO |
|
이모지 아이콘 (선택) |
| color |
VARCHAR(20) |
NO |
|
색상 코드 (hex 또는 클래스명) |
| updated_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
마지막 수정 일시 (ON UPDATE) |
5.4 dx_shop_items — 포인트샵 상품
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| name |
VARCHAR(191) |
NO |
|
상품명 |
| description |
TEXT |
YES |
NULL |
상품 설명 |
| category |
VARCHAR(50) |
YES |
NULL |
카테고리 |
| type |
ENUM(badge,title,point,etc) |
NO |
etc |
상품 유형 |
| price |
INT(11) UNSIGNED |
NO |
0 |
포인트 가격 |
| stock |
INT(11) |
NO |
-1 |
재고 (-1=무제한) |
| image |
VARCHAR(500) |
YES |
NULL |
상품 이미지 |
| value |
VARCHAR(191) |
YES |
NULL |
지급 값 (배지 슬러그, 칭호 텍스트 등) |
| buy_limit |
INT(11) |
NO |
0 |
1인당 구매 제한 (0=무제한) |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| sort_order |
INT(11) |
NO |
0 |
정렬 순서 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
5.5 dx_shop_purchases — 포인트샵 구매 내역
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| member_id |
INT(11) UNSIGNED |
NO |
|
구매 회원 ID |
| item_id |
INT(11) UNSIGNED |
NO |
|
dx_shop_items.id |
| item_name |
VARCHAR(191) |
NO |
|
구매 시점 상품명 (스냅샷) |
| price |
INT(11) UNSIGNED |
NO |
|
구매 시점 포인트 가격 |
| status |
ENUM(paid,refunded,pending) |
NO |
paid |
결제 상태 |
| note |
VARCHAR(191) |
YES |
NULL |
메모 |
| created_at |
DATETIME |
NO |
|
구매 일시 |
6장. 시스템 테이블
6.1 dx_settings — 시스템 설정
모든 설정값을 키-값 형식으로 저장합니다. setting_key가 PK입니다. DxCache로 캐싱됩니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| setting_key |
VARCHAR(100) |
NO |
|
PK — 설정 키 (예: site_name, theme) |
| setting_value |
LONGTEXT |
YES |
NULL |
설정값 (JSON, 텍스트, 숫자 등) |
| setting_group |
VARCHAR(100) |
NO |
general |
설정 그룹 (general|security|member|editor) |
| updated_at |
DATETIME |
YES |
NULL |
마지막 수정 일시 |
6.2 dx_pages — 관리 페이지
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| slug |
VARCHAR(191) |
NO |
|
UNIQUE — URL 경로 (예: home, shop) |
| title |
VARCHAR(191) |
NO |
|
페이지 제목 |
| file_path |
VARCHAR(191) |
NO |
|
pages/ 내 파일 경로 |
| layout |
VARCHAR(100) |
NO |
main |
레이아웃 이름 |
| is_home |
TINYINT(1) |
NO |
0 |
홈 페이지 여부 |
| is_standalone |
TINYINT(1) |
NO |
0 |
독립 페이지 (레이아웃 없이 실행) |
| access_level |
TINYINT(1) |
NO |
0 |
접근 권한 (0=전체, 1=회원) |
| page_type |
VARCHAR(10) |
NO |
editor |
editor|file |
| page_location |
VARCHAR(10) |
NO |
global |
global|theme |
| site_domain |
VARCHAR(191) |
NO |
|
멀티사이트 도메인 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
| updated_at |
DATETIME |
YES |
NULL |
수정 일시 |
6.3 dx_menus — 메뉴
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| site_domain |
VARCHAR(191) |
NO |
|
멀티사이트 도메인 (빈값=전체) |
| menu_group |
VARCHAR(100) |
NO |
main |
메뉴 그룹 (예: main, footer) |
| parent_id |
INT(11) UNSIGNED |
NO |
0 |
부모 메뉴 ID (0=최상위) |
| title |
VARCHAR(191) |
NO |
|
메뉴 이름 |
| url |
VARCHAR(191) |
YES |
NULL |
링크 URL |
| target |
VARCHAR(20) |
NO |
_self |
_self|_blank |
| icon |
VARCHAR(100) |
YES |
NULL |
아이콘 (이모지 또는 클래스명) |
| access_level |
TINYINT(1) |
NO |
0 |
접근 권한 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
6.4 dx_plugins — 플러그인
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| directory |
VARCHAR(100) |
NO |
|
UNIQUE — 플러그인 폴더명 |
| name |
VARCHAR(191) |
NO |
|
플러그인 이름 |
| version |
VARCHAR(50) |
NO |
|
버전 |
| status |
TINYINT(1) |
NO |
0 |
0=비활성, 1=활성 |
| is_shared |
TINYINT(1) |
NO |
0 |
DX마켓 공유 여부 |
| share_key |
VARCHAR(64) |
YES |
NULL |
UNIQUE — 공유 키 (URL) |
| download_count |
INT(11) |
NO |
0 |
공유 다운로드 횟수 |
| settings |
TEXT |
YES |
NULL |
플러그인 설정값 (JSON) |
| installed_at |
DATETIME |
NO |
|
설치 일시 |
| shared_at |
DATETIME |
YES |
NULL |
최초 공유 일시 |
6.5 dx_sites — 멀티사이트
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| domain |
VARCHAR(191) |
NO |
|
UNIQUE — 도메인 (예: a.com) |
| site_name |
VARCHAR(191) |
NO |
My Site |
사이트 이름 |
| theme |
VARCHAR(100) |
NO |
default |
사이트별 테마 |
| menu_group |
VARCHAR(100) |
NO |
main |
사이트별 메뉴 그룹 |
| language |
VARCHAR(10) |
NO |
ko |
언어 코드 |
| timezone |
VARCHAR(50) |
NO |
Asia/Seoul |
타임존 |
| extra_config |
TEXT |
YES |
NULL |
JSON 추가 설정 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
6.6 dx_popups — 팝업
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| title |
VARCHAR(191) |
NO |
|
팝업 제목 (관리용) |
| content |
LONGTEXT |
YES |
NULL |
HTML 내용 |
| img_url |
VARCHAR(500) |
YES |
NULL |
이미지 URL |
| link_url |
VARCHAR(500) |
YES |
NULL |
클릭 링크 |
| pos_x |
SMALLINT(5) |
NO |
20 |
X 위치(px) |
| pos_y |
SMALLINT(5) |
NO |
100 |
Y 위치(px) |
| width |
SMALLINT(5) |
NO |
400 |
너비(px) |
| device |
VARCHAR(10) |
NO |
all |
all|pc|mobile |
| start_date |
DATE |
YES |
NULL |
표시 시작일 |
| end_date |
DATE |
YES |
NULL |
표시 종료일 |
| hide_days |
TINYINT(3) |
NO |
1 |
안보기 유지 일수 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
6.7 dx_global_notices — 전체 공지
v8.2.0에서 추가. 모든 게시판 상단에 표시되는 전체 공지를 관리합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| title |
VARCHAR(191) |
NO |
|
공지 제목 |
| title_color |
VARCHAR(20) |
NO |
|
제목 색상 (hex) |
| link_url |
VARCHAR(500) |
NO |
|
클릭 이동 URL (선택) |
| link_target |
VARCHAR(10) |
NO |
_self |
_self|_blank |
| status |
TINYINT(1) |
NO |
1 |
1=활성, 0=비활성 |
| start_at |
DATETIME |
YES |
NULL |
게시 시작일 |
| end_at |
DATETIME |
YES |
NULL |
게시 종료일 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
| created_by |
INT(11) UNSIGNED |
NO |
0 |
작성자 회원 ID |
| created_at |
DATETIME |
NO |
|
생성 일시 |
7장. 통계 및 API 테이블
7.1 dx_visits — 일별 방문자 집계
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| visit_date |
DATE |
NO |
|
UNIQUE — 집계 날짜 |
| visit_count |
INT(11) |
NO |
0 |
총 방문 수 (페이지뷰) |
| unique_count |
INT(11) |
NO |
0 |
순 방문자 수 (IP 기준) |
7.2 dx_visit_logs — 방문자 상세 로그
방문자별 상세 로그입니다. 봇 여부, 브라우저 종류, 유입 도메인 분석을 지원합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| visit_date |
DATE |
NO |
|
방문 날짜 |
| ip |
VARCHAR(45) |
NO |
|
방문자 IP |
| page_url |
VARCHAR(500) |
YES |
NULL |
방문 페이지 URL |
| referer |
VARCHAR(500) |
YES |
NULL |
유입 URL |
| referer_domain |
VARCHAR(200) |
YES |
NULL |
유입 도메인 (통계 분석용) |
| user_agent |
VARCHAR(500) |
YES |
NULL |
User-Agent 전체 |
| browser |
VARCHAR(30) |
NO |
Other |
브라우저 종류 (Chrome|Firefox|Safari 등) |
| is_bot |
TINYINT(1) |
NO |
0 |
0=사람, 1=봇 |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
로그인 회원 ID (비로그인=0) |
| created_at |
DATETIME |
NO |
|
방문 일시 |
| 인덱스명 |
종류 |
컬럼 |
| idx_date |
INDEX |
visit_date |
| idx_ip_date |
INDEX |
ip, visit_date |
| idx_member |
INDEX |
member_id |
| idx_bot |
INDEX |
is_bot |
| idx_browser |
INDEX |
browser |
| idx_referer_domain |
INDEX |
referer_domain(100) |
| idx_date_bot |
COMPOSITE |
visit_date, is_bot |
| idx_ip_date_browser |
COMPOSITE |
visit_date, ip, browser, is_bot |
7.3 dx_search_keywords — 검색어 통계
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| keyword |
VARCHAR(191) |
NO |
|
UNIQUE — 검색어 |
| search_count |
INT(11) |
NO |
1 |
검색 횟수 |
| last_searched |
DATETIME |
NO |
|
마지막 검색 일시 |
| 인덱스명 |
종류 |
컬럼 |
| uk_keyword |
UNIQUE |
keyword |
| idx_count |
INDEX |
search_count |
| ft_keyword |
FULLTEXT |
keyword — 자동완성용 |
7.4 dx_api_keys — 소켓 API 키
소켓 서버 연결에 사용되는 API 키를 관리합니다. api_key(dxk_...)가 소켓 그룹명으로 사용됩니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED |
NO |
|
PK — PHP microtime 기반 고유 ID |
| api_key |
VARCHAR(64) |
NO |
|
UNIQUE — dxk_ 접두사 소켓 그룹 키 |
| site_domain |
VARCHAR(191) |
NO |
|
UNIQUE — 사이트 도메인 |
| site_name |
VARCHAR(191) |
NO |
|
사이트 표시 이름 |
| platform |
VARCHAR(10) |
NO |
web |
web|android|ios |
| app_package |
VARCHAR(191) |
NO |
|
앱 패키지명 (com.domain.app) |
| app_key_hash |
VARCHAR(255) |
NO |
|
안드로이드 서명 키해시 / iOS Team ID |
| status |
TINYINT(1) |
NO |
1 |
0=비활성, 1=활성, 2=정지 |
| expires_at |
DATETIME |
YES |
NULL |
NULL=영구 유효 |
| created_at |
DATETIME |
NO |
|
발급 일시 |
7.5 dx_api_logs — API 접근 로그
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| api_key_id |
BIGINT UNSIGNED |
NO |
0 |
dx_api_keys.id |
| endpoint |
VARCHAR(100) |
NO |
|
엔드포인트 (예: /api/comment) |
| method |
VARCHAR(10) |
NO |
GET |
HTTP 메서드 |
| request_ip |
VARCHAR(45) |
NO |
|
요청 IP |
| request_body |
TEXT |
YES |
NULL |
요청 본문 |
| response_code |
SMALLINT(5) |
NO |
200 |
HTTP 응답 코드 |
| response_msg |
VARCHAR(300) |
NO |
|
응답 메시지 |
| created_at |
DATETIME |
NO |
|
요청 일시 |
8장. 설문 관련 테이블
8.1 dx_surveys — 설문 기본 정보
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| post_id |
BIGINT(20) UNSIGNED |
NO |
|
UNIQUE — dx_posts.id (게시글 1:1 연결) |
| title |
VARCHAR(191) |
NO |
|
설문 제목 (비우면 게시글 제목 사용) |
| end_date |
DATE |
YES |
NULL |
마감일 (NULL=무제한) |
| allow_guest |
TINYINT(1) |
NO |
0 |
비회원 참여 허용 |
| show_result |
ENUM(always,after_vote,after_end) |
NO |
after_vote |
결과 표시 시점 |
| status |
TINYINT(1) |
NO |
1 |
활성 여부 |
| created_at |
DATETIME |
NO |
|
생성 일시 |
8.2 dx_survey_questions — 설문 문항
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
INT(11) UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| survey_id |
INT(11) UNSIGNED |
NO |
|
dx_surveys.id |
| question |
VARCHAR(500) |
NO |
|
문항 내용 |
| q_type |
ENUM(radio,checkbox,text) |
NO |
radio |
문항 유형 |
| options |
TEXT |
YES |
NULL |
JSON 배열 — radio/checkbox 선택지 |
| required |
TINYINT(1) |
NO |
1 |
필수 여부 |
| sort_order |
SMALLINT(5) |
NO |
0 |
정렬 순서 |
8.3 dx_survey_answers — 설문 응답
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| survey_id |
INT(11) UNSIGNED |
NO |
|
dx_surveys.id |
| question_id |
INT(11) UNSIGNED |
NO |
|
dx_survey_questions.id |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
회원 ID (비회원=0) |
| ip |
VARCHAR(45) |
NO |
|
IP 주소 |
| answer |
TEXT |
NO |
|
응답 내용 |
| created_at |
DATETIME |
NO |
|
응답 일시 |
8.4 dx_survey_votes — 설문 참여 중복 방지
(survey_id, member_id) 가 UNIQUE로 회원당 1회 참여를 보장합니다.
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| survey_id |
INT(11) UNSIGNED |
NO |
|
dx_surveys.id |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
회원 ID (비회원=0) |
| ip |
VARCHAR(45) |
NO |
|
IP 주소 |
| voted_at |
DATETIME |
NO |
|
참여 일시 |
9장. 기타 테이블
9.1 dx_download_log — 파일 다운로드 이력
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| file_id |
BIGINT UNSIGNED |
NO |
|
dx_post_files.id |
| post_id |
BIGINT UNSIGNED |
NO |
0 |
dx_posts.id |
| member_id |
INT(11) UNSIGNED |
NO |
0 |
다운로드한 회원 ID |
| ip |
VARCHAR(45) |
NO |
|
IP 주소 |
| point_used |
INT(11) |
NO |
0 |
차감된 포인트 |
| created_at |
DATETIME |
NO |
|
다운로드 일시 |
9.2 dx_sms_logs — SMS 발송 로그
| 컬럼명 |
타입 |
NULL |
기본값 |
설명 |
| id |
BIGINT UNSIGNED AUTO_INCREMENT |
NO |
AUTO |
PK |
| driver |
VARCHAR(80) |
NO |
|
발송 드라이버 (ncp|coolsms|kt|twilio) |
| to_count |
INT UNSIGNED |
NO |
0 |
발송 대상 수 |
| ok_count |
INT UNSIGNED |
NO |
0 |
성공 건수 |
| fail_count |
INT UNSIGNED |
NO |
0 |
실패 건수 |
| content_preview |
VARCHAR(255) |
NO |
|
내용 미리보기 (최대 100자) |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
발송 일시 |