같은 내용을 오라클 Devel에도 올렸습니다. 원래 오라클 자료를 기반으로 해서 만든것인데 실제 구현은 Mysql로 해서 여기에도 올립니다. 이정도는 중복되어서 올려도 괜찮을 듯 합니다.
###############################################
######## DB이용한 컨텐츠 관리 시스템(CMS) ##########
###############################################
프로그램작성일 : 2002. 1월-3월
프로그램작성자 : 문태준(http://tunelinux.pe.kr http://database.sarang.net 운영자)
문서 최종 업데이트 : 2002. 6. 12
웹사이트 규모가 커지면서 컨텐츠 관리를 효율적으로 하기 위한 관리 시스템이 필요합니다.
이를 CMS라고 합니다. Contents Management System.
효율적인 컨텐츠 관리를 위하여 데이터베이스를 이용할 수 있습니다.
이 프로그램은 오라클의 CMS자료를 참고로 하여 제가 Mysql용으로 일부 수정하여 바꾼 것입니다.
오라클의 자료는 다음과 같습니다.
http://otn.oracle.com/products/oracle8i/htdocs/cms/cmsdb.html
한글자료는 일부만 있습니다.
http://www.oracle.com/kr/magazine/webcolumns/2001/index.html?o41otn.html
DB기반의 CMS프로그램의 장점은 다음과 같습니다.
ㅇ 동시성 관리와 버전 통제 : 간단한 플랫파일 시스템에서는 2명 이상이 동일한 자산을 동시에 편집할 수 있지만, 단 한 사람이 변경한 내용만 유효할 것이다. 그러나, CMS는 복수 버전들을 지원할 수 있도록 짜여진 테이블에 자산들을 저장하며, 데이타베이스가 동시 액세스를 관리한다.
ㅇ 사이트 전체에 걸쳐 일관되면서도 커스터마이즈 가능한 룩앤필 : CMS는 데이타베이스에서 표준 디자인 요소들과 네비게이션 항목들을 끌어내어 템플릿 기반의 웹 페이지들을 만든다. 사용자는 이 자산들을 편집하고 템플릿을 재응용해 사이트 전반에 변화를 줄 수 있다.
ㅇ 액세스 통제: 특정 자산에 대한 변경은 사이트 전체에 영향을 미칠 수도 있다. 예를 들어, 욕구불만의 카피라이터가 법무팀의 \프라이버시\ 경고문을 편집하거나, 누군가가 고의로 회사 로고로 장난을 한다면 어떻게 되겠는가? 특정 자산에 손 댈 권한이 없는 사람이 이런 일을 하지 못 하도록 하기 위해 CMS는 사용자의 역할에 따라 다양한 레벨의 액세스 권한을 부여한다.
ㅇ 신속한 검색: Oracle8i에는 데이타베이스에서 텍스트를 인덱스하는 interMedia가 들어 있어, 검색 속도를 높여 준다.
여기서 제가 구현한 것에는 일부 기능이 빠져있습니다. 빠진 기능은 다음과 같습니다.
ㅇ 동시성 관리와 버전 통제 : 처음 만들었을때는 넣었으나 실제 사용시에는 뺐습니다. 소규모 인원이 관리하는 곳에서는 오히려 번거로운 기능이기 때문입니다. 필요하다면 약간만 프로그램을 수정하면 됩니다.
ㅇ 액세스 통제 : 사용자 인증을 통하여 사용자별로 별도의 권한을 줄 수 있습니다. 어떤 사람은 카테고리 추가만, 어떤 사람은 컨텐츠 업데이트만 가능하도록 바꿀 수 있습니다.
ㅇ 신속한 검색 : 오라클 자료에서는 검색엔진에서 사용할 인덱스를 interMedia를 이용하여 처리합니다. 또한 본문 텍스트 검색시에도 이용가능합니다. 인터미디어는 대량의 텍스트 자료를 검색하기 위한 기능으로서 별도의 검색엔진이 불필요합니다. Mysql에서는 full-text 검색을 인덱싱처리하는 기능이 최근 추가되었지만 아직 한글 지원은 안되고 있습니다.
기본적으로 먼저 오라클의 자료를 읽어보셔야 이해가 가능합니다. 영문자료지만 천천히 읽어보면 이해가 갈 것입니다.
사용시 개선점이나 의견에 대해서는 http://tunelinux.pe.kr 사이트를 이용하여 주시기 바랍니다.
ㅇ 프로그램 구성
# tree
|-- README -> 지금 보고 있는 파일
|-- category_act.php
|-- category_insert.php
|-- category_list.php
|-- contents_act.php
|-- contents_insert.php
|-- contents_list.php
|-- contents_view.php
|-- include
| |-- common.ph -> 자주 사용하는 함수
| |-- config.ph -> db host, user, passwd, db명, table 명 지정
| |-- footer.ph
| |-- info
| | |-- cms-db.sql
| | |-- html_type.txt
| | `-- style.html
| `-- menu.ph
|-- index.php
|-- page_act.php
|-- page_insert.php
|-- page_list.php
|-- page_make.php
|-- page_view.php
|-- template_act.php
|-- template_insert.php
`-- template_list.php
실제 프로그램 이용시에는 include 디렉토리의 환경설정파일만 약간씩 고쳐서 사용하면 됩니다.
common.ph
define(\BASE_DIR\,$DOCUMENT_ROOT.\/cms\);
=> cms 프로그램이 있는 기본 디렉토리 지정. (php설정에 따라 $DOCUMENT_ROOT는 사용못할수도 있습니다)
config.ph
=> db설정을 하고 각자 상황에 맞게 변경하면 됩니다.
$doc_root = \/usr/local/www/template/\;
=> doc_root는 정적으로 생성되는 파일이 들어갈 디렉토리를 의미합니다. 웹서버의 user 에 대한 쓰기 권한이 있어야합니다. 일반적으로 nobody라면 nobody가 쓰기 권한이 있어야 합니다. 만약 nobody가 아닌 다른 일반유저 권한으로 파일을 생성하려면 파일생성시 펄이나 쉘 스크립트를 이용하여 파일을 생성해도 됩니다.
=> rsync 부분은 여러대의 서버를 운영하는 경우 동기화를 위하여 제가 사용했던 방법이며 필요하지 않으면 사용하지 않아도 됩니다.
include/info/cms-db.sql
=> db 구조 덤프뜬 내용임
ㅇ DB 구조도
-- MySQL dump
--
-- Host: localhost Database: cms
---------------------------------------------------------
-- Server version 3.23.49-log
--
-- Table structure for table \category\
--
DROP TABLE IF EXISTS category;
CREATE TABLE category (
category_id int(11) NOT NULL auto_increment,
category_name varchar(50) default NULL,
html_header int(11) NOT NULL default \1\,
meta int(11) NOT NULL default \1\,
page_header int(11) NOT NULL default \1\,
page_footer int(11) NOT NULL default \1\,
html_footer int(11) NOT NULL default \1\,
created datetime NOT NULL default \0000-00-00 00:00:00\,
updated datetime default NULL,
PRIMARY KEY (category_id)
) TYPE=MyISAM;
--
-- Table structure for table \contents\
--
DROP TABLE IF EXISTS contents;
CREATE TABLE contents (
id int(11) NOT NULL default \0\,
version int(11) NOT NULL default \1\,
content text NOT NULL,
comments varchar(255) default NULL,
created datetime NOT NULL default \0000-00-00 00:00:00\,
updated datetime default NULL,
deleted char(1) NOT NULL default \n\,
PRIMARY KEY (id,version),
KEY no (id)
) TYPE=MyISAM;
--
-- Table structure for table \page\
--
DROP TABLE IF EXISTS page;
CREATE TABLE page (
page_id int(11) NOT NULL auto_increment,
id int(11) NOT NULL default \0\,
title varchar(255) default NULL,
type varchar(10) NOT NULL default \html\,
path varchar(255) NOT NULL default \./\,
filename varchar(255) NOT NULL default \default\,
category_id int(11) default NULL,
descr varchar(255) default NULL,
status char(1) NOT NULL default \n\,
created datetime NOT NULL default \0000-00-00 00:00:00\,
updated datetime default NULL,
PRIMARY KEY (page_id),
KEY id (id)
) TYPE=MyISAM;
--
-- Table structure for table \template\
--
DROP TABLE IF EXISTS template;
CREATE TABLE template (
name varchar(200) NOT NULL default \,
clob_id int(11) NOT NULL default \0\,
version int(11) NOT NULL default \1\,
template text NOT NULL,
type int(11) NOT NULL default \1\,
created datetime NOT NULL default \0000-00-00 00:00:00\,
updated datetime default NULL,
deleted char(1) NOT NULL default \n\,
PRIMARY KEY (clob_id,version),
KEY no (clob_id)
) TYPE=MyISAM;
--
-- Table structure for table \template_type\
--
DROP TABLE IF EXISTS template_type;
CREATE TABLE template_type (
type_id int(11) NOT NULL auto_increment,
type_name varchar(20) NOT NULL default \,
PRIMARY KEY (type_id)
) TYPE=MyISAM;
INSERT INTO template_type VALUES (1,\html_header\);
INSERT INTO template_type VALUES (2,\meta\);
INSERT INTO template_type VALUES (3,\page_header\);
INSERT INTO template_type VALUES (4,\page_footer\);
INSERT INTO template_type VALUES (5,\html_footer\);
|