윈도우즈와 python2.5 에서 할려니까 많은 제약 사항이 있었다. 리눅스의 경우, 이미 나와 있는 문서들만으로 가능할거라고 생각한다.

 설치환경은 windows xp + sp2 와 python2.5 에서 실험했다.

 아파치 설치는 이 블로그에 설치하는 법을 적어 놓았다. 그대로 따라 하면 될 것이다. 그리고 Django 의 경우 http://www.python.or.kr/pykug/Django 을 읽어보기 바란다. 내가 조금 고쳐났다. 여기 있는 파일을 그냥 이용하면 된다.

 Django 는 manage.py runserver 라는 명령과 옵션을 통해 테스트 환경을 제공한다. http://www.djangoproject.com/documentation/ 여기에 따르면 이것은 성능이 낮기 때문에 그냥 테스트용으로 사용하라고 한다. 실질적으로 사용하려면 mod_python 을 사용해야 한다.  

 mod_python ( http://www.modpython.org/ )이란 아파치에서 파이썬을 이용할 수 있는 많은 방법을 제공하는 툴(?)이다. 보통 이 사이트에서 구할 수 있으나 python2.5 와 윈도우즈를 사용 한다면 http://nicolas.lehuen.com/download/mod_python/ 에서 자기 버전에 맞는 것을 구하기 바란다. (이것때문에 고생을 많이했다. ) (Visaul Stdio 7.0 버전이 있다면 mod_python 싸이트에서 유닉스 소스를 다운받아 컴파일 할 수 있다.  dist 폴더를 이용하면 가능하다. 여기서 제공하는 파일도 그렇게 만들었을 것이다.)
  

 mod_python 설정법은 그 사이트 Manual 을 따라하면 된다. 어려운 편이 아니다. 내경우 http.conf 파일을 다음과 같이 수정했다. 
LoadModule python_module "C:/tools/apm/apache/modules/mod_python.so"

# 디렉토리 설정
UserDir "C:/tools/apm/www/*"
<Directory "C:/tools/apm/www/test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
</Directory>

주의 할 점은 Directory 에 * 가 들어가지 않고 정확한 경로를 표시해야 한다. 이것때문에 헤멨다. 자주 이야기 하지만 저 상태로 실제로 서비스 하기에는 문제가 있을 것 같다. 너무 공개한 것 같다. 여기에 접근하기 위해서는 http://localhost:8080/~test/mptest.py 로 접근하면 된다. UserDir 을 사용하니까 조금 복잡해 보이는데 다른 디렉토리를 참조하려면 이와 유사하게 디렉토리를 정해 주면 된다. 그리고 지정한 디렉토리에 mptest.py 파일을 저장해야 한다.

----------- mptest.py ------------------
from mod_python import apache
def handler(req):
req.content_type = 'text/plain'
req.write("Hello World!")
return apache.OK
----------------------------------------- 
  세심히 봐야 할 것은 설정부분의 PythonHandler mptest 라는 부분이다. 파일 하나 추가해줄 때마다 PythonHandler 파일이름 을 해주어야 한다. 이 방법이 가장 빠른 방법으로 mod_python 을 사용하는 방법이다.  

 mod_python 에서는 여러가지 방법으로 파이썬을 사용하는 방법을 제공하고 있다. 그 기능을 더 이용해서 Django 에서도 사용가능하다고 생각하면 쉬울 것 같다. 이게 Django 을 설정하자. http.conf 에서 다음과 같이 하면된다.
-------------------------------
<Location "/mysite/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['C:/tools/Python/work'] + sys.path"
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonDebug On

</Location>
--------------------------------
Location 을 이용했다. 이 것은 url 주소를 http://localhost:8080/mysite/ 와 같이 작동할 때 이용하겠다고 설정하는 것이다. 내 경우 C:\tools\Python\work 폴더에 mysite 라는 폴더가 있고 이 안에 Django 를 통해 만든 파일들이 있다. 

 당연한 말이지만 이게 작동하려면 아파치기 작동한 상태이고 http://www.djangoproject.com/documentation/ 을 보면서 mysite 라는 폴더를 C:\tools\Python\work 밑에 만들어 둘 때이다. 당연히 documentation 보면서 따라하지 않았다면 안 되는게 당연하다.
MySQL 4.1 이상부터 인코딩 방법이 크게 달라진것 같다. 내가 사용하는 방법은 MySQL5.1.x 에서 실험한 방법이다. 이 방법은 아직 실험이 더 필요한 것 같다. 내 실력이 안 좋아, 정확한 방법을 찾을 수 없다. 여기 있는 내용은 http://dev.mysql.com/doc/refman/5.1/en/index.html 을 참조했다. 이중 10장 Chapter 10. Character Set Support 이 필요한다.

MySQL5 에서는 인코딩할 수 있는 다양한 방법을 제공한다. 서버수준, Database 수준, 테이블 수준, 컬럼 수준에서 인코딩을 지정할 수 있다. 서버수준은 my.ini 파일로 수정하거나 서버를 시작할 때 옵션으로 설정하는 것 같고, 나머지 수준은 인코딩방법을 그 디비, 테이블, 컬럼을 정의할 때 설정한다.
서버를 시작할 때, mysqld --character-set-server=latin1 이런 식으로 캐릭터 세팅을 할 수 있다. 우리에게는 latin1 대신 euckr(또는 cp949)과 utf8 사이에서 왔다 갔다 할 일이 많을 것이다. 나머지 에서는 CHARACTER SET charset_name 과 COLLATE collation_name 으로 적정히 사용한다.
데이터베이스 수준에서는
--------------------------------------------
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
---------------------------------------------
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
---------------------------------------------
을 적정히 사용한다. 그냥 Database 를 만들거 변경하게 된다면 default 값이 적용되고 이 값은 서버세팅의 값을 갖게 된다.
나머지 수준에서도 이런 식이다.

테이블 수준의 세팅
-------------------------------------------------
CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
-------------------------------------------------
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
-------------------------------------------------

컴럼수준
-------------------------------------------------------
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name] [COLLATE collation_name]
-------------------------------------------------------

예제로
--------------------------------------
CREATE TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);
-----------------------------------
이런 식으로 사용한다.


이제 우리가 궁금한 것은 CHARACTER 과 COLLATE 의 쓰임새와 사용가능한 것이다. CHARACTER 은 인코딩 방법을 지정하는 것이고 collate 는 정렬 방식이나 검색 방식을 말한다.
CHARACTER 은 우리에게 필요할 만 한 것이 utf8 과 euckr 이 있다. CHARACTER 을 utf8 로 지정할 때 사용가능한 COLLATE 은 엄청많으나 우리에게 유용할 것 같은것은 utf8_general_ci 와 utf8_bin 이다. euckr 로 지정할 경우는 euckr_korean_ci 와 euckr_bin 이 있다. bin 이 있고 없고의 차이는 나중에 검색할 때, 숫자그대로 검색할 것이냐(A와 a 는 코드로 비교하면 다른 것이다. ) 문자로 검색(a 와 A 는 문자로 같다. ) 의 차이나고 한다. 당연히 bin 이 숫자 그대로 검색하는 것으로 보인다. (검색 할 때는 이 옵션을 줄 수 있으니 이것보다 정렬에 의한 문제가 더 큰 것 같다. )
내가 이런 코드 들이 있다는 것을 알고 있는 이유는 MySQL GUI Tools 이용하기 때문이다. 이게 설정 방법을 편하게 해준다.

다시 살펴보면 테이블 수준으로 지정하는 것이 좋아 보인다. 이제는 utf8 이 대세라, 서버에서 utf8 로 설정해야 할 것 같다. MySQL Server Instance Config Wizard 가 서버 수준의 세팅을 돕는 것으로 판단된다. (내 능력이 부족해 확신 할 수 없다.)



PHP 와 MySQL 이 쿼리를 주고 받기 위해서는 mysql_query("set names CHARACTER "); 을 연결한 다음에 보내 주어야 한다.


PHP에서 MySQL4.1 이상 버전으로 한글이 들어간 쿼리문을 날리기 위해서는 2가지 방법이 있다.

테이블에서 euckr 으로 설정했을 때 다음과 같이 하면 된다.
------------------------------------------
mysql_query("set names euckr ");
$sql = 'insert into bbs_euckr value(2, "이름", "제목", "내용")';
mysql_query($sql) or die (mysql_error());
------------------------------------------

핵심부분은 mysql_query("set names euckr "); 를 날려야 한다.
PHP에서 mysql 과 연결할 때, 기본 인코딩 방식이 있다. 이를 바꾸기 위해 이 쿼리가 들어간다.

테이블에서 utf-8 로 설정했을 때는 다음과 같이 쿼리를 보내면된다.
-------------------------------------------
mysql_query("set names utf8");
echo $sql = 'insert into bbs_utf8 value(2, "이름", "제목", "내용")';
echo $sql = iconv("cp949", "utf-8", $sql);
mysql_query($sql) or die (mysql_error());
---------------------------------------------
이 방법은 인코딩을 내가 입력한 글자 인코딩을 euc-kr 에서 utf-8 로 바꾸는 코드가 들어가 있다.
echo $sql = iconv("cp949", "utf-8", $sql); 이 부분이다.


맨 처음 mysql_query("set names utf8"); 는 어떻게 알아 먹는지 신기하지 않는가. 결국, utf-8 이나 아스키 방식이나 영어는 문제되지 않는 다는 것이다. 결과 적으로 한글을 사용하는 사람들이 고통이라는 것이다. 이런.. utf-16으로 넘어 가면 어떻게 될려나.

아직 이게 정확히 작동하는지 확신이 들지 않는다. MySQL 안에 있는 데이터가 euckr 로 들어 있는지 모르겠다. 특 이한 문자에 대해 정렬을 해 보면 알 수 있을 것 같은데.
(계속 수정 중.
언제 수정이 끝나려나. 컴퓨터의 세계는 정말 미묘하다. )
앞에서 PHP 작동을 확인하는  phpinfo.php 은 실제 아파치로 서버를 돌리는 사람에게서는 이 파일을 남겨 놓으면 좋지 않다고 한다. 해킹할 수 있는 정보를 주는 것이나 마찬가지라고 한다.


그 전에 만들었던 phpinfo.php 파일은 Apache2htdocs 폴더에 넣어야 했다. 그러나 진짜 웹서비스를 제공하는 업체처럼 사용자를 만들고 그 사용자가 사용자 나름대로의 공간을 제공해 주고 싶을 때가 있다. 예를 들어

http://localhost/~test/index.html 처럼 해주고 싶을 때가 있다. 그럴 때는 다시 Apache2conf 안의 httpd.conf 파일을 바뀌어 준다.
맨 밑에 다음을 적어준다.
--------------------------------
UserDir "C:/tools/apm/www/*"

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

---------------------------------
라고 적어준다. 이러면 www 폴더밑에 임의의 사용자(* 가 임의의 문자를 의미한다는 것은 알고있겠지.) 가 사용할 수 있게된다. 물론 임의의 사용자 id 는 그 폴더이름을 가져야 한다.

그리고 test 라는 폴더를 만들고 그 밑에 index.html 파일을 만든다. 이제 웹 브라우저에서

http://localhost/~test/index.html 라고 하면 그 파일이 보인다.

저 설정은 그 파일 중간에 있는 DocumentRoot "C:/tools/apm/apache/htdocs" 와

Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Satisfy all

을 따라한 것이다. 그러니까 너무 많은 권한을 준것이다. 실질적으로는 진자 운영할 생각이면 저렇게 하면 안된다. 그리고 더 정확히 하려면 C:\tools\apm\apache\conf\extra\httpd-userdir.conf 의 파일을 이용해야 한다. 아직은 그 정도는 아니고 연습단계이니 별 문제 없겠지.