AI와 함께... 꿈을 키우려 떠납니다.~~~
이야기는 거슬러 올라갑니다.
10월에 교통사고로 입원하게 되었고, 총 12주 정도 병원에 있었습니다. 그중 한 보름 정도는 너무 심심해서 집에 굴러다니던 30만 원짜리 중고 노트북으로 이것저것 만지기 시작했죠.
그때는 솔직히 잘 몰랐습니다.
내가 다시 이 일을 시작하게 될지 말이죠.
지금 저는 막일을 합니다.
몸 쓰는 일이죠.
그래도 돈벌이가 꽤 짭짤합니다.
음… 여러분이 생각하는 것보다 조금 더 많을 겁니다. ㅎㅎ;;
이 일을 시작한 지도 한 4년 정도 된 것 같은데, 만족감이 워낙 커서 다시 개발 일을 할 거라고는 전혀 생각하지 못했습니다.
그런데 교통사고로 인한 입원 때문에 이렇게 다시 시작하게 되었네요.
참 묘합니다.
처음에는 그냥 예전에 해왔던 것처럼 엔진 하나만 만들어볼까 하는 생각으로 시작했습니다.
그러다가 갑자기 그누보드가 떠올라서, “그럼 그누보드와 연동해볼까?” 하면서 일이 시작되었습니다.
처음에는 소켓만 만들어서 기본 소스만 제공하면, 각자 알아서 응용해서 만들겠지 생각했습니다.
하지만 반응이 거의 없더군요.
그래서 채팅, 실시간 메모, WebRTC, Canvas, 목업, 장기 게임, 오목 게임, 북치기 게임 등 여러 기능을 만들어서 스킨과 플러그인 형태로 배포했습니다.
저는 단지 이걸 기반으로 응용해서 만드시라는 의미였는데…
이것도 반응은 뭐… ㅋㅋㅋ 그다지 크지는 않았습니다.
그래도 시간은 엄청 빨리 지나간 느낌이었습니다.
퇴원 후에는 일을 하면서 쉬엄쉬엄 시간을 쪼개 dxb CSS라는 것도 만들었습니다.
이걸 만든 이유는 단순합니다.
홈페이지 디자인을 배포하려고 했는데, Tailwind를 그대로 쓰자니 좀 그렇고…
그래서 그냥 이름이라도 남겨보자는 생각으로 오픈소스로 만들게 되었습니다.
디자인을 많이 배포하면 그래도 누군가는 쓰지 않을까 싶어서요.
음… 솔직히 이건 반응이 조금 있습니다.
많지는 않지만요. ^^;;
그런데 홈페이지 디자인만 배포하는 것으로는 부족하겠다 싶어서,
먼저 만들어 두었던 메시지 브릿지 소스를 점검하기 위해 채팅을 좀 더 다듬어서 HubTalk을 만들기 시작했습니다.
원래는 이것도 전부 배포용으로 만들려고 했던 것이었습니다.
그런데…
CMS까지 손대고 나니 점점 꿈이 커지네요.
물론 돈을 벌기 위해서 하는 것은 아닙니다.
맨 위에서 말했듯이, 지금 저는 잘 벌고 잘 먹고 살고 있습니다.
지금 만들고 있는 CMS에는
제가 실제로 서비스 운영하면서 필요하다고 느꼈던 기능들을 전부 내장하고 있는데,
조금씩 윤곽이 보이기 시작했습니다.
그래서 이제는 AI와 함께 꿈을 키워보려고 합니다.
제가 만들고 있는 CMS의 README.md만 복사해서 AI에게 만들어 달라고 해도 어느 정도는 구현해 줄 겁니다.
아, 참고로 제가 그누보드에 안 오겠다는 뜻은 아닙니다.
다만 이제는 그누보드 플러그인이나 스킨을 개발하는 단계가 아닐 뿐입니다.
-- 정신이 오락가락해서 chatgpt로 말이 되게 수정했습니다.
AI가 만들고, 디자인원엑스가 기획하는 CMS README.md
# DesignOneX CMS v1.8.5
## 특징
| 항목 | 내용 |
|---|---|
| **언어** | PHP 5.6 ~ 8.x (단일 코드베이스) |
| **DB** | MySQL 5.6+ / MariaDB 10.1+ (PDO) |
| **서버** | IIS · Apache · Nginx · 저가형 공유호스팅 |
| **OS** | Windows · Linux |
| **에디터** | CKEditor 4 (로컬) — 멀티 이미지, 유튜브 자동 임베드 |
| **SEO** | 자동 OG/Twitter Card, JSON-LD, 사이트맵, robots.txt |
| **캐시** | 파일 캐시 기본, APCu 자동 감지 전환 |
| **멀티도메인** | 도메인별 독립 사이트 설정 |
| **실시간** | WebSocket 소켓 플러그인 (dx-socket) |
| **보안** | CSRF · XSS · Path Traversal · 이중확장자 · Rate Limit |
## 폴더 구조
```
designonex-cms/
│
├── index.php ← 단일 진입점 (모든 요청)
│
├── core/ ← CMS 엔진 (직접 수정 비권장)
│ ├── Secure.php ← ★ 보안 전담 — 보안 패치는 이 파일만
│ ├── functions.php ← 공통 함수 (dx_esc, dx_csrf_* 등)
│ ├── DxCache.php ← 파일/APCu 캐시 (동접 최적화)
│ ├── DxSeo.php ← SEO 헬퍼 (OG, Twitter Card, JSON-LD)
│ ├── DxCategory.php ← 카테고리 렌더링 헬퍼 + 스킨
│ ├── DxSanitizer.php ← 입력 정제 · HTML 필터
│ ├── DxTheme.php ← 테마 엔진
│ ├── DxSite.php ← 멀티사이트 (도메인별 설정)
│ ├── DxExtend.php ← extend/ 폴더 자동 실행
│ ├── DxPoint.php ← 포인트 / 경험치 / 레벨
│ ├── DxBoardSkin.php ← 게시판 스킨 폴백 체인
│ ├── DxMarket.php ← 마켓 (플러그인 배포)
│ ├── PluginRegistry.php ← 플러그인 등록 / 활성화 관리
│ ├── hook/HookManager.php ← 훅 시스템
│ ├── db/Database.php ← PDO 래퍼 (싱글턴)
│ ├── router/Router.php ← URL 파싱 · 라우트 결정
│ ├── router/Dispatcher.php ← 라우트 → 핸들러 실행
│ ├── auth/Auth.php ← 세션 기반 인증
│ └── api/ ← API 핸들러
│ ├── upload.php ← 파일 업로드 (멀티, CSRF 보호)
│ ├── download.php ← 파일 다운로드
│ ├── comment.php ← 댓글 CRUD
│ ├── like.php ← 좋아요
│ ├── sitemap.php ← 동적 XML 사이트맵
│ └── robots.php ← 동적 robots.txt
│
├── admin/ ← 관리자
│ ├── index.php ← 관리자 레이아웃 (사이드바 · 헤더)
│ ├── dashboard/ ← 대시보드
│ ├── boards/ ← 게시판 관리 (에디터 · 카테고리 스킨)
│ ├── categories/ ← 카테고리 (표시위치 · 배지색 · 스킨)
│ ├── members/ ← 회원 관리
│ ├── menus/ ← 메뉴 관리 (게시판·페이지 빠른 선택)
│ ├── pages/ ← 페이지 관리
│ ├── themes/ ← 테마 관리
│ ├── plugins/ ← 플러그인 관리
│ ├── statistics/ ← 방문자 통계 · 인기검색어
│ ├── socket/ ← 실시간 소켓 모니터
│ └── settings/ ← 사이트 설정 (SEO · Analytics · 캐시)
│
├── boards/ ← 게시판
│ ├── handler.php ← 목록/보기/쓰기/수정/삭제/댓글
│ ├── skins/ ← 게시판 스킨
│ └── category/skins/ ← 카테고리 탭 스킨
│ ├── default/ ← 라운드 탭 (기본)
│ └── pill/ ← 언더라인 탭
│
├── themes/ ← 프론트엔드 테마
│ ├── default/ ← 기본 테마
│ ├── clean/ ← Clean 테마
│ └── simple/ ← Simple 테마
│ (각 테마)/category/ ← 테마별 커스텀 카테고리 스킨
│
├── plugins/ ← 플러그인
│ ├── ckeditor4-editor/ ← CKEditor 4 (기본 활성)
│ ├── dx-socket/ ← 실시간 WebSocket
│ ├── jodit-editor/ ← Jodit 에디터
│ ├── tinymce-editor/ ← TinyMCE 에디터
│ └── tosspay-payment/ ← 토스페이 결제
│
├── assets/
│ ├── ckeditor4/ ← CKEditor 4 로컬 파일
│ └── js/
│ ├── dxb-css.js ← dxb-css 런타임 엔진 (Tailwind 호환)
│ └── dx.js ← 공통 JS
│
├── extend/ ← 훅 없이 코드 삽입
│ ├── top/ ← 초기화 직후
│ ├── middle/ ← 라우팅 후
│ └── bottom/ ← 렌더링 완료 후
│
├── data/ ← 설정 · 업로드 · 캐시 (웹 접근 차단)
│ ├── config.php ← DB 연결 + 설정 캐시 (설치 시 자동 생성)
│ ├── cache/ ← 파일 캐시 저장소
│ └── uploads/ ← 업로드 파일
│
├── install/ ← 설치 마법사 (설치 후 삭제 권장)
│
├── .htaccess ← Apache 설정
├── web.config ← IIS 설정 (URL Rewrite 있는 환경)
├── web.config.no-rewrite ← IIS 설정 (URL Rewrite 없는 환경)
└── nginx.conf.example ← Nginx 설정 예시
```
## 웹서버별 설정
| 환경 | 사용 파일 | 비고 |
|---|---|---|
| Apache (mod_rewrite 있음) | `.htaccess` | 대부분의 리눅스 호스팅 |
| Apache (mod_rewrite 없음) | `.htaccess` | `?_url=` 방식 자동 전환 |
| IIS (URL Rewrite 있음) | `web.config` | IIS 8.x 이상 권장 |
| IIS (URL Rewrite 없음) | `web.config.no-rewrite` → `web.config`로 교체 | 500.19 에러 방지 |
| Nginx | `nginx.conf.example` 참고 | — |
| 저가형 공유호스팅 | 별도 설정 불필요 | PHP 레벨로 자동 커버 |
## SEO 최적화
### 자동 생성 태그
페이지 타입(게시글/목록/페이지/홈)에 따라 자동 생성됩니다.
```html
<!-- 기본 -->
<title>게시글 제목 — 게시판명 | 사이트명</title>
<meta name="description" content="본문 앞 150자 자동 추출">
<meta name="robots" content="index,follow">
<link rel="canonical" href="https://...">
<!-- Open Graph -->
<meta property="og:type" content="article">
<meta property="og:title" content="...">
<meta property="og:description" content="...">
<meta property="og:image" content="본문 첫 이미지 자동 추출">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<!-- JSON-LD 구조화 데이터 -->
<script type="application/ld+json">{"@type":"Article",...}</script>
```
### 자동 noindex 처리
- 비밀글
- 검색 결과 페이지 (`?s=` 파라미터)
### 사이트맵 (멀티도메인 지원)
```
/sitemap.xml ← 사이트맵 인덱스
/sitemap-pages.xml ← 홈 + 정적 페이지
/sitemap-boards.xml ← 게시판 목록
/sitemap-posts-1.xml ← 게시글 (1000개씩 자동 분할)
```
멀티도메인 환경에서 각 도메인이 자신의 `site_url` 기준으로 독립 사이트맵 생성.
### robots.txt
```
/robots.txt
```
관리자 > 사이트 설정에서 커스텀 내용 직접 작성 가능.
### 관리자 SEO 설정 항목
- OG 기본 이미지 URL
- Twitter 계정 (`@yoursite`)
- Google Analytics ID — 레이아웃에 자동 삽입
- 네이버 웹마스터 인증코드 — 자동 삽입
- Google 웹마스터 인증코드 — 자동 삽입
- robots.txt 커스텀 편집
---
## 성능 · 캐시
### DxCache — 자동 드라이버 선택
```
APCu 설치됨 → 메모리 캐시 (최고 성능)
APCu 없음 → 파일 캐시 data/cache/ (저가형 호스팅 포함 전 환경)
```
### 캐시 항목
| 항목 | TTL |
|---|---|
| 전체 설정 (dx_settings) | 5분 |
| 게시판 목록 (비로그인 기본) | 1분 |
| 사이트맵 XML | 10분 |
### 캐시 자동 무효화 시점
- 설정 저장 → 전체 캐시 flush
- 게시글 작성/수정/삭제 → 해당 게시판 캐시 삭제
- 카테고리 변경 → 전체 게시판 목록 캐시 삭제
### 세션 최적화
비로그인 GET 요청은 세션을 시작하지 않습니다.
→ 파일 lock 제거 → 동시 처리 성능 향상
### 동접 1만명 권장 서버 구성
```
PHP-FPM : pm.max_children = 200~500
OPcache : opcache.enable=1, memory_consumption=256
MySQL : max_connections=500
innodb_buffer_pool_size = RAM 70%
nginx : 정적파일(css/js/img) 직접 서빙 (PHP 우회)
CDN : Cloudflare 앞단 → 실제 PHP 히트 80% 감소
WebSocket: 별도 Node.js 서버 (dx-socket 플러그인)
```
---
## 게시판 시스템
### 지원 기능
- 목록 / 보기 / 쓰기 / 수정 / 삭제
- 공지사항 · 비밀글 · 카테고리 · 태그
- 댓글 (CKEditor 에디터 옵션)
- 파일 첨부 (드래그&드롭 · 멀티 업로드 · 용량 초과 즉시 안내)
- 좋아요 · 스크랩
- 검색 (제목 / 내용 / 작성자 / 분류)
### 게시판별 독립 설정
관리자 > 게시판 관리에서 게시판마다:
- **에디터**: CKEditor4 / Jodit / TinyMCE / 텍스트 선택
- **카테고리 스킨**: 라운드 탭 / 언더라인 탭 / 커스텀
### 파일 업로드 보안
- MIME 타입 + 확장자 이중 검증
- 실제 이미지 검증 (`getimagesize()`)
- 이중 확장자 공격 차단 (`shell.php.jpg` 등)
- 업로드 디렉토리 PHP 실행 차단 `.htaccess` 자동 생성
---
## 카테고리 시스템
### 특징
- DB 기반 무한 깊이 계층 구조
- 게시판별 독립 카테고리
- 표시 위치: **리스트 탭** / **뷰 배지** 독립 on/off
- 배지 색상 선택 (파랑/초록/빨강/주황/보라/회색)
### 카테고리 스킨 우선순위
```
themes/[테마]/category/list.php ← 테마별 커스텀 (최우선)
boards/category/skins/[스킨]/ ← 지정 스킨
boards/category/skins/default/ ← 기본 스킨 (폴백)
```
커스텀 스킨 경로는 관리자 > 카테고리 관리 화면에서 확인할 수 있습니다.
---
## 에디터 (CKEditor 4)
- **위치**: `assets/ckeditor4/` (로컬 파일 — CDN 의존 없음)
### 주요 기능
- 멀티 이미지 업로드 (toolbar 버튼 + 드래그&드롭)
- 유튜브 URL 붙여넣기 → iframe 자동 변환
- 코드 하이라이트 (monokai_sublime 테마)
- 댓글 에디터 활성화 옵션
## 플러그인
### 플러그인 등록 방법
```php
// plugins/my-plugin/plugin.php
dx_register_plugin(array(
'id' => 'my-plugin',
'type' => 'editor', // editor | payment | socket | captcha
'name' => 'My Plugin',
'version' => '1.0.0',
'settings' => array(
'my_option' => array(
'label' => '옵션명',
'type' => 'select',
'options' => array('1' => '사용', '0' => '사용 안 함'),
'default' => '1',
),
),
));
```
### 기본 제공 플러그인
| 플러그인 | 타입 | 설명 |
|---|---|---|
| `ckeditor4-editor` | editor | CKEditor 4 (기본 활성) |
| `jodit-editor` | editor | Jodit WYSIWYG |
| `tinymce-editor` | editor | TinyMCE |
| `dx-socket` | socket | 실시간 WebSocket (접속자 · 채팅) |
| `tosspay-payment` | payment | 토스페이 결제 |
---
## 멀티사이트
`dx_sites` 테이블에 도메인을 등록하면 도메인별 독립 설정이 적용됩니다.
```
domain 사이트명 테마 메뉴그룹
example.com 메인사이트 default main
shop.example.com 쇼핑몰 clean shop
blog.example.com 블로그 simple blog
```
### 도메인별 독립 적용 항목
- 사이트명 · 설명 · URL · 테마 · 언어 · 시간대 · 메뉴 그룹
- SEO 사이트맵 (각 도메인이 자신의 URL 기준으로 독립 생성)
---
## 보안
보안 코드는 **`core/Secure.php` 한 파일**에 집중되어 있습니다.
```
보안 패치 → core/Secure.php 만 수정하면 됩니다.
```
### 담당 기능
- 세션 보안 (HttpOnly · Secure · SameSite=Lax)
- CSRF 토큰 발급 / 검증
- 보안 헤더 (X-Frame-Options · X-Content-Type-Options · Referrer-Policy)
- XSS 방어 출력 이스케이프
- 경로 순회(Path Traversal) 방어
- 업로드 파일 검증 (MIME · 이중 확장자 차단)
- 비밀번호 해시 (bcrypt, PHP 5.6 폴백 포함)
- 안전 난수 생성 (PHP 5.6 ~ 8.x)
---
## extend/ — 코드 삽입
훅 등록 없이 파일만 폴더에 넣으면 자동 실행됩니다.
```
extend/top/01_maintenance.php ← 점검 모드
extend/top/02_ip_block.php ← IP 차단
extend/middle/01_visit_log.php ← 방문자 로그 (기본 포함)
extend/bottom/99_perf.php ← 성능 측정
```
- 파일명 오름차순 실행
- 에러가 발생해도 다른 파일에 영향 없음
---
## URL 라우팅
| URL 패턴 | 처리 |
|---|---|
| `/` | 홈 |
| `/free` | 게시판 목록 (board_key=free) |
| `/free/view/123` | 게시글 보기 |
| `/free/write` | 게시글 작성 |
| `/free/edit/123` | 게시글 수정 |
| `/about` | 커스텀 페이지 (slug=about) |
| `/auth/login` | 로그인 |
| `/auth/register` | 회원가입 |
| `/admin` | 관리자 대시보드 |
| `/api/upload` | 파일 업로드 API |
| `/sitemap.xml` | 동적 사이트맵 인덱스 |
| `/sitemap-posts-1.xml` | 게시글 사이트맵 |
| `/robots.txt` | 동적 robots.txt |
**URL Rewrite 없는 환경**: `index.php?_url=/free/view/123`
---
## 훅 시스템
### 훅 등록
```php
dx_add_hook('dx_head', function() {
echo '<link rel="stylesheet" href="/my.css">';
}, 10); // 우선순위 (낮을수록 먼저 실행)
```
### 주요 훅 포인트
| 훅 | 위치 |
|---|---|
| `dx_head` | `<head>` 내부 |
| `dx_body_bottom` | `</body>` 직전 |
| `dx_board_list_context` | 게시판 목록 컨텍스트 생성 후 |
| `dx_board_view_context` | 게시글 보기 컨텍스트 생성 후 |
| `dx_board_after_save` | 게시글 저장 후 |
| `dx_admin_top` | 관리자 본문 상단 |
| `dx_editor_render` | 에디터 렌더링 |
---
## 호환성
| 항목 | 범위 |
|---|---|
| PHP | 5.6 · 7.0 · 7.1 · 7.2 · 7.3 · 7.4 · 8.0 · 8.1 · 8.2 · 8.3 · 8.4 |
| MySQL | 5.6 이상 |
| MariaDB | 10.1 이상 |
| 웹서버 | IIS 7+ · Apache 2.2+ · Nginx · 저가형 공유호스팅 |
| OS | Windows · Linux |
| 브라우저 | Chrome · Firefox · Safari · Edge (IE11+ 부분 지원) |
대략 이 정도입니다.
하루에 3시간에 많게는 4시간 정도 투자한 것입니다.
무료 ai만 쓰고 만든 것으로, 여러분들은 더 좋은 시스템을 만들 수 있을 거예요.
앞으로 AI 시대를 맞이하여, 더욱더 발전하는 회사들이 되시길 바랍니다.
그리고, 프리랜서들도 돈 되는 플젝 따셔서 주머니가 가득차시길 바랍니다.
다 만들어진 것은 아니지만, README.md의 결과물을 보시고 싶으시면, 아래 링크를 참고하세요.
https://cms.designonex.com/
아이디 : admin
비밀번호 : 12341234
** 이 글의 주요 요점은 이젠 그누보드 스킨과 플러그인을 개발하지 않겠다는 뜻입니다. ㅠㅠ
잠 잘 시간이 없어요 ㅠㅠ, 입술이 다 터졌어요 ㅠㅠ 여러가지해서
10월에 교통사고로 입원하게 되었고, 총 12주 정도 병원에 있었습니다. 그중 한 보름 정도는 너무 심심해서 집에 굴러다니던 30만 원짜리 중고 노트북으로 이것저것 만지기 시작했죠.
그때는 솔직히 잘 몰랐습니다.
내가 다시 이 일을 시작하게 될지 말이죠.
지금 저는 막일을 합니다.
몸 쓰는 일이죠.
그래도 돈벌이가 꽤 짭짤합니다.
음… 여러분이 생각하는 것보다 조금 더 많을 겁니다. ㅎㅎ;;
이 일을 시작한 지도 한 4년 정도 된 것 같은데, 만족감이 워낙 커서 다시 개발 일을 할 거라고는 전혀 생각하지 못했습니다.
그런데 교통사고로 인한 입원 때문에 이렇게 다시 시작하게 되었네요.
참 묘합니다.
처음에는 그냥 예전에 해왔던 것처럼 엔진 하나만 만들어볼까 하는 생각으로 시작했습니다.
그러다가 갑자기 그누보드가 떠올라서, “그럼 그누보드와 연동해볼까?” 하면서 일이 시작되었습니다.
처음에는 소켓만 만들어서 기본 소스만 제공하면, 각자 알아서 응용해서 만들겠지 생각했습니다.
하지만 반응이 거의 없더군요.
그래서 채팅, 실시간 메모, WebRTC, Canvas, 목업, 장기 게임, 오목 게임, 북치기 게임 등 여러 기능을 만들어서 스킨과 플러그인 형태로 배포했습니다.
저는 단지 이걸 기반으로 응용해서 만드시라는 의미였는데…
이것도 반응은 뭐… ㅋㅋㅋ 그다지 크지는 않았습니다.
그래도 시간은 엄청 빨리 지나간 느낌이었습니다.
퇴원 후에는 일을 하면서 쉬엄쉬엄 시간을 쪼개 dxb CSS라는 것도 만들었습니다.
이걸 만든 이유는 단순합니다.
홈페이지 디자인을 배포하려고 했는데, Tailwind를 그대로 쓰자니 좀 그렇고…
그래서 그냥 이름이라도 남겨보자는 생각으로 오픈소스로 만들게 되었습니다.
디자인을 많이 배포하면 그래도 누군가는 쓰지 않을까 싶어서요.
음… 솔직히 이건 반응이 조금 있습니다.
많지는 않지만요. ^^;;
그런데 홈페이지 디자인만 배포하는 것으로는 부족하겠다 싶어서,
먼저 만들어 두었던 메시지 브릿지 소스를 점검하기 위해 채팅을 좀 더 다듬어서 HubTalk을 만들기 시작했습니다.
원래는 이것도 전부 배포용으로 만들려고 했던 것이었습니다.
그런데…
CMS까지 손대고 나니 점점 꿈이 커지네요.
물론 돈을 벌기 위해서 하는 것은 아닙니다.
맨 위에서 말했듯이, 지금 저는 잘 벌고 잘 먹고 살고 있습니다.
지금 만들고 있는 CMS에는
제가 실제로 서비스 운영하면서 필요하다고 느꼈던 기능들을 전부 내장하고 있는데,
조금씩 윤곽이 보이기 시작했습니다.
그래서 이제는 AI와 함께 꿈을 키워보려고 합니다.
제가 만들고 있는 CMS의 README.md만 복사해서 AI에게 만들어 달라고 해도 어느 정도는 구현해 줄 겁니다.
아, 참고로 제가 그누보드에 안 오겠다는 뜻은 아닙니다.
다만 이제는 그누보드 플러그인이나 스킨을 개발하는 단계가 아닐 뿐입니다.
-- 정신이 오락가락해서 chatgpt로 말이 되게 수정했습니다.
AI가 만들고, 디자인원엑스가 기획하는 CMS README.md
# DesignOneX CMS v1.8.5
## 특징
| 항목 | 내용 |
|---|---|
| **언어** | PHP 5.6 ~ 8.x (단일 코드베이스) |
| **DB** | MySQL 5.6+ / MariaDB 10.1+ (PDO) |
| **서버** | IIS · Apache · Nginx · 저가형 공유호스팅 |
| **OS** | Windows · Linux |
| **에디터** | CKEditor 4 (로컬) — 멀티 이미지, 유튜브 자동 임베드 |
| **SEO** | 자동 OG/Twitter Card, JSON-LD, 사이트맵, robots.txt |
| **캐시** | 파일 캐시 기본, APCu 자동 감지 전환 |
| **멀티도메인** | 도메인별 독립 사이트 설정 |
| **실시간** | WebSocket 소켓 플러그인 (dx-socket) |
| **보안** | CSRF · XSS · Path Traversal · 이중확장자 · Rate Limit |
## 폴더 구조
```
designonex-cms/
│
├── index.php ← 단일 진입점 (모든 요청)
│
├── core/ ← CMS 엔진 (직접 수정 비권장)
│ ├── Secure.php ← ★ 보안 전담 — 보안 패치는 이 파일만
│ ├── functions.php ← 공통 함수 (dx_esc, dx_csrf_* 등)
│ ├── DxCache.php ← 파일/APCu 캐시 (동접 최적화)
│ ├── DxSeo.php ← SEO 헬퍼 (OG, Twitter Card, JSON-LD)
│ ├── DxCategory.php ← 카테고리 렌더링 헬퍼 + 스킨
│ ├── DxSanitizer.php ← 입력 정제 · HTML 필터
│ ├── DxTheme.php ← 테마 엔진
│ ├── DxSite.php ← 멀티사이트 (도메인별 설정)
│ ├── DxExtend.php ← extend/ 폴더 자동 실행
│ ├── DxPoint.php ← 포인트 / 경험치 / 레벨
│ ├── DxBoardSkin.php ← 게시판 스킨 폴백 체인
│ ├── DxMarket.php ← 마켓 (플러그인 배포)
│ ├── PluginRegistry.php ← 플러그인 등록 / 활성화 관리
│ ├── hook/HookManager.php ← 훅 시스템
│ ├── db/Database.php ← PDO 래퍼 (싱글턴)
│ ├── router/Router.php ← URL 파싱 · 라우트 결정
│ ├── router/Dispatcher.php ← 라우트 → 핸들러 실행
│ ├── auth/Auth.php ← 세션 기반 인증
│ └── api/ ← API 핸들러
│ ├── upload.php ← 파일 업로드 (멀티, CSRF 보호)
│ ├── download.php ← 파일 다운로드
│ ├── comment.php ← 댓글 CRUD
│ ├── like.php ← 좋아요
│ ├── sitemap.php ← 동적 XML 사이트맵
│ └── robots.php ← 동적 robots.txt
│
├── admin/ ← 관리자
│ ├── index.php ← 관리자 레이아웃 (사이드바 · 헤더)
│ ├── dashboard/ ← 대시보드
│ ├── boards/ ← 게시판 관리 (에디터 · 카테고리 스킨)
│ ├── categories/ ← 카테고리 (표시위치 · 배지색 · 스킨)
│ ├── members/ ← 회원 관리
│ ├── menus/ ← 메뉴 관리 (게시판·페이지 빠른 선택)
│ ├── pages/ ← 페이지 관리
│ ├── themes/ ← 테마 관리
│ ├── plugins/ ← 플러그인 관리
│ ├── statistics/ ← 방문자 통계 · 인기검색어
│ ├── socket/ ← 실시간 소켓 모니터
│ └── settings/ ← 사이트 설정 (SEO · Analytics · 캐시)
│
├── boards/ ← 게시판
│ ├── handler.php ← 목록/보기/쓰기/수정/삭제/댓글
│ ├── skins/ ← 게시판 스킨
│ └── category/skins/ ← 카테고리 탭 스킨
│ ├── default/ ← 라운드 탭 (기본)
│ └── pill/ ← 언더라인 탭
│
├── themes/ ← 프론트엔드 테마
│ ├── default/ ← 기본 테마
│ ├── clean/ ← Clean 테마
│ └── simple/ ← Simple 테마
│ (각 테마)/category/ ← 테마별 커스텀 카테고리 스킨
│
├── plugins/ ← 플러그인
│ ├── ckeditor4-editor/ ← CKEditor 4 (기본 활성)
│ ├── dx-socket/ ← 실시간 WebSocket
│ ├── jodit-editor/ ← Jodit 에디터
│ ├── tinymce-editor/ ← TinyMCE 에디터
│ └── tosspay-payment/ ← 토스페이 결제
│
├── assets/
│ ├── ckeditor4/ ← CKEditor 4 로컬 파일
│ └── js/
│ ├── dxb-css.js ← dxb-css 런타임 엔진 (Tailwind 호환)
│ └── dx.js ← 공통 JS
│
├── extend/ ← 훅 없이 코드 삽입
│ ├── top/ ← 초기화 직후
│ ├── middle/ ← 라우팅 후
│ └── bottom/ ← 렌더링 완료 후
│
├── data/ ← 설정 · 업로드 · 캐시 (웹 접근 차단)
│ ├── config.php ← DB 연결 + 설정 캐시 (설치 시 자동 생성)
│ ├── cache/ ← 파일 캐시 저장소
│ └── uploads/ ← 업로드 파일
│
├── install/ ← 설치 마법사 (설치 후 삭제 권장)
│
├── .htaccess ← Apache 설정
├── web.config ← IIS 설정 (URL Rewrite 있는 환경)
├── web.config.no-rewrite ← IIS 설정 (URL Rewrite 없는 환경)
└── nginx.conf.example ← Nginx 설정 예시
```
## 웹서버별 설정
| 환경 | 사용 파일 | 비고 |
|---|---|---|
| Apache (mod_rewrite 있음) | `.htaccess` | 대부분의 리눅스 호스팅 |
| Apache (mod_rewrite 없음) | `.htaccess` | `?_url=` 방식 자동 전환 |
| IIS (URL Rewrite 있음) | `web.config` | IIS 8.x 이상 권장 |
| IIS (URL Rewrite 없음) | `web.config.no-rewrite` → `web.config`로 교체 | 500.19 에러 방지 |
| Nginx | `nginx.conf.example` 참고 | — |
| 저가형 공유호스팅 | 별도 설정 불필요 | PHP 레벨로 자동 커버 |
## SEO 최적화
### 자동 생성 태그
페이지 타입(게시글/목록/페이지/홈)에 따라 자동 생성됩니다.
```html
<!-- 기본 -->
<title>게시글 제목 — 게시판명 | 사이트명</title>
<meta name="description" content="본문 앞 150자 자동 추출">
<meta name="robots" content="index,follow">
<link rel="canonical" href="https://...">
<!-- Open Graph -->
<meta property="og:type" content="article">
<meta property="og:title" content="...">
<meta property="og:description" content="...">
<meta property="og:image" content="본문 첫 이미지 자동 추출">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<!-- JSON-LD 구조화 데이터 -->
<script type="application/ld+json">{"@type":"Article",...}</script>
```
### 자동 noindex 처리
- 비밀글
- 검색 결과 페이지 (`?s=` 파라미터)
### 사이트맵 (멀티도메인 지원)
```
/sitemap.xml ← 사이트맵 인덱스
/sitemap-pages.xml ← 홈 + 정적 페이지
/sitemap-boards.xml ← 게시판 목록
/sitemap-posts-1.xml ← 게시글 (1000개씩 자동 분할)
```
멀티도메인 환경에서 각 도메인이 자신의 `site_url` 기준으로 독립 사이트맵 생성.
### robots.txt
```
/robots.txt
```
관리자 > 사이트 설정에서 커스텀 내용 직접 작성 가능.
### 관리자 SEO 설정 항목
- OG 기본 이미지 URL
- Twitter 계정 (`@yoursite`)
- Google Analytics ID — 레이아웃에 자동 삽입
- 네이버 웹마스터 인증코드 — 자동 삽입
- Google 웹마스터 인증코드 — 자동 삽입
- robots.txt 커스텀 편집
---
## 성능 · 캐시
### DxCache — 자동 드라이버 선택
```
APCu 설치됨 → 메모리 캐시 (최고 성능)
APCu 없음 → 파일 캐시 data/cache/ (저가형 호스팅 포함 전 환경)
```
### 캐시 항목
| 항목 | TTL |
|---|---|
| 전체 설정 (dx_settings) | 5분 |
| 게시판 목록 (비로그인 기본) | 1분 |
| 사이트맵 XML | 10분 |
### 캐시 자동 무효화 시점
- 설정 저장 → 전체 캐시 flush
- 게시글 작성/수정/삭제 → 해당 게시판 캐시 삭제
- 카테고리 변경 → 전체 게시판 목록 캐시 삭제
### 세션 최적화
비로그인 GET 요청은 세션을 시작하지 않습니다.
→ 파일 lock 제거 → 동시 처리 성능 향상
### 동접 1만명 권장 서버 구성
```
PHP-FPM : pm.max_children = 200~500
OPcache : opcache.enable=1, memory_consumption=256
MySQL : max_connections=500
innodb_buffer_pool_size = RAM 70%
nginx : 정적파일(css/js/img) 직접 서빙 (PHP 우회)
CDN : Cloudflare 앞단 → 실제 PHP 히트 80% 감소
WebSocket: 별도 Node.js 서버 (dx-socket 플러그인)
```
---
## 게시판 시스템
### 지원 기능
- 목록 / 보기 / 쓰기 / 수정 / 삭제
- 공지사항 · 비밀글 · 카테고리 · 태그
- 댓글 (CKEditor 에디터 옵션)
- 파일 첨부 (드래그&드롭 · 멀티 업로드 · 용량 초과 즉시 안내)
- 좋아요 · 스크랩
- 검색 (제목 / 내용 / 작성자 / 분류)
### 게시판별 독립 설정
관리자 > 게시판 관리에서 게시판마다:
- **에디터**: CKEditor4 / Jodit / TinyMCE / 텍스트 선택
- **카테고리 스킨**: 라운드 탭 / 언더라인 탭 / 커스텀
### 파일 업로드 보안
- MIME 타입 + 확장자 이중 검증
- 실제 이미지 검증 (`getimagesize()`)
- 이중 확장자 공격 차단 (`shell.php.jpg` 등)
- 업로드 디렉토리 PHP 실행 차단 `.htaccess` 자동 생성
---
## 카테고리 시스템
### 특징
- DB 기반 무한 깊이 계층 구조
- 게시판별 독립 카테고리
- 표시 위치: **리스트 탭** / **뷰 배지** 독립 on/off
- 배지 색상 선택 (파랑/초록/빨강/주황/보라/회색)
### 카테고리 스킨 우선순위
```
themes/[테마]/category/list.php ← 테마별 커스텀 (최우선)
boards/category/skins/[스킨]/ ← 지정 스킨
boards/category/skins/default/ ← 기본 스킨 (폴백)
```
커스텀 스킨 경로는 관리자 > 카테고리 관리 화면에서 확인할 수 있습니다.
---
## 에디터 (CKEditor 4)
- **위치**: `assets/ckeditor4/` (로컬 파일 — CDN 의존 없음)
### 주요 기능
- 멀티 이미지 업로드 (toolbar 버튼 + 드래그&드롭)
- 유튜브 URL 붙여넣기 → iframe 자동 변환
- 코드 하이라이트 (monokai_sublime 테마)
- 댓글 에디터 활성화 옵션
## 플러그인
### 플러그인 등록 방법
```php
// plugins/my-plugin/plugin.php
dx_register_plugin(array(
'id' => 'my-plugin',
'type' => 'editor', // editor | payment | socket | captcha
'name' => 'My Plugin',
'version' => '1.0.0',
'settings' => array(
'my_option' => array(
'label' => '옵션명',
'type' => 'select',
'options' => array('1' => '사용', '0' => '사용 안 함'),
'default' => '1',
),
),
));
```
### 기본 제공 플러그인
| 플러그인 | 타입 | 설명 |
|---|---|---|
| `ckeditor4-editor` | editor | CKEditor 4 (기본 활성) |
| `jodit-editor` | editor | Jodit WYSIWYG |
| `tinymce-editor` | editor | TinyMCE |
| `dx-socket` | socket | 실시간 WebSocket (접속자 · 채팅) |
| `tosspay-payment` | payment | 토스페이 결제 |
---
## 멀티사이트
`dx_sites` 테이블에 도메인을 등록하면 도메인별 독립 설정이 적용됩니다.
```
domain 사이트명 테마 메뉴그룹
example.com 메인사이트 default main
shop.example.com 쇼핑몰 clean shop
blog.example.com 블로그 simple blog
```
### 도메인별 독립 적용 항목
- 사이트명 · 설명 · URL · 테마 · 언어 · 시간대 · 메뉴 그룹
- SEO 사이트맵 (각 도메인이 자신의 URL 기준으로 독립 생성)
---
## 보안
보안 코드는 **`core/Secure.php` 한 파일**에 집중되어 있습니다.
```
보안 패치 → core/Secure.php 만 수정하면 됩니다.
```
### 담당 기능
- 세션 보안 (HttpOnly · Secure · SameSite=Lax)
- CSRF 토큰 발급 / 검증
- 보안 헤더 (X-Frame-Options · X-Content-Type-Options · Referrer-Policy)
- XSS 방어 출력 이스케이프
- 경로 순회(Path Traversal) 방어
- 업로드 파일 검증 (MIME · 이중 확장자 차단)
- 비밀번호 해시 (bcrypt, PHP 5.6 폴백 포함)
- 안전 난수 생성 (PHP 5.6 ~ 8.x)
---
## extend/ — 코드 삽입
훅 등록 없이 파일만 폴더에 넣으면 자동 실행됩니다.
```
extend/top/01_maintenance.php ← 점검 모드
extend/top/02_ip_block.php ← IP 차단
extend/middle/01_visit_log.php ← 방문자 로그 (기본 포함)
extend/bottom/99_perf.php ← 성능 측정
```
- 파일명 오름차순 실행
- 에러가 발생해도 다른 파일에 영향 없음
---
## URL 라우팅
| URL 패턴 | 처리 |
|---|---|
| `/` | 홈 |
| `/free` | 게시판 목록 (board_key=free) |
| `/free/view/123` | 게시글 보기 |
| `/free/write` | 게시글 작성 |
| `/free/edit/123` | 게시글 수정 |
| `/about` | 커스텀 페이지 (slug=about) |
| `/auth/login` | 로그인 |
| `/auth/register` | 회원가입 |
| `/admin` | 관리자 대시보드 |
| `/api/upload` | 파일 업로드 API |
| `/sitemap.xml` | 동적 사이트맵 인덱스 |
| `/sitemap-posts-1.xml` | 게시글 사이트맵 |
| `/robots.txt` | 동적 robots.txt |
**URL Rewrite 없는 환경**: `index.php?_url=/free/view/123`
---
## 훅 시스템
### 훅 등록
```php
dx_add_hook('dx_head', function() {
echo '<link rel="stylesheet" href="/my.css">';
}, 10); // 우선순위 (낮을수록 먼저 실행)
```
### 주요 훅 포인트
| 훅 | 위치 |
|---|---|
| `dx_head` | `<head>` 내부 |
| `dx_body_bottom` | `</body>` 직전 |
| `dx_board_list_context` | 게시판 목록 컨텍스트 생성 후 |
| `dx_board_view_context` | 게시글 보기 컨텍스트 생성 후 |
| `dx_board_after_save` | 게시글 저장 후 |
| `dx_admin_top` | 관리자 본문 상단 |
| `dx_editor_render` | 에디터 렌더링 |
---
## 호환성
| 항목 | 범위 |
|---|---|
| PHP | 5.6 · 7.0 · 7.1 · 7.2 · 7.3 · 7.4 · 8.0 · 8.1 · 8.2 · 8.3 · 8.4 |
| MySQL | 5.6 이상 |
| MariaDB | 10.1 이상 |
| 웹서버 | IIS 7+ · Apache 2.2+ · Nginx · 저가형 공유호스팅 |
| OS | Windows · Linux |
| 브라우저 | Chrome · Firefox · Safari · Edge (IE11+ 부분 지원) |
대략 이 정도입니다.
하루에 3시간에 많게는 4시간 정도 투자한 것입니다.
무료 ai만 쓰고 만든 것으로, 여러분들은 더 좋은 시스템을 만들 수 있을 거예요.
앞으로 AI 시대를 맞이하여, 더욱더 발전하는 회사들이 되시길 바랍니다.
그리고, 프리랜서들도 돈 되는 플젝 따셔서 주머니가 가득차시길 바랍니다.
다 만들어진 것은 아니지만, README.md의 결과물을 보시고 싶으시면, 아래 링크를 참고하세요.
https://cms.designonex.com/
아이디 : admin
비밀번호 : 12341234
** 이 글의 주요 요점은 이젠 그누보드 스킨과 플러그인을 개발하지 않겠다는 뜻입니다. ㅠㅠ
잠 잘 시간이 없어요 ㅠㅠ, 입술이 다 터졌어요 ㅠㅠ 여러가지해서
총 5명이 반응했습니다
|
댓글을 작성하시려면 로그인이 필요합니다.
댓글 8개
하루에 3~4시간씩 투자했다는 뜻입니다.
일 끝나고, 씻고 밥먹고 하면, 11시가 넘어요. 새벽 2~3시까지 작업했다는 뜻이예요 ^^;;
그런데, 그누보드와 비교하기엔 경량입니다.
비교가 안되죠. ^^
앞으로 제가 그누보드에 CMS와 관련된 글은 마지막 글이겠지만, 혼자 놀이터에서는 열심히 달릴 예정이오니 관심가져주시면 감사하죠. ^^
무료 AI에서 오늘 그냥 헌질했습니다. 너무 시간을 잡아먹어서요 ㅎㅎ;;
이건 제가 1줄도 코딩을 안하고 기획만 짜는 첫번째 프로그램이 될 것 같습니다.
감사합니다.
멋지다고 하니 감사합니다.
하늘뚱님도 행복한 시간되세요~~~
하지만, 좋은 결과보다 서로 소통되는 하나의 길을 만든다면 나름대로 뿌듯할 것 같습니다.
응원 감사합니다.