7. 데이터베이스
7.1 접속 방식 [확인] (core/db/Database.php)
- DSN
mysql:host=;dbname=;charset=utf8mb4,ERRMODE_EXCEPTION,FETCH_ASSOC ATTR_EMULATE_PREPARES = true,ATTR_STRINGIFY_FETCHES = true→ 모든 값이 문자열로 반환된다 (PHP 5.6 32bit에서 BIGINT 오버플로 방지 목적). 정수 비교는(int)캐스팅 필요,===비교 주의.SET NAMES 'utf8mb4'초기 명령- 연결 실패 시
dx_error('DB 연결 실패', 500)
7.2 스키마 (install/schema.sql, 49개 테이블, 접두사 기본 dx_)
| 영역 | 테이블 |
|---|---|
| 회원 | members, social_accounts, member_logs, member_sessions, login_logs, login_tokens, email_verifications, level_config, point_log, exp_log, friends, scraps, memos, dm_messages, notifications |
| 게시판 | boards, board_groups, categories, board_fields, posts, post_meta, post_files, post_links, post_drafts, comments, likes, link_clicks, download_log, surveys, survey_questions, survey_answers, survey_votes |
| 콘텐츠·UI | pages, menus, popups, global_notices, themes, plugins |
| 설정·사이트 | settings, sites |
| 통계·검색 | visits, visit_logs, search_keywords |
| 상점 | shop_items, shop_purchases |
| 외부연동 | api_keys, api_logs, sms_logs, session_rescue |
- 외래키(
FOREIGN KEY)는 사용하지 않는다. (SET foreign_key_checks = 0/1만 감쌈) schema.sql은 이미 v10.2.0까지의 컬럼을 포함한다(visit_logs.is_entry,visit_key,src_campaign,is_404,plugins.db_tables,posts.popular_score등 확인). 신규 설치 후migrate.php를 꼭 돌릴 필요는 없다.- 인덱스는 utf8mb4 767바이트 제한을 피하려
VARCHAR(191)(이메일 등)을 쓴다. - FULLTEXT:
dx_posts.ft_title_content(title, content),dx_search_keywords.ft_keyword(keyword). 기본 InnoDB 파서를 사용한다(ngram 미지정).
7.3 시드 데이터
| 대상 | 내용 |
|---|---|
members |
admin / admin1234(bcrypt) / admin@localhost — 설치 마법사가 입력값으로 덮어쓴다 |
settings |
site_name, site_description, site_url, theme=default, language=ko, timezone=Asia/Seoul, upload_max_size=10485760, upload_allowed_ext='', secret_key='', use_captcha=1, captcha_difficulty=normal, captcha_expire=300, use_signup=1, active_editor=ckeditor4-editor, url_rewrite=1 |
pages |
home(홈, is_home=1), shop |
boards |
notice(공지, 쓰기 레벨 9), free(자유, 쓰기 레벨 1), customer(고객센터, qa 타입, skin=default) |
menus |
홈·공지사항·자유게시판·포인트샵(/, /notice, /free, /shop) |
board_groups |
general, community, support |
level_config |
레벨표 (INSERT IGNORE) |
7.4 마이그레이션 (install/migrate.php)
- 브라우저로 접속하면 즉시 실행된다. 컬럼/테이블/인덱스 존재 여부를 확인하므로 중복 실행 안전(멱등).
- v1.4.0부터 v10.2.0까지의 변경을 순서대로 누적하고, 마지막에 항상
cms_version을version.php값으로 갱신한다. - 부가 동작:
core/security/{hash}/Secure.php를 최신core/Secure.php로 다시 복사하고, 그 폴더에.htaccess(Deny from all)를 만든다. [주의]인증이 없다.migrate.php는 로그인/관리자 확인 코드가 없고, 루트.htaccess가migrate.php를 명시적으로Require all granted한다. 실행 결과 화면에security_path까지 출력된다. 업그레이드 후에는install/을 삭제하거나 접근을 막아야 한다. (화면 문구는 "삭제하지 않아도 된다"고 안내하지만 운영 서버에서는 권장되지 않는다.)
7.5 검색 동작
- 통합 검색(
core/search/handler.php)은 FULLTEXT BOOLEAN MODE를 쓰되, 인덱스 존재 여부와SHOW VARIABLES LIKE 'ft_min_word_len'결과로 짧은 키워드는LIKE로 강제 전환한다. 작성자 검색은 항상LIKE. - 한글은 InnoDB 기본 파서로 토큰화되므로 FULLTEXT 결과가 기대와 다를 수 있고, 이때
LIKE폴백에 의존한다. - 사용 중인 SQL 기능은
ON DUPLICATE KEY UPDATE,MATCH ... AGAINST뿐이다.JSON_*함수, 윈도 함수, CTE는 쓰지 않아 MySQL 5.6 / MariaDB 10.1에서 동작한다.
8. 런타임에 생성되는 파일·폴더 (쓰기 권한 필요)
| 경로 | 생성 시점 | 권한/비고 |
|---|---|---|
data/config.php |
설치 | DB 비밀번호 포함. 웹 접근 차단 필수 |
data/.install_complete |
설치 직후 | 1회용 토큰, 사용 후 삭제 |
data/error.log |
PHP 오류 | error_log 경로로 지정됨 |
data/sessions/ |
첫 세션 | mkdir 0700. 쓰기 불가 시 PHP 기본 save_path 사용 |
data/cache/ |
파일 캐시·레이트리밋 | mkdir 0700. *.cache, rl_*.tmp, _mkt_* |
data/uploads/boards/, data/uploads/thumbnails/ |
업로드/썸네일 | .htaccess가 PHP 실행 차단 |
data/cacert.pem |
마켓/HTTPS 클라이언트 | 경로 참조 존재 |
core/security/{16hex}/Secure.php |
설치·마이그레이션 | 0755 |
extend/{top,middle,bottom}/ |
부팅 시 ensureDirs() |
이미 존재 |
pages/*.php |
관리자 > 페이지 관리 | 마법사가 pages/ 쓰기 권한을 필수로 검사 |