= 데비안식 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의 경우) = 참고 문서 = * [http://wiki.kldp.org/wiki.php/Apache2Tomcat5Howto] = 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://dev.mysql.com/doc/mysql/en/Charset-table.html 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 %>
<% 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); %>

<%= board.getId() %>. <%= new String(board.getName().getBytes("ISO8859-1"),"UTF-8") %>
<%= board.getName() %>
설명 : <%= board.getDescription() %>
생성자:<%= board.getOwner() %>
생성일:<%= board.getDate() %> <% } }else{ %>

아무 게시판도 없습니다. <% } %>

게시판 생성 <% }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://www.minq.se/products/dbvis/ 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 [http://database.sarang.net/database/postgres/JServ/post_jdbc-6.html 참고 문서] 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 설정. {{{ ... Set Character Encoding filters.SetCharacterEncodingFilter encoding UTF-8 Set Character Encoding /* }}} EL 적용을 위한 설정(출처 : [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 파일의 태그가 1.2 스타일인지 2.0 스타일인지 확인해보시겠어요? 2.0 스타일은 다음과 같이 스키마와 관련된 정보와 version 속성을 갖고 있죠. 만약 단순히 아래와 같다면 톰캣은 이를 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 버전입니다. 추운데 감기조심하시구요... 답변 기다리겠습니다. }}}