Blog

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 계정명
$db_info->db_password DB 계정 비밀번호
$db_info->db_database XE 설치 DB

4. XE 소스 업데이트

백업이 완료되면 XE의 소스를 업데이트합니다. 쉬운 설치, FTP, SVN 세가지 방식 중 본인에게 맞는 방식을 선택하여 업데이트합니다.

4.1. 쉬운 설치를 통한 업데이트

XE 관리자 화면으로 접속한 후 쉬운 설치에서 XE core를 업데이트합니다.

상단의 [!쉬운 설치]를 클릭한 후 왼쪽 카테고리에서 [!XE core]를 클릭하고 XE core의 [!업데이트] 버튼을 클릭합니다.

다음 화면에서 FTP 비밀번호를 입력한 후 [!업데이트] 버튼을 클릭하면 업데이트가 이루어 집니다.

쉬운 설치 설정은 어떻게 하나요?
쉬운 설치 설정 방법은 XE 사용자 매뉴얼 4.2.2 쉬운 설치로 추가 기능 설치를 참고하세요.

4.2. FTP 프로그램을 통한 업데이트

XE 공식사이트에서 [!다운로드]를 클릭한 후 왼쪽의 카테고리에서 [!XE core]를 클릭하고 목록에서 XE core를 클릭합니다.

[!다운로드]를 클릭하여 파일을 다운로드 받습니다.

다운받은 압축파일을 적당한 곳에 풀어줍니다.

FTP 프로그램을 실행하여 FTP로 접속한 후 파일을 업로드합니다.

업로드 완료 후에는 항상 전송 실패한 파일은 없는지 확인합니다.

FTP 접속 방법을 모르겠어요
FTP 접속 방법은 사용하시는 호스팅 업체의 FAQ 혹은 1대1 문의를 통해 확인할 수 있습니다.

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. 모듈 테이블 생성/업데이트

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. 작동 확인

업데이트 후 작동에 문제가 없는지 확인합니다.

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>

이와 같이 수정을 하기 위해서는 어느 파일에 오류가 있는지 알아내야 합니다. 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.2. 템플릿 파일을 찾을 수 없다고 나온다.

템플릿 엔진 개선으로 인해 여러 파일을 include하는 스킨의 경우 아래와 같은 템플릿 파일을 찾을 수 없다는 에러가 발생할 수 있습니다.

Err : './modules/module_name/skins/skin_name/template.html' template file does not exists.

기존의 템플릿 엔진은 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 위치를 다시 작성해 줍니다.

8.3. 화면이 깨진다/스크립트 오류가 발생한다..

앞서 살펴본 템플릿 엔진의 경로 계산 방식 변경으로 인하여 스킨이나 레이아웃의 CSS/JS 파일 경로가 올바르지 않아 화면이 깨질 수 있습니다.

해당 페이지의 소스보기를 통해 CSS/JS 파일의 경로를 확인하여 올바른 경로로 나왔는지 확인해 올바르게 수정하기 바랍니다.

자세한 내용은 8.2. 템플릿 파일을 찾을 수 없다고 나온다.를 참고 바랍니다.

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;

DB 계정명, XE 설치 DB및 테이블 접두어를 모르겠어요.
XE_설치_디렉터리/files/config/db.config.php 파일을 통해 DB 계정명, XE 설치 DB를 확인할 수 있습니다.
변수명 의미
$db_info->db_userid DB 계정명
$db_info->db_password DB 계정 비밀번호
$db_info->db_database XE 설치 DB
$db_info->db_table_prefix 테이블 접두어

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       |       |

+-----------------+--------------+------+-----+---------+-------+

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   |       |

+-----------------+--------------+------+-----+---------+-------+

다음 명령으로 테이블의 인덱스도 확인합니다.

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      |         |

+--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+

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      |         |

+--------------+------------+-------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+

웹 어드민의 경우:

웹 어드민 주소로 접속한 후 DB계정명과 비밀번호를 입력하고 로그인합니다.

웹 어드민 접속은 어떻게 하나요?
웹 어드민 접속 방법은 사용하시는 호스팅 업체의 FAQ 혹은 1대1 문의를 통해 확인할 수 있습니다.

로그인 후 왼쪽의 DB 선택에서 DB가 설치된 DB를 선택하세요(웹 어드민 버전에 따라 화면 구성이 다를 수 있습니다).

DB 선택 후 다시 왼쪽의 테이블 목록에서 xe_documents를 클릭합니다.

테이블을 클릭하면 오른쪽에 테이블의 구조가 나타납니다. 테이블의 데이터가 나올 경우 상단의 [!구조]를 클릭하세요.

XE 1.4 documents 테이블 구조

XE 1.5 documents 테이블 구조

테이블 구조 화면의 하단의 인덱스도 확인을 합니다.

XE 1.4 documents 테이블 인덱스

XE 1.5 documents 테이블 인덱스

위와 같이 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의 [!실행]을 클릭합니다.

아래와 같이 입력하고 [!저장]을 클릭합니다.

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 아이콘을 클릭합니다.

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문을 직접 실행시켜 줍니다.

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'를 입력하고 [!실행]을 클릭합니다.

아래와 같이 입력한 후 [!저장]을 클릭합니다.

I. 확인

모두 완료한 후 아래의 조건을 모두 만족한다면 올바르게 변경이 된 것입니다.

  • status 컬럼이 있다.
  • is_secret 컬럼이 없다.
  • allow_comment 컬럼이 없다.
  • lock_comment 컬럼이 없다.
  • comment_status 컬럼이 있다.
  • idx_module_status 인덱스가 있다.
위 과정이 너무 어렵습니다.
위 과정을 따라하기 어려울 경우 http://www.xpressengine.com/index.php?&mid=download&package_srl=20351581의 툴을 사용할 수 있습니다. 다만, 이 툴의 사용이 위 과정을 완벽하게 수행한다고 보장하지 않습니다.

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를 참고하여 스킨을 수정하거나 스킨 제작자에게 요청하시기 바랍니다.

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://포함)';

?>

태그 연관 글
  1. [2019/10/22] Blog [보안패치] XE 1.11.6 버전 배포 안내 by XE *2
  2. [2019/08/02] 포럼 Which One is Better Mysql or MariaDB? by Adi *2
  3. [2019/04/02] Blog [보안패치] XE 1.11.5 버전 배포 안내 by XE *6
  4. [2019/03/26] Blog [보안패치] XE 1.11.4 버전 배포 안내 by XE
  5. [2019/03/25] Blog [보안패치] XE 1.11.3 버전 배포 안내 by XE *2