이클립스에서 log4j 설정과 함께 자바 어플리케이션 실행

Run Configutaions의 VM arguments에 다음과 같이 log4j.properties 혹은 log4j.xml 파일의 경로를 지정해 준다.

-Dlog4j.configuration=file:/C:/WORKSPACE_STS/SNOW/log4j.properties



MySQL 5.0.45 원하는 위치에 수동 설치 및 윈도 서비스로 등록 하기

테스트 환경으로 사용할 일이 생겨서 MySQL을 집에 설치 했었습니다. 인스톨러 없이 D:\TOOLS 디렉토리에 UTF-8 환경으로 설치한 후 윈도 서비스로 등록까지 마쳤는데... 오늘 설치본을 그대로 복사해서 회사에서 사용하는 컴퓨터에 설치하려고 하니 어떻게 했는지 기억이 전혀 안나더군요. :-( 이러한 이유로 여기에 설치법을 남깁니다.


MySQL 설치

저는 MySQL AB다운로드 페이지에 있는 윈도 버전 중 수동설치 버전(Without installer 혹은 ZIP Archive라고 써 있는 놈)을 다운로드 받았습니다. MySQL Account 만들거냐고 물어보면 아래에 있는 "No Thanks..." 링크를 눌러서 등록 안하고 받으셔도 됩니다.


무설치 버전인 만큼 설치는 매우 간단합니다. 원하는 디렉토리에 압축을 풀어주기만 하면 되죠!
저는 D:\TOOLS\mysql-5.0.45-win32 디렉토리에 압축을 풀었습니다.

다른 작업 없이 명령 프롬프트를 하나 실행한 다음 D:\TOOLS\mysql-5.0.45-win32\bin 디렉토리로 이동한 후에 "mysqld --console" 명령만 실행하셔도 MySQL 서버를 바로 사용하실 수 있습니다.

D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --console
080220 10:47:57  InnoDB: Started; log sequence number 0 19944194
080220 10:47:58 [Note] mysqld: ready for connections.
Version: '5.0.45-community-nt'  socket: ''  port: 3306  MySQL Community Edition (GPL)

위와 비슷한 메시지를 보여 주며 오류 없이 MySQL 서버가 시작된 후, 다음과 같이 "mysqlshow -u root" 명령을 실행하시면 Database 목록을 볼 수 있습니다.

D:\TOOLS\mysql-5.0.45-win32\bin>mysqlshow -u root
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+


위의 과정만으로도 MySQL은 사용할 수 있는 상태가 되었습니다만, 좀 더 세밀한 설정을 하기 위해서는 옵션 파일을 만들어 줘야 합니다. 옵션 파일의 예제가 설치 디렉토리에 있기 때문에 약간의 수정을 해주면 바로 사용할 수 있습니다. 설치 디렉토리(D:\TOOLS\mysql-5.0.45-win32)를 보면 5개의 ini 확장자를 가진 파일이 있습니다. 용도에 따라 선택 하시면 됩니다. 저는 간단한 테스트가 목적이기 때문에 my-small.ini 파일을 선택했습니다.
MySQL은 "[설치 디렉토리]\my.ini" 파일 혹은, "C:\Windows\my.ini" 파일이나 "C:\my.cnf" 파일을 옵션 파일로 찾습니다. 저는 my-small.ini 파일의 복사본을 하나 만들어서 my.ini로 이름을 변경한 후, "C:\Windows" 디렉토리로 복사해서 옵션 파일 설정을 마쳤습니다.

MySQL은 Windows directory에서 my.ini 파일을 찾습니다. Windows directory 경로는 윈도 종류에 따라서 다르기 때문에 정확한 경로를 확인하려면, 명령 프롬프트에서 다음의 명령을 실행해 보시면 됩니다.

C:\> echo %WINDIR%


윈도 서비스로 등록하기

이 글에서 옵션파일을 만들어서 사용하는 목적은 윈도 서비스로 MySQL을 등록하기 위해서입니다. 이를 위한 최소한의 수정을 한 후 MySQL을 윈도 서비스로 등록해 보겠습니다.

윈도 서비스로 등록하기 위해서는 my.ini 파일에 설치 경로를 명시해야합니다.
위에서 만든 "C:\Windows\my.ini" 파일을 열어서 "[mysqld]" 섹션을 찾은 후 다음의 2줄을 넣어 줍니다(경로 구분자로 '\'가 아닌 '/'를 사용합니다. 주의하세요!).

basedir = D:/TOOLS/mysql-5.0.45-win32
datadir  = D:/TOOLS/mysql-5.0.45-win32/data


쉽게 짐작할 수 있겠지만, 위의 내용은 설치경로와 MySQL이 사용하는 데이터의 저장 경로입니다.
이제 my.ini 파일은 아래와 비슷한 내용으로 변경되었을겁니다.

# The MySQL server
[mysqld]
basedir = D:/TOOLS/mysql-5.0.45-win32
datadir  = D:/TOOLS/mysql-5.0.45-win32/data

port  = 3306
socket  = /tmp/mysql.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K


이제 윈도 서비스로 등록을 해보죠. MySQL이 실행 중이라면, 아래의 명령을 실행하여 MySQL을 죽입니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqladmin -u root shutdown

MySQL이 완전히 종료된 것을 확인한 후, 아래의 명령으로 MySQL을 윈도 서비스로 등록할 수 있습니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --install

만약 MySQL 서비스의 시작유형을 자동이 아닌 수동으로 하고 싶다면, 아래의 명령으로 등록합니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --install-manual

설치된 MySQL 서비스를 삭제하고 싶으면, 아래의 명령으로 삭제할 수 있습니다.
D:\TOOLS\mysql-5.0.45-win32\bin>mysqld --remove

윈도 서비스 등록에 대한 더 많은 정보를 원하시면 이곳의 문서를 참고하세요~!
charset euckr
set character set euckr;
show variables like 'c%';


Commons FileUpload 1.2 버젼의 boundary 오류

Commons FileUpload 1.2 버젼을 사용하여 ActiveX 업로드 컨트롤을 테스트 하던 중, "org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found"라는 에러 메시지를 보게 되었습니다. Commons FileUpload 사이트의 가이드를 따라 하던 중이라 별로 잘못한 건 없어보였는데 말이죠.

NetBeans에 포함된 HTTP Monitor의 도움을 받아(FiddlerHttpWatch는 ActiveX에서 발생하는 HTTP 통신을 볼 수 없더군요) HTTP Header 정보를 살펴보니 content-type은 아래와 같은 형식이었습니다.

multipart/form-data, boundary=ZYDa6MZ62846kJOUYu9kybvA750KGm3r

문제는 글자를 하나하나 아무리 뜯어봐도 boundary를 못찾을 이유가 없어 보인다는 겁니다.
결국 Commons FileUpload의 boundary 관련 소스를 다 뒤져보기에 이르렀는데... 이놈은 boundary 구분자로 세미콜론(;)을 사용하더군요. 제가 사용하는 업로드 컨트롤은 구분자로 쉼표(,)를 사용하고 있으니까 당연히 boundary를 못찾죠.
이걸 어떻게 해야하나... "직접 소스를 고칠까?" "이슈 등록을?" 등등의 고민을 하다가 구글링을 해봤더니 아파치재단의 버그 트래커에 이미 오류로 등록된 문제였습니다.

결론은 Commons FileUpload가 rfc1867을 지키지 않고 있다는 것입니다. 하지만 rfc1521은 세미콜론을 구분자로 제시하고 있고 대부분의 브라우져가 세미콜론을 구분자로 사용하기 때문에, 쉼표와 세미콜론을 모두 지원하는 방향으로 결정이 난 것 같습니다.

아래의 링크에서 관련 정보와 패치를 받으실 수 있습니다. 제가 패치한 jar 파일을 올리려다가 소스 등까지 다 같이 올려야하는게 귀찮아서 링크만 올립니다.

[fileupload] separator of boundary doesnt match rfc1867 examples

Groovy 1.5가 릴리즈 되었습니다

여행을 다녀온 후 조금 멍한 기분으로 infoq.com에 갔더니, 지난 주말에 Groovy 1.5가 릴리즈 되었다는 소식이 있더군요. 자바5에 대한 지원이 강화된 점이 눈에 띕니다.

http://www.infoq.com/articles/groovy-1.5-new

HSQLDB 시작하기

자바개발환경만 있으면 간단하게 사용할 수 있는 Database Engine인 HSQLDB를 설치해 보겠습니다.


HSQLDB 설치

먼저 소스포지의 다운로드 페이지에서 HSQLDB를 다운로드 받습니다. 현재(2007-11-30) 최신버젼은 1.8.0.9 버젼이군요.
사실 HSQLDB는 설치라고 할만한 과정이 없습니다. 그냥 압축파일의 lib 폴더 안에 있는 hsqldb.jar 파일만 있으면 HSQLDB를 사용할 수 있습니다. 원하는 곳에 복사하고 원하는 방식으로 실행을 하면 됩니다.
저는 하이버네이트 테스트를 위해서 설치한 터라 "D:\WORKSPACE_JEE\HibernatePractice\lib" 폴더에 넣었습니다.

사용자 삽입 이미지


HSQLDB 실행

HSQLDB는 Server Mode라고 부르는 3가지의 실행방법을 가지고 있습니다. 이 Server Mode 중 가장 일반적인 방식인 Hsqldb Server로 실행하는 방법에 대해서 알아보겠습니다. 다른 방식에 대해서는 나중에 또 기회가 있을거라고 생각합니다. :-)

명령 프롬프트 창을 하나 띄우고 다음과 같이 입력합니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.Server -database.0 file:data/test -dbname.0 javaworld


"-database.0 file:data/test" 옵션은 Database가 사용할 경로와 파일명을 명시하고 있습니다. 예에서는 상대경로로 현재 폴더 아래의 data 폴더에 "test.*" 형식으로 관련 파일을 생성하라고 얘기하고 있습니다. 물론 절대경로로 지정해도 됩니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.Server -database.0 file:D:\WORKSPACE_JEE\HibernatePractice\data\test -dbname.0 javaworld

[Server@1270b73]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@1270b73]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@1270b73]: Startup sequence initiated from main() method
[Server@1270b73]: Loaded properties from [D:\WORKSPACE_JEE\HibernatePractice\server.properties]
[Server@1270b73]: Initiating startup sequence...
[Server@1270b73]: Server socket opened successfully in 40 ms.
[Server@1270b73]: Database [index=0, id=0, db=file:data/test, alias=javaworld] opened sucessfully in 1351 ms.
[Server@1270b73]: Startup sequence completed in 1411 ms.
[Server@1270b73]: 2007-12-05 10:50:20.203 HSQLDB server 1.8.0 is online
[Server@1270b73]: To close normally, connect and execute SHUTDOWN SQL
[Server@1270b73]: From command line, use [Ctrl]+[C] to abort abruptly

"-dbname.0 javaworld" 옵션은 Databse의 alias(별칭)을 지정하고 있습니다. 위의 경우는 'javaworld'라는 이름으로 Database의 이름을 지정하고 있는거죠. 이 alias는 어플리케이션에서 jdbc를 통해 hsqldb에 접근할 때 사용하게 됩니다. 위의 경우 jdbc connection URL은 "jdbc:hsqldb:hsql://localhost/javaworld"입니다.

각 옵션명의 뒤쪽에 붙어있는 ".0" 이라는 문자는 database의 인덱스를 의미합니다. hsqldb는 0~9까지의 인덱스 값을 허용하므로, 총 10개의 Database를 동시에 띄울 수 있습니다.
즉 옵션 "-database.0 file:data/test -dbname.0 javaworld"은 인덱스 값 0에 할당된 Database가 현재 폴더 아래의 'data' 폴더에 'test.*' 형식의 관련 파일들을 사용하며, alias(dbname)은 javaworld라는 것을 의미합니다. 위의 실행 예에 녹색으로 표시된 부분을 보면 이해에 조금 더 도움이 될겁니다.

Database Manager

Database Manager는 HSQLDB Database에 질의를 하거나 테이블 등의 Database 객체를 볼 수 있게 해주는 GUI 툴입니다.
Database Manager는 hsqldb.jar 파일에 포함 되어 있기 때문에 아래와 같이 명령 프롬프트에서 입력하면 바로 사용이 가능합니다.

D:\WORKSPACE_JEE\HibernatePractice>java -classpath lib/hsqldb.jar org.hsqldb.util.DatabaseManager


사용자 삽입 이미지javaworld Database 접속


javaworld database가 이미 실행 중이라면 위와 같이 Driver, URL 등을 입력하고 OK 버튼을 누르면 바로 javaworld database를 관리할 수 있습니다.

사용자 삽입 이미지


DDL이나 DML을 입력한 후 Execute 버튼을 누르면(단축키 : Ctrl-Enter) 입력한 SQL문이 실행됩니다.
위와 같이 DDL 문을 실행했을 경우에는 좌측의 트리가 자동으로 갱신되지 않는데, 이럴 때는 View-Refresh Tree 메뉴를 한 번 클릭해 주면 갱신된 트리를 볼 수 있습니다.

사용법이 매우 직관적이고 간단하기 때문에 메뉴 등을 직접 살펴보면 더이상의 설명은 필요 없을 듯합니다. :-)