일반 XE 개발팀 / 2012. 5. 3. 1. 개요 이문서에서는 XpressEngine( 이하 XE) ver. 1.4.x 에서 XE ver. 1.5.x 로업데이트하는방법을살펴보고 XE ver. 1.5.x 로업데이트했을때주로 발생하는오류상황에대한해결가이드를제공합니다. 2. 업데이트전확인사항서버호스팅, 가상서버호스팅등서버의 root 계정을사용할수있을경우 files 디렉터리하위의디렉터리와파일이웹서버권한인지반드시확인바랍니다. root 계정을이용하여 files 하위의파일을생성했을경우 XE가해당파일을수정할수없어업데이트시파일권한문제가발생할수있습니다. 3. 백업 XE ver. 1.5.x로업데이트하기전에업데이트이후오류를대비하여현재데이터및소스를백업합니다. 3.1. 파일백업 ssh를통해접속한후아래명령을통해 XE가설치된디렉터리를백업합니다. $ tar -zcvf backup.tar.gz XE_ 설치 _ 디렉터리 3.2. DB 백업 ssh 를통해접속한후아래명령을통해 DB 를백업합니다. $ mysqldump -udb 계정명 -p XE_ 설치 _DB > backup.sql SSH 접속은어떻게하나요? SSH 접속방법은사용하시는호스팅업체의 FAQ 혹은 1 대 1 문의를통해확인할수있습니다. 제호스팅은 SSH 가지원되지않아요. SSH 가지원되지않을경우사용하시는호스팅업체에요청하여백업을받으실수있습니다. DB 계정명, XE 설치 DB 를모르겠어요. XE_ 설치 _ 디렉터리 /files/config/db.config.php 파일을통해 DB 계정명, XE 설치 DB 를확인할수있습니다. 변수명 $db_info->db_userid $db_info->db_password $db_info->db_database 의미 DB 계정명 DB 계정비밀번호 XE 설치 DB 1 / 27
4. XE 소스업데이트백업이완료되면 XE의소스를업데이트합니다. 쉬운설치, FTP, SVN 세가지방식중본인에게맞는방식을선택하여업데이트합니다. 4.1. 쉬운설치를통한업데이트 XE 관리자화면으로접속한후쉬운설치에서 XE core를업데이트합니다. 상단의 [ 쉬운설치 ] 를클릭한후왼쪽카테고리에서 [XE core] 를클릭하고 XE core의 [ 업데이트 ] 버튼을클릭합니다. 다음화면에서 FTP 비밀번호를입력한후 [ 업데이트 ] 버튼을클릭하면업데이트가이루어집니다. 쉬운설치설정은어떻게하나요? 쉬운설치설정방법은 XE 사용자매뉴얼 4.2.2 쉬운설치로추가기능설치를참고하세요. 2 / 27
4.2. FTP 프로그램을통한업데이트 XE 공식사이트에서 [ 다운로드 ] 를클릭한후왼쪽의카테고리에서 [XE core] 를클릭하고목록에서 XE core 를클릭합니다. [ 다운로드 ] 를클릭하여파일을다운로드받습니다. 3 / 27
다운받은압축파일을적당한곳에풀어줍니다. FTP 프로그램을실행하여 FTP 로접속한후파일을업로드합니다. 업로드완료후에는항상전송실패한파일은없는지확인합니다. FTP 접속방법을모르겠어요 FTP 접속방법은사용하시는호스팅업체의 FAQ 혹은 1 대 1 문의를통해확인할수있습니다. 4 / 27
4.3. SVN 을통한업데이트 ssh 를통하여접속한후 XE 설치디렉터리에서아래명령으로최신코드를 export 합니다. $ svn export http://xe-core.googlecode.com/svn/trunk. --force SSH 접속은어떻게하나요? SSH 접속방법은사용하시는호스팅업체의 FAQ 혹은 1 대 1 문의를통해확인할수있습니다. 제호스팅은 SSH 가지원되지않아요. SSH 가지원되지않을경우쉬운설치혹은 FTP 를통해업데이트를해주세요. -bash: svn: command not found 라고나와요 svn 지원이되지않는환경입니다. 쉬운설치혹은 FTP 를통해업데이트를해주세요. 5 / 27
5. 모듈테이블생성 / 업데이트 XE 소스업데이트가완료되면관리자화면으로접속하여모듈테이블생성 / 업데이트를진행합니다. 테이블생성 / 업데이트는 module, document, comment, member 부터우선처리한후나머지를처리합니다. document, comment 의업데이트 document, comment 모듈의업데이트는데이터의양에따라오랜시간이걸릴수도있습니다. 버튼이없어지지않을때 테이블생성 / 업데이트버튼을클릭해도해당모듈의버튼이없어지지않을때는우선다음모듈로진행하고모든버튼이사라질때까지위에 서아래순서로반복해보세요. 관리자로로그인할수없을때 관리자로로그인할수없을경우 8.5. 로그인 / 회원가입이되지않는다. 를참고하세요. 모듈테이블생성 / 업데이트가완료되면오른쪽하단의 [ 캐시파일재생성 ] 를클릭하여캐시파일을재생성합니다. 6. 기타모듈업데이트게시판과같이 core에포함되어있지않은모듈의경우직접최신버전으로업데이트해주어야합니다. 해당모듈도 4. XE 소스업데이트를참고하여업데이트해줍니다. 서드파티프로그램호환성서드파티에서제작한프로그램은 XE 1.5 에서호환성문제가있을수있습니다. 자세한정보는 http://www.xpressengine.com/faq/entry/%ed%98%b8%ed%99%98%ec%84%b1_%ec%a0%90%ea%b2%80_%eb%ac% B8%EC%84%9C 를참고하세요. 7. 작동확인 업데이트후작동에문제가없는지확인합니다. 6 / 27
8. 문제해결 8.1. 파싱에러가발생한다. 업데이트후아래와같은파싱에러가발생할수있습니다. Parse error: syntax error, unexpected $end in 경로생략 /files/cache/template_compiled/a572d6cbd2ce53364824af98152d874b.compiled.php on line 59 1.4 버전의템플릿엔진은내부에이미많은오류를가지고있었습니다. 예를들어템플릿태그를닫지않은경우문법오류가발생해야하지만이전버전에서이를체크하는로직에문제가있어태그가완전하게닫히지않아도문제없이사용할수있었습니다. 또한, 이미지 / 외부파일들경로설정방식도일관성이없어, 스킨구조에따라외부파일로드방식이모두제각각이었습니다. 이렇듯로직오류가있음에도불구하고템플릿문법에대한정확한매뉴얼이존재하지않았기때문에많은서드파티 / 스킨제작자들이오류에맞추어레이아웃 / 스킨을제작하고있었습니다. 이런문제를개선하고자 1.5 에서는템플릿문법의스팩을명확하게결정하고이에따라문법을엄격하게체크하도록수정하였습니다. 이로인하여 실제로템플릿엔진코드는 1/3 수준으로크기가줄었으며원활한디버깅을지원할수있게되었습니다. 또한템플릿해석속도로개선되었습니다. 따라서기존의오류로직이포함된레이아웃 / 스킨의경우새로운템플릿엔진에서오류로감지되어정상적인출력이되지않습니다. 위와같은파싱에러의경우조건문, 반복문등의템플릿문법이포함된태그의열림 / 닫힘이맞지않아발생합니다. 아래예의경우 cond 문법이포함된첫번째 <a> 태그의닫힘태그가없습니다. <h1> <a href="{$layout_info->index_url}" cond="$layout_info->logo_image"><img src="{$layout_info->logo_image}" alt="logo" border="0" /> <a href="{$layout_info->index_url}" cond="!$layout_info->logo_image">{$layout_info->logo_image_alt}</a> </h1> 위예의경우아래와같이 </a> 가포함되어야올바르게작동합니다. <h1> <a href="{$layout_info->index_url}" cond="$layout_info->logo_image"><img src="{$layout_info->logo_image}" alt="logo" border="0" /></a> <a href="{$layout_info->index_url}" cond="!$layout_info->logo_image">{$layout_info->logo_image_alt}</a> </h1> 7 / 27
이와같이수정을하기위해서는어느파일에오류가있는지알아내야합니다. XE 는하나의화면을구성하기위하여레이아웃, 모듈, 위젯등의 템플릿을컴파일합니다. 이에러를해결하기위해서는정확하게어떤파일에오류가있는지찾아내야합니다. 위파싱에러에나온컴파일된템플릿 파일을편집기로열어봅니다. Parse error: syntax error, unexpected $end in 경로생략 /files/cache/template_compiled/a572d6cbd2ce53364824af98152d874b.compiled.php on line 59 원본파일의대략적인위치는 meta 정보등을통해유추할수있습니다. 추가적으로엘리먼트의 id/class 명, 스킨변수명등이원본파일을찾는힌트가될수있습니다. 이런정보들을이용하여파일내용을검색하여원본파일을찾아냅니다. a572d6cbd2ce53364824af98152d874b.compiled.php 내용... 생략... <!--#Meta:layouts/xe_official/js/xe_official.js-->... 생략... <?php if($ Context->layout_info->background_image){?><style type="text/css"> body{background:url(<?php echo $ Context->layout_info->background_image?>) repeat-x left top;} </style><?php }?>... 생략... <div class="xe"> <div class="header">... 생략... </div> <div class="body">... 생략 </div> <div class="footer"> <p><a href="http://xpressengine.com/" target="_blank">powered by <strong>xe</strong></a></p> </div> </div> 위파일의내용을보면 meta 정보를통해오류가 xe_official 레이아웃에있다는사실을유추할수있습니다. 기타모듈스킨, 위젯스킨등도위와 같은방법으로유추하여찾아보시기바랍니다. 원본파일을찾았다면해당파일에서템플릿문법이포함된 HTML 태그의열림 / 닫힘이올바른지검사합니다. 이때손쉽게해당부분을찾을수 있는왕도는없습니다. 첫째줄부터차례대로꼼꼼하게검사하시기바랍니다. 8 / 27
8.2. 템플릿파일을찾을수없다고나온다. 템플릿엔진개선으로인해여러파일을 include 하는스킨의경우아래와같은템플릿파일을찾을수없다는에러가발생할수있습니다. Err : './modules/module_name/skins/skin_name/template.html' template file does not exists. skin_name includes index.html nested include.html a.html b.html 기존의템플릿엔진은 include 경로를최초의파일위치부터계산했지만새로운템플릿엔진은무조건 include 를하는파일의경로부터계산합니다. 위와같은구조의스킨이있다고하였을때 index.html 에서 include.html 을 include 하고 include.html 에서다시 a.html 을 include 한다고했을때기존의템플릿엔진 : index.html... <include target="./includes/include.html" />... include.html... <include target="./includes/nested/a.html" />... 기존의템플릿엔진은위와같이최초의파일인 index.html 의위치를기준으로 include 위치를계산합니다. 새템플릿엔진 : index.html... <include target="./includes/include.html" />... include.html... <include target="./nested/a.html" />... 새템플릿엔진에서는최초의파일이어디에위치하는지상관하지않고무조건 include 를하는파일의위치를기준으로 include 위치를상대 경로로계산합니다. 8.1. 파싱에러가발생한다. 에서와마찬가지로해당파일의위치를통해오류가있는파일의위치를유추할수있습니다. 위예의경우 module_name 모듈의 skin_name 스킨에오류가있다는것을유추할수있습니다. Err : './modules/module_name/skins/skin_name/template.html' template file does not exists. 해당스킨파일중에 template.html 파일을 include 하는파일을검색을통해찾아냅니다. 파일을찾았다면위설명을참고하여 include 위치를 다시작성해줍니다. 9 / 27
8.3. 화면이깨진다 / 스크립트오류가발생한다.. 앞서살펴본템플릿엔진의경로계산방식변경으로인하여스킨이나레이아웃의 CSS/JS 파일경로가올바르지않아화면이깨질수있습니다. 해당페이지의소스보기를통해 CSS/JS 파일의경로를확인하여올바른경로로나왔는지확인해올바르게수정하기바랍니다. 자세한내용은 8.2. 템플릿파일을찾을수없다고나온다. 를참고바랍니다. 10 / 27
8.4. 글작성이안된다. XE 1.4 버전의문서상태는서로다른방식의로직으로구현되었습니다. 그렇다보니새로운문서상태가추가될경우별도의값을저장하기위한컬럼을추가하거나새로운함수를추가해야했습니다. 이런문제를개선하고자문서의상태를하나의컬럼 (status) 으로관리하도록변경하였습니다. 이를통해 document 클래스의코드가독성을높였으며확장성있는구조로변경되었습니다. 따라서기존에사용하던테이블컬럼들을삭제하고새로운 status 컬럼을추가해야하는작업이필요하였습니다. 개선이후테이블의기존컬럼을 삭제하거나새로운컬럼을추가할경우간혹게시물이많거나 DB 성능으로인하여테이블변경업데이트를모두완료하지못하고종료되는현상을 일부발견하였습니다. 이렇게테이블이정상적으로업데이트되지못한경우특정컬럼을읽을수없다는오류가발생할수있습니다. Unknown column public in field list 이경우수동으로 DB 업데이트를실시하여야합니다. 이가이드에서는웹어드민을이용하는방법과콘솔을이용하는방법을모두안내합니다. 하지만 DB 내용이많을경우웹어드민을이용하기보다는콘솔을이용하시길권장합니다. 웹어드민의경우업데이트실행도중실행시간제한에 의해예상하지못한결과를일으킬수도있습니다. DB 백업 아래가이드를따라하기전 3.2. DB 백업을참고하여 DB 백업을하시기바랍니다. A. documents 테이블의구조확인콘솔의경우 : ssh를통해접속한후아래명령을통해 mysql에접속합니다. $ mysql -udb 계정명 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 56182 Server version: 5.1.39-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SSH 접속은어떻게하나요? SSH 접속방법은사용하시는호스팅업체의 FAQ 혹은 1 대 1 문의를통해확인할수있습니다. 제호스팅은 SSH 가지원되지않아요. 웹어드민을이용하는경우의가이드를따라하세요. 비밀번호입력후위와같이 mysql 프롬프트가나타나면아래명령으로 DB 를선택해줍니다. mysql> use XE 설치 DB 명 Database changed 이제 desc 를이용하여 document 테이블의구조를확인합니다 ( 테이블접두어 xe_ 는각사이트의설정에맞게변경하세요 ). mysql> desc xe_documents; 11 / 27
DB 계정명, XE 설치 DB 및테이블접두어를모르겠어요. XE_ 설치 _ 디렉터리 /files/config/db.config.php 파일을통해 DB 계정명, XE 설치 DB 를확인할수있습니다. 변수명 $db_info->db_userid $db_info->db_password $db_info->db_database $db_info->db_table_prefix 의미 DB 계정명 DB 계정비밀번호 XE 설치 DB 테이블접두어 XE 1.4 documents 테이블구조 +-----------------+--------------+------+-----+---------+-------+ Field Type Null Key Default Extra +-----------------+--------------+------+-----+---------+-------+ document_srl bigint(11) NO PRI NULL module_srl bigint(11) NO MUL NULL category_srl bigint(11) NO MUL NULL lang_code varchar(10) NO NULL is_notice char(1) NO MUL N is_secret char(1) NO MUL N title varchar(250) YES NULL title_bold char(1) NO N title_color varchar(7) YES NULL content longtext NO NULL readed_count bigint(11) NO MUL NULL voted_count bigint(11) NO MUL NULL blamed_count bigint(11) NO MUL NULL comment_count bigint(11) NO MUL NULL trackback_count bigint(11) NO MUL NULL uploaded_count bigint(11) NO MUL NULL password varchar(60) YES NULL user_id varchar(80) YES NULL user_name varchar(80) NO NULL nick_name varchar(80) NO NULL member_srl bigint(11) NO MUL NULL email_address varchar(250) NO NULL homepage varchar(250) NO NULL tags text YES NULL extra_vars text YES NULL regdate varchar(14) YES MUL NULL last_update varchar(14) YES MUL NULL last_updater varchar(80) YES NULL ipaddress varchar(128) NO MUL NULL list_order bigint(11) NO MUL NULL update_order bigint(11) NO MUL NULL allow_comment char(1) NO Y lock_comment char(1) NO N allow_trackback char(1) NO Y notify_message char(1) NO N +-----------------+--------------+------+-----+---------+-------+ 12 / 27
XE 1.5 documents 테이블구조 +-----------------+--------------+------+-----+---------+-------+ Field Type Null Key Default Extra +-----------------+--------------+------+-----+---------+-------+ document_srl bigint(11) NO PRI NULL module_srl bigint(11) NO MUL 0 category_srl bigint(11) NO MUL 0 lang_code varchar(10) NO is_notice char(1) NO MUL N title varchar(250) YES NULL title_bold char(1) NO N title_color varchar(7) YES NULL content longtext NO NULL readed_count bigint(11) NO MUL 0 voted_count bigint(11) NO MUL 0 blamed_count bigint(11) NO MUL 0 comment_count bigint(11) NO MUL 0 trackback_count bigint(11) NO MUL 0 uploaded_count bigint(11) NO MUL 0 password varchar(60) YES NULL user_id varchar(80) YES NULL user_name varchar(80) NO NULL nick_name varchar(80) NO NULL member_srl bigint(11) NO MUL NULL email_address varchar(250) NO NULL homepage varchar(250) NO NULL tags text YES NULL extra_vars text YES NULL regdate varchar(14) YES MUL NULL last_update varchar(14) YES MUL NULL last_updater varchar(80) YES NULL ipaddress varchar(128) NO MUL NULL list_order bigint(11) NO MUL NULL update_order bigint(11) NO MUL NULL allow_trackback char(1) NO Y notify_message char(1) NO N status varchar(20) YES PUBLIC comment_status varchar(20) YES ALLOW +-----------------+--------------+------+-----+---------+-------+ 13 / 27
다음명령으로테이블의인덱스도확인합니다. mysql> show index from xe_documents; XE 1.4 document 테이블의인덱스 +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ xe_documents 0 PRIMARY 1 document_srl A 4 NULL NULL BTREE xe_documents 1 idx_module_srl 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_category_srl 1 category_srl A NULL NULL NULL BTREE xe_documents 1 idx_is_notice 1 is_notice A NULL NULL NULL BTREE xe_documents 1 idx_is_secret 1 is_secret A NULL NULL NULL BTREE xe_documents 1 idx_readed_count 1 readed_count A NULL NULL NULL BTREE xe_documents 1 idx_voted_count 1 voted_count A NULL NULL NULL BTREE xe_documents 1 idx_blamed_count 1 blamed_count A NULL NULL NULL BTREE xe_documents 1 idx_comment_count 1 comment_count A NULL NULL NULL BTREE xe_documents 1 idx_trackback_count 1 trackback_count A NULL NULL NULL BTREE xe_documents 1 idx_uploaded_count 1 uploaded_count A NULL NULL NULL BTREE xe_documents 1 idx_member_srl 1 member_srl A NULL NULL NULL BTREE xe_documents 1 idx_regdate 1 regdate A NULL NULL NULL YES BTREE xe_documents 1 idx_last_update 1 last_update A NULL NULL NULL YES BTREE xe_documents 1 idx_ipaddress 1 ipaddress A NULL NULL NULL BTREE xe_documents 1 idx_list_order 1 list_order A NULL NULL NULL BTREE xe_documents 1 idx_update_order 1 update_order A NULL NULL NULL BTREE xe_documents 1 idx_module_list_order 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_list_order 2 list_order A NULL NULL NULL BTREE xe_documents 1 idx_module_update_order 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_update_order 2 update_order A NULL NULL NULL BTREE xe_documents 1 idx_module_readed_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_readed_count 2 readed_count A NULL NULL NULL BTREE xe_documents 1 idx_module_voted_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_voted_count 2 voted_count A NULL NULL NULL BTREE xe_documents 1 idx_module_notice 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_notice 2 is_notice A NULL NULL NULL BTREE xe_documents 1 idx_module_document_srl 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_document_srl 2 document_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_blamed_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_blamed_count 2 blamed_count A NULL NULL NULL BTREE +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ 14 / 27
XE 1.5 document 테이블의인덱스 +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ xe_documents 0 PRIMARY 1 document_srl A 927 NULL NULL BTREE xe_documents 1 idx_module_srl 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_category_srl 1 category_srl A NULL NULL NULL BTREE xe_documents 1 idx_is_notice 1 is_notice A NULL NULL NULL BTREE xe_documents 1 idx_readed_count 1 readed_count A NULL NULL NULL BTREE xe_documents 1 idx_voted_count 1 voted_count A NULL NULL NULL BTREE xe_documents 1 idx_blamed_count 1 blamed_count A NULL NULL NULL BTREE xe_documents 1 idx_comment_count 1 comment_count A NULL NULL NULL BTREE xe_documents 1 idx_trackback_count 1 trackback_count A NULL NULL NULL BTREE xe_documents 1 idx_uploaded_count 1 uploaded_count A NULL NULL NULL BTREE xe_documents 1 idx_member_srl 1 member_srl A NULL NULL NULL BTREE xe_documents 1 idx_regdate 1 regdate A NULL NULL NULL YES BTREE xe_documents 1 idx_last_update 1 last_update A NULL NULL NULL YES BTREE xe_documents 1 idx_ipaddress 1 ipaddress A NULL NULL NULL BTREE xe_documents 1 idx_list_order 1 list_order A NULL NULL NULL BTREE xe_documents 1 idx_update_order 1 update_order A NULL NULL NULL BTREE xe_documents 1 idx_module_list_order 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_list_order 2 list_order A NULL NULL NULL BTREE xe_documents 1 idx_module_update_order 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_update_order 2 update_order A NULL NULL NULL BTREE xe_documents 1 idx_module_readed_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_readed_count 2 readed_count A NULL NULL NULL BTREE xe_documents 1 idx_module_voted_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_voted_count 2 voted_count A NULL NULL NULL BTREE xe_documents 1 idx_module_notice 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_notice 2 is_notice A NULL NULL NULL BTREE xe_documents 1 idx_module_document_srl 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_document_srl 2 document_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_blamed_count 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_blamed_count 2 blamed_count A NULL NULL NULL BTREE xe_documents 1 idx_module_status 1 module_srl A NULL NULL NULL BTREE xe_documents 1 idx_module_status 2 status A NULL NULL NULL YES BTREE +--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ 15 / 27
웹어드민의경우 : 웹어드민주소로접속한후 DB 계정명과비밀번호를입력하고로그인합니다. 웹어드민접속은어떻게하나요? 웹어드민접속방법은사용하시는호스팅업체의 FAQ 혹은 1 대 1 문의를통해확인할수있습니다. 로그인후왼쪽의 DB 선택에서 DB 가설치된 DB 를선택하세요 ( 웹어드민버전에따라화면구성이다를수있습니다 ). DB 선택후다시왼쪽의테이블목록에서 xe_documents 를클릭합니다. 16 / 27
테이블을클릭하면오른쪽에테이블의구조가나타납니다. 테이블의데이터가나올경우상단의 [ 구조 ] 를클릭하세요. XE 1.4 documents 테이블구조 17 / 27
XE 1.5 documents 테이블구조 18 / 27
테이블구조화면의하단의인덱스도확인을합니다. XE 1.4 documents 테이블인덱스 19 / 27
XE 1.5 documents 테이블인덱스 20 / 27
위와같이 documents 테이블의구조와인덱스를확인했을때아래의경우중하나라도해당이된다면 documents 테이블에대한업데이트도중 문제가발생한경우입니다. status 컬럼이없다. is_secret 컬럼이남아있다. allow_comment 컬럼이남아있다. lock_comment 컬럼이남아있다. comment_status 컬럼이없다. idx_module_status 인덱스가없다. B. status 컬럼추가 documents 테이블에 status 컬럼이없을경우추가를합니다. 콘솔의경우 : mysql> ALTER TABLE xe_documents ADD COLUMN `status` VARCHAR(20) DEFAULT 'PUBLIC'; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : documents 테이블의컬럼과인덱스사이의 Add field 의 [ 실행 ] 을클릭합니다. 아래와같이입력하고 [ 저장 ] 을클릭합니다. 21 / 27
C. 기존 is_secret 컬럼의값을 status 로이동 status 컬럼이생성이되었지만아직 is_secret 컬럼이남아있는경우라면 is_secret 의내용을 status 로옮겨줍니다. 콘솔의경우 : mysql> UPDATE xe_documents SET status='secret' WHERE is_secret='y'; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : 상단의 [SQL] 을클릭한후위 SQL 문을직접실행시켜줍니다. D. is_secret 컬럼삭제 is_secret 컬럼의내용을 status 로잘옮겼다면이제 is_secret 컬럼을삭제합니다. 콘솔의경우 : mysql> ALTER TABLE xe_documents DROP COLUMN `is_secret`; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : is_secret 의 X 아이콘을클릭합니다. 22 / 27
E. comment_status 컬럼추가 documents 테이블에 comment_status 컬럼이없을경우추가를합니다. 콘솔의경우 : mysql> ALTER TABLE xe_documents ADD COLUMN `comment_status` VARCHAR(20) DEFAULT 'ALLOW'; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : documents 테이블의컬럼과인덱스사이의 Add field 의 [ 실행 ] 을클릭합니다. 아래와같이입력하고 [ 저장 ] 을클릭합니다. F. 기존 allow_comment, lock_comment 컬럼의값을 comment_status 로이동 comment_status 컬럼이생성이되었지만아직 allow_comment, lock_comment 컬럼이남아있는경우라면각컬럼의내용을 comment_status 로옮겨줍니다. 콘솔의경우 : mysql> UPDATE xe_documents SET status='deny' WHERE allow_comment='y' AND lock_comment='y'; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 mysql> UPDATE xe_documents SET status='deny' WHERE allow_comment='n'; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : 상단의 [SQL] 을클릭한후위 SQL 문을직접실행시켜줍니다. 23 / 27
G. allow_comment, lock_comment 컬럼삭제 allow_comment, lock_comment 컬럼의내용을 comment_status 로잘옮겼다면이제각컬럼을삭제합니다. 콘솔의경우 : mysql> ALTER TABLE xe_documents DROP COLUMN `allow_comment`; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 mysql> ALTER TABLE xe_documents DROP COLUMN `lock_comment`; Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : allow_comment, lock_comment 의 X 아이콘을클릭합니다. H. idx_module_status 인덱스생성 idx_module_status 인덱스가생성되지않았다면생성합니다. 콘솔의경우 : mysql> ALTER TABLE xe_documents ADD INDEX `idx_module_status` (module_srl, status); Query OK, XXX rows affected (X.XX sec) Records: XXX Duplicates: 0 Warnings: 0 웹어드민의경우 : documents 테이블구조화면의하단에입력칸에 '2' 를입력하고 [ 실행 ] 을클릭합니다. 아래와같이입력한후 [ 저장 ] 을클릭합니다. 24 / 27
I. 확인 모두완료한후아래의조건을모두만족한다면올바르게변경이된것입니다. status 컬럼이있다. is_secret 컬럼이없다. allow_comment 컬럼이없다. lock_comment 컬럼이없다. comment_status 컬럼이있다. idx_module_status 인덱스가있다. 위과정이너무어렵습니다. 위과정을따라하기어려울경우 http://www.xpressengine.com/index.php?&mid=download&package_srl=20351581 의툴을사용할수 있습니다. 다만, 이툴의사용이위과정을완벽하게수행한다고보장하지않습니다. 25 / 27
8.5. 로그인 / 회원가입이되지않는다. XE 1.4 버전에서는회원아이디를로그인계정으로사용하였습니다. 하지만이는혹있을지모르는개인정보유출에피해를크게줄수있어 XE 기존로그인방식은회원아이디또는이메일을선택하여운영하도록기능이개선되었습니다. 이와더불어회원가입양식도이전버전보다훨씬유연하게관리할수있도록개선하였습니다. 그리고이번 XE 1.5에추가된룰셋기능을로그인 / 회원가입에적용하여속성유효성검사를철저하게할수있도록개선하였습니다. 관리자화면로그인이되지않는다면 files/ruleset 디렉터리에 login.xml 파일이생성되어있는지확인합니다. 생성되어있지않다면아래와같이 생성합니다. <?xml version="1.0" encoding="utf-8"?> <ruleset version="1.5.0"> <customrules></customrules> <fields> <field name="user_id" required="true" rule="userid"/> <field name="password" required="true" /> </fields> </ruleset> 이렇게한후에도로그인이되지않는다면아래와같이변경후이메일로로그인을시도해봅니다. <?xml version="1.0" encoding="utf-8"?> <ruleset version="1.5.0"> <customrules></customrules> <fields> <field name="user_id" required="true" rule="email"/> <field name="password" required="true" /> </fields> </ruleset> 한편기본회원스킨을사용하지않고별도의스킨을사용중이라면현재사용중인스킨을 XE 1.5 에맞게변경하여야합니다. http://code.google.com/p/xe-core/wiki/memberskinguide 를참고하여스킨을수정하거나스킨제작자에게요청하시기바랍니다. 26 / 27
8.6. Fatal error: Call to undefined method Object::executeQuery()... 오류가발생한다. 속도개선과새로운서브쿼리기능추가를위하여 XE 1.5에서 DB class들을전반적으로개선하였습니다. 또한 DB 효율성을높이기위하여 DB master/slave 기능을추가하여좀더디테일한 DB 설정도가능하게되었습니다. 이런기능변화로인해 files/config/db.config.php 구조와나용또한변경되었습니다. 허나, XE 버전업데이트중알수없는오류로인하여해당파일을업데이트하지못하는경우가발생하였습니다. 위와같은에러가발생한경우 files/config/db.config.php ㄴ파일을무조건삭제하지마시고아래의구조로변경하여주시기바랍니다. 특히, db_tabe_prefix 에기존 xe에서 xe_ 로언더바까지포함되는것에주의해주세요. XE 1.4 형식 <?php if(!defined(" ZBXE ")) exit(); $db_info->db_type = 'mysql'; $db_info->db_port = '3306'; $db_info->db_hostname = 'localhost'; $db_info->db_userid = 'DB 계정 '; $db_info->db_password = 'DB 계정비밀번호 '; $db_info->db_database = 'DB 이름 '; $db_info->db_table_prefix = 'xe'; $db_info->time_zone = '+0900'; $db_info->use_rewrite = 'Y'; $db_info->default_url = 'XE 설치 URL(http:// 포함 )';?> XE 1.5 형식 <?php if(!defined(" ZBXE ")) exit(); $db_info->master_db = array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_password' => 'DB 계정비밀번호 ','db_database' => 'DB 이름 ','db_userid' => 'DB 계정 ','db_table_prefix' => 'xe_'); $db_info->slave_db = array(array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_password' => 'DB 계정비밀번호 ','db_database' => 'DB 이름 ','db_userid' => 'DB 계정 ','db_table_prefix' => 'xe_')); $db_info->time_zone = '+0900'; $db_info->use_rewrite = 'Y'; $db_info->default_url = 'XE 설치 URL(http:// 포함 )';?> 27 / 27