데비안식 Apache2 + Tomcat5 + PHP4 + MySQL4

추가해야 할 소스 리스트 :
 deb ftp://metalab.unc.edu/pub/linux/devel/lang/java/blackdown.org/debian sid main non-free
설치해야 할 패키지 : libapache2-mod-jk2, libapache2-mod-php4(?), libmysqlclient10, libmysqlclient12, mysql-client, mysql-common, mysql-server, php4-mysql, j2se-common

사용상 주의사항

  • Tomcat 4 이후에서는 모든 클래스는 패키지 컴파일이 필요함(Java Bean의 경우)

LBBOTP를 위한 설정

MySQL UTF-8

이 모든 것을 변경하지 않은 채 기본 charset인 latin1으로 사용하려면 모든 DB 커넥션(읽기, 쓰기)에 다음과 같은 식으로 써야 한다.
<%= new String(board.getName().getBytes("ISO8859-1"),"UTF-8") %>

셸 상에서 mysql utf8을 테스트 하기 전에, 다음 사항을 확인한다.
debian:~# echo $LANG
ko_KR.UTF-8
debian:~# more .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
...
export LANG=ko_KR.UTF-8
...

# vi /etc/mysql/my.cnf
mysqld_safe mysqld mysql 아래에 다음 행 추가
default-character-set=utf8
# mysql -p
status 명령으로 다음 내용들을 확인한다 :
mysql> status;
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
안심하긴 이르다. 특정 환경(ex: Eclipse의 SQL Explorer나 한글 미설정 환경의 터미널)에서 생성한 테이블의 경우 DB설정값을 따르지 않고 자체적인 설정 값을 가질 수 있기 때문이다. 이는 다음 명령으로 확인해 본다.
mysql> use [DB_NAME];
mysql> show table status;
+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| Name              | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment |
+-------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| bbs_articles      | MyISAM |       9 | Dynamic    |    0 |              0 |           0 |      4294967295 | 1024 |         0 |              1 | 2004-12-05 00:17:09 | 2004-12-05 00:17:09 | NULL       | latin1_swedish_ci |     NULL |                |         |
| bbs_boards        | MyISAM |       9 | Dynamic    |    0 |              0 |           0 |      4294967295 | 1024 |         0 |              1 | 2004-12-05 00:21:25 | 2004-12-05 00:21:25 | NULL       | latin1_swedish_ci |     NULL |                |         |
| bbs_poa           | MyISAM |       7 | Dynamic    |   63 |             81 |        5128 |      4294967295 | 2048 |         0 |             83 | 2004-06-19 22:08:21 | 2004-06-19 22:08:21 | NULL       | utf8_general_ci   |     NULL |                |         |
| bbs_poa2          | MyISAM |       7 | Dynamic    |    9 |             92 |         836 |      4294967295 | 2048 |         0 |             10 | 2004-06-19 22:08:21 | 2004-12-04 15:35:22 | NULL       | utf8_general_ci   |     NULL |                |         |
...
두 테이블이 설정값을 따르지 않고 자체 collation을 가지고 있음을 알 수 있다. 이를 다음과 같이 변경한다.
자세한 내용은 [http]MySQL Manual | 10.3.3 Table Character Set and Collation 참고

mysql> alter table bbs_boards DEFAULT CHARACTER SET utf8;
Query OK, 16 rows affected (0.08 sec)
Records: 16  Duplicates: 0  Warnings: 0

이제 INSERT를 해 본다. 만일 입력 후 SELECT 하였을 때 ?? 형태로 나온다면 변환이 제대로 되지 않은 것이다. 이렇게 되면 시스템상의 복잡한 문제들을 추적하는 수 밖에 없으므로, 가장 간단한 방법은 테이블을 새로 만드는 것이다.(다른 방법도 찾아 볼 것)
테이블을 새로 만들기 전에 테스트 테이블을 만들어 이를 확인해 볼 수 있다. 이때 한글 문자열이 셸 상에서 정상 입/출력 되면 되는 것이다.

mysql> create table tt1( idx int(2) primary key auto_increment not null, str varchar(200) not null );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into tt1 values('','하하');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into tt1 values('','haha');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tt1;
+-----+--------+
| idx | str    |
+-----+--------+
|   1 | 하하   |
|   2 | haha   |
+-----+--------+
2 rows in set (0.00 sec)

아래는 필자의 테스트용 JSP 파일이다. 상황에 맞게 고쳐 쓰자.(아니어도 고쳐야 한다 -_-)
<%@page contentType = "text/html; charset=utf-8" pageEncoding= "UTF-8"%>
<%@page import="java.util.List" %>
<%@page import="kr.pe.m9.board1.*" %>
<%@page import="kr.pe.m9.board1.action.*" %>
<%@page import="kr.pe.m9.board1.data.*" %>
<%@page import="kr.pe.m9.board1.exception.*" %>
<%@page import="kr.pe.m9.board1.manager.*" %>
<%@page import="java.sql.*" %>
<%
//test code
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/setzer?useUnicode=true&characterEncoding=utf8","ID","PASS");
Statement stmt = conn.createStatement();
String sql = new String(("INSERT INTO groups values('','하하','호호','후후',now())").getBytes("UTF-8"),"UTF-8");
System.out.println(sql);
//sql = new String("INSERT INTO groups values('','하하','호호','후후',now())");
%>
<%= sql %><br>
<%
stmt.executeUpdate(sql);
PreparedStatement pstmt = null;

StringBuffer sb = new StringBuffer();
sb.append("INSERT INTO ");
sb.append("groups ");
sb.append("values('',?,?,?,now())");

pstmt = conn.prepareStatement(sb.toString());

pstmt.setString(1, "하하");
pstmt.setString(2, "호호");
pstmt.setString(3, "후후");

pstmt.executeUpdate();
%>
<%= pstmt %>
<%

try{
List boardList = (List)request.getAttribute("boardList");
if(boardList.size() != 0){
	for(int i=boardList.size()-1; i>=0; i--)
	{
		Board board = (Board)boardList.get(i);
%>
	<p><%= board.getId() %>. <%= new String(board.getName().getBytes("ISO8859-1"),"UTF-8") %><br>
	<%= board.getName() %><br>
	설명 : <%= board.getDescription() %> <br>
	생성자:<%= board.getOwner() %><br>
	생성일:<%= board.getDate() %>
<%
	}
}else{
%>
	<p>아무 게시판도 없습니다.
<%
}
%>
	<p><a href="./board_list.do?command=create_board_form">게시판 생성</a>
<%
}catch(NullPointerException e){
%>
	<%= e %>
	잘못된 접근입니다.	
<%
}
%>

firebird2(1.5) UTF-8

apt-get install firebird2-server-common, firebird2-classic-server, firebird2-utils-classic

JDBC Driver : http://firebird.sf.net/ -> download -> class4 jca/jdbc -> for jdk1.4(2.7M)
unzip FirebirdSQL-1.5.5JDK_1.4.zip -d jaybird/
eclipse - project properties - Java Build Path - Libraries - Add External Jars - firebirdsql-full.jar

시작 자세한 내용은 http://firebird.sf.net -> documentation -> novice guide -> start here!(Quick Start Guide) 참고
(Classic Server와 Super Server의 차이점도 기술되어 있다)

/usr/lib/firebird2/bin/fb_inet_server

gsec(Firebird command-line security utility)를 이용한 계정 추가 :

데이터베이스 생성
# /usr/lib/firebird2/bin/isql
CON> CREATE DATABASE '/test.fdb'
SQL> user 'SYSDBA' password 'YOUR-PASSWORD';

SQL> CONNECT '/test.fdb' user 'SYSDBA' password 'YOUR-PASSWORD';
Database: '/test.fdb', User: SYSDBA

CON> select * from RDB$RELATIONS;
...

GUI툴은 내장되지 않음.
http://ibphoenix.com/ - Downloads - Contributed - Administration Tools 에서 사용할 적당한 툴을 구한다.
[http]DbVisualizer 추천(현재 시점에서 4.2)
레드햇은 RPM이 제공되며 데비안은 sh 파일을 다운.(7.4M)

1. DriverManager Window에서 jaybird 드라이버를 Firebird란 이름으로 추가, 설치.
2. 첫 화면인 Object View 에서 Driver (JDBC)를 Firebird로 설정.
URL을 jdbc:firebirdsql:test.fdb로 설정하고 아이디와 비밀번호 입력한다.
3. Connect를 클릭. 퍼미션 에러(혹은 Resource Exception)가 날 경우 /test.fdb의 소유주를 firebird로 변경해준다.

Aqua Data Studio에서도 크게 다르지 않다.
서버 등록시 Generic(JDBC)로 설정한 뒤 Url에는 동일, Driver에는 org.firebirdsql.jdbc.FBDriver라고 직접 적어주민 된다.

PostgreSQL(8.0) 설정

# apt-get install postgresql postgresql-contrib
debconf에서 backend locale을 ko_KR.utf8로 설정한다.
# /etc/init.d/postgresql start
# su - postgres
#psql template1
-- template1에 미리 plpgsql을 만들어 두면 나중에 DB 생성 후 따로 추가 할 필요가 없다.
create function plpgsql_call_handler()
returns opaque
as '/usr/local/pgsql/lib/plpgsql.so'
--데비안 Testing의 경우 /usr/lib/postgresql/lib/plpgsql.so
--페도라 코어 3의 경우 /usr/lib/pgsql/plpgsql.so
language 'C';
create trusted procedural
language 'plpgsql'
handler plpgsql_call_handler
lancompiler 'PL/pgSQL';

$ createuser -DA test -P
Enter password for new user:
Enter it again:
CREATE USER
$ createdb testdb -O test
CREATE DATABASE
//혹은
$psql test
test=# ALTER USER test WITH PASSWORD '새 비밀번호';

$ logout
# psql testdb test -W

유저 권한은 /etc/postgresql/pg_hba.co (페도라의 경우 /var/lib/pgsql/data/pg_hba.conf) 에서 찾을 수 있다.
기본값인
type database ip-address ip-mask method
local all all ident sameuser
host all all 127.0.0.1 255.255.255.255 password

같은 디렉토리의 postgresql.conf에서 다음 행의 주석을 해제한다 :
tcpip_socket = true
port = 5432
(방화벽이 설정되어 있다면 해당 포트를 해제한다)


변경 후 리붓은 필수.
# /etc/init.d/postgresql restart



GUI 툴인 pgAdmin 다운로드 : http://pgadmin.org/download.php
2005년 3월 5일 최신버전(Fedora Core 3) :
wget ftp://ftp3.kr.postgresql.org/pub/mirror/pgsql/pgadmin3/release/v1.2.0/fc3/pgadmin3-1.2.0-1.i686.rpm
rpm -Uvh pgadmin3-1.2.0-1.i686.rpm
pgadmin3

web.xml 설정

example 참고해서 filter 설정.

<web-app>
	...	
	<filter>
		<filter-name>Set Character Encoding</filter-name>
		<filter-class>filters.SetCharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>Set Character Encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

EL 적용을 위한 설정(출처 : [http]http://javacan.madvirus.net/main/board/board.jsp?cmd=r&kind=02&sno=702&code=0000000010&p=1&st=1&rn=T&keyword=EL)
WEB-INF/classes/filters 밑에 [attachment:SetCharacterEncodingFilter.java]를 컴파일하여 넣는다.

처음부터 EL이 적용되지 않았다는 뜻인가요?
기본적으로 EL은 적용되도록 되어 있는데요.

혹시 web.xml 파일의 <web-app> 태그가 1.2 스타일인지 2.0 스타일인지 확인해보시겠어요?

2.0 스타일은 다음과 같이 스키마와 관련된 정보와 version 속성을 갖고 있죠.

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

만약 단순히 아래와 같다면

<web-app>

톰캣은 이를 JSP 1.2의 web.xml 파일로 인식해서 자동으로 JSP 페이지에서 EL을 처리하지 않도록 한답니다. 이런 경우 JSP 페이지에

<%@ page isELIgnored = "false" %>

위 코드를 명시적으로 넣어주어야 EL이 적용이 되지요.

-------------------------------------------------
gamza님이 입력한 내용
-------------------------------------------------
안녕하세요 최범균님..책 정말 잘 보고 있습니다
제가 필요한 내용은 2.0 관련에서 필요한거였는데 앞부분부터 복습한다 생각하고 하고 있네요..^^

질문입니다.

책대로 해 좀 응용해서 에러 페이지를 만들고 있는데.
el이 죽어도 안먹어서 
web.xml에서 el-ignored를 false를 해서 work 디렉토리 지우고 다시 시작했지만 안되었구요..


<%@ page isELIgnored="false" %>

이렇게 위에다 추가 한 다음에 하니 되더군요..

테스트 페이지 jsp-examples 에서 jsp2 관련 el은 잘 뜨더군요..
그런데 제가  만든 페이지를 webapps 디렉토리에다 만들지 않고 따로 만들었습니다.
차이점이라고는 제가 보기엔 따로 디렉터리를 두어서 돌린것 뿐인데..
왜 그런지 좀 알려주시면 감사하겠습니다.

그리고 이럴경우에 매번 위 코드를 넣어줘야할것같은데.. 한번에 셋팅할수 있는 방법이 없는지 알고 싶습니다.

Tomcat 5.0.27 버전입니다.

추운데 감기조심하시구요... 답변 기다리겠습니다. 
powered by Moniwiki | themed by clockoon
last modified 2008-12-30 10:44:13
Processing time 0.0205 sec