2007년 10월 26일 금요일

FCKeditor에서 lightbox 연동하기

FCKeditor에서 lightbox 2를 연동해보자

FCKeditor를 이용하여 이미지 업로드를 하다보면 이미지에 자동으로 링크가 걸리지 않으므로 사용자한테 더욱 친근한 인터페이스를 제공해 주지 못하는 허점이 있다.
웹용 이미지 뷰어(?) 에서 그나마 가장 잘 만들어진 솔루션이 있다면 lightbox 를 손꼽아야 할 것이다.

lightbox 2는 사실 lightbox에 기반하여 개발이 되여진 솔루션이며, 현재 버젼 2.0.3까지 나와있는 상태이다. FCKeditor에서 lightbox를 사용하려면 여간 번거롭지 않다. <a> 태그에 rel속성을 세팅해주어야 하는데 이것을 FCKeditor과 lightbox를 연동함으로써 자동으로 설정해줄수가 있다.

자~ 그럼 아래에 FCKeditor와 lightbox2를 어떤방식으로 연동할건지 그 원리부터 설명하겠다.

FCKeditor에서 실제 이미지 업로드를 담당하는 페이지는 fck_image.html인데 이 파일을 열어보면 다음과 같은 부분들을 볼수 있다.

<div id="divLink" style="display: none">

그렇다, 이 div태그속에 포함된 내용은 아래에 첨부한 이미지에서 볼수 있는 이미지 링크 레이어부분이다.

사용자 삽입 이미지

FCKeditor에서는 기본 URL과 Targer속성을 세팅가능하도록 지원하고 있다. 하지만 우리가 여기서 rel이라는 새로운 속성을 추가해주어야 lightbox에서 그것을 인지하여 처리를 해준다. 하지만 여기서 rel속성을 노출 시켜서는 않된다. 왜냐면 rel속성은 특정되게 lightbox를 사용하기 위해서만 사용이 되여지기 때문에 rel를 hidden으로 등록시켜줌이 좋다.

소스를 아래에서처럼 수정하면 된다. 수정된 부분은 붉은색으로 표시했다.

소스열기

그리고 fck_image.js 파일을 연다.
OnUploadCompleted 메소드를 찾아서 마지막 쯤 보면

SetUrl( fileUrl ) ;
GetE('frmUpload').reset() ;

이런 부분이 있다. 이건 실제 파일 업로드가 완성되면 URL을 기본 파일이 업로드된 실제 path로 세팅해주는 부분인데 이 부분에 우리는 <a> 태그에 대하여 여러가지 값들을 세팅해주겠다.

위 소스 밑에 아래 소스를 추가시켜준다.
 
GetE('txtLnkUrl').value = fileUrl ;
GetE('txtLnkRel').value = "lightbox" ;
GetE('txtBorder').value = "0";

간단한 설명을 첨부하자면
우리가 만들어야 할 태그의 형태는 아래와 같은 형태가 될것이다.

<a href = "이미지실제 주소" rel="lightbox"><img src=""이미지 실제 주소" border="0"/></a>

위 스크립트는 바로 윗 형태의 태그를 만들어 주는 역할을 한다고 볼수 있다.

2007/02/28 - [자바 어플리케이션/기타 프레임웍들] - FCKeditor 2.4 설정 입문
2007/02/26 - [자바 어플리케이션/기타 프레임웍들] - FCKeditor 와 Java 연동하기

2007년 10월 25일 목요일

Spring 컨테이너가 아닌곳에서도 Service 사용하기

Service를 Spring 컨테이너가 아닌 일반 서블릿에서도 사용가능하다!!!

프로젝트를 하다보면 간혹가다가 서블릿으로 일부 어플리케이션을 만들어야 할 필요가 있다.
특히나 파일 다운로드를 구현하다보면 더욱 그러하다.
또한 일반 서블릿을 제외하고도 라이브러리나 기타 다른 클래스에서 직접 특정된 어플리케이션의 서비스인스턴스를 받아서 처리하려면 여간 힘들지 않다.

이런 경우 보통은 ApplicationContext를 ThreadLocal 변수에 저장시켰다가 다른 곳에도 호출하면서 사용한다. 하지만 한가지 단점은 ThreadLocal 변수를 초기화하지 않은채 특정된 어플리케이션을 호출하면 ApplicationContext 인스턴스를 가져올수가 없게 된다.

사실 서블릿 컨텍스트에는 ApplicatioinContext 인스턴스를 가지고 있다. 하지만 이 경우 나의 관심사는 다른 여타의 빈즈보다는 특정된 서비스이다. 솔직히 말해서 아래에 첨부한 소스를 조금 변경하면 서비스 인스턴스가 아닌 다른 인스턴스도 가져올수 있다.

먼저 그럼 소스부터 첨부하겠다.

소스열기

위에서와 같이 ServiceHelper 클래스를 만들었다면 bean으로 선언된 서비스 인스턴서를 받어오려면 아래와 같이 호출 하면된다.

SysUpfileService sysUpfileService = SysUpfileServiceHelper.getBoardService(getServletContext());

getBoardService 메소드가 static으로 선언되였으므로 별도로 SysUpfileServiceHelper 를 인스턴스화 할 필요는 없다.
위 소스에 대하여 간단하게나마 설명을 하자면 실제 Servlet에서 bean을 접근 할수가 없므로 WebApplicationContext 인스턴스를 통하여 접근을 시도한다.
WebApplicationContext 인스턴스를 받게 되면 우리가 접근하려고 하는 bean 네임만 주고 실제 bean 인스턴스를 리턴받아 온다. 사실 이 루틴은 아예 이런 빈을 사용하려는 클래스에 포함시켜서 사용할 수 있다. 하지만 여러 곳에서 이런 서비스를 빈을 필요로 하는 경우가 존재하기때문에 별도로 serviceHelper라는 클래스로 추출하였었다. 사용자는 실제 자신의 상황에 마추에 이부분 코딩을 해주면 된다.

2007년 10월 24일 수요일

eclipse plugin 설치 방법 - Properties Edit Plugin

Properties Edit Plugin 설치 방법입니다.

J2EE 프로젝트를 하다보면 다국어 처리가 필요할때가 있습니다. 보통은 Java소스 보다는 별도로 properties파일을 따로 만들어 다국어 처리를 진행할 데이타들을 저장합니다.
하지만 이런 프로퍼티 파일을 작성함에 있어서 한가지 명심해야 할 점은 파일에 적힌 문자가 반드시 Unicode여야만 하는 것입니다. SUN에서는 이를 해결하기 위하여 %JAVA_HOME%\bin\native2ascii.exe 이라는 프로그램을 사용할것을 적극 추천하고 있습니다.
하지만 실제 업무를 하다보면 이런 properties파일이 한두개가 아니고 자주 변경이 되다보니 그때마다 native2ascii.exe로 컨버팅 해주기 여간 귀찮은 작업이 아닐수 없습니다.
또한 native2ascii.exe로 컨버팅 된 파일들은 아래 아미지에서와 같이 알아보기 힘든 형태로 됩니다.

사용자 삽입 이미지

이클립스에서 프로퍼티 편집을 쉽게 할수 있도록 플러그인이 개발이 되여졌습니다.
다름 아닌 오늘에 소개할 주인공 Properties edit plugin입니다.
사실 공식 사이트에 가서보면 설치 방법이 상세하게 나와있습니다. 하지만 설치방법이 전부 텍스트 형태로 되여있는 바 이를 좀 간편하게 소개 하기 위하여 이 포스트를 작성하게 되였습니다.

자 그럼 플러그인을 설치해 볼가요?

이 플러그인은 별도로 다운로드를 받아서 설치하는것이 아니라 eclipse에서 직접 설치가 가능합니다.
다음과 같이 이클립스 메뉴에서 Help > Software Updates > Find and Install... 을 선택합니다.
사용자 삽입 이미지
두 번째 메뉴을 선택합니다. Search for new features to install
사용자 삽입 이미지
New Remote Site 버튼을 클릭하고 Name에는 propedit,
URL에는 http://propedit.sourceforge.jp/eclipse/updates/ 이 주소를 복사하여 넣습니다.
사용자 삽입 이미지
아래 그림에서와 같이 제일 첫번째 항목을 선택합니다.
사용자 삽입 이미지
설치를 마치면 이클립스를 재시작합니다.

프로퍼티 파일의 아이콘이 바뀝니다. 오른 버튼으로 Open With라는 메뉴를 보면 가능한 편집기 리스트가 나옵니다. 첫 번째 Properties File Editor는 이클립스 내장 에디터입니다. 맨 처음 보았던 것이죠. 두 번째 있는 PropertiesEditor가 새로 설치한 플러그인에서 지원하는 에디터입니다. 아이콘이 다름을 알 수 있습니다. 이것으로 열어보겠습니다.
사용자 삽입 이미지
편집은 가독성있는 문자코드로 하고 저장만 유니코드로 자동변환되어 저장됩니다.
즉 한마디로 종합한다면 이 플러그인만 설치하면 native2ascii 를 이용하여 별도로 한글을 unicode로 컨버팅 하지 않으셔도 됩니다.

2007년 10월 22일 월요일

Commons-upload 를 이용하여 파일 업로드를 구현해보자

Commons-upload를 이용하여 파일 업로드를 구현하였다.

Commons-upload 는 java용 파일 업로드 라이브러리이며 jakarta project의 sub project중의 하나이다.

실제 구현시 사용한 commons-upload jar파일 버젼은 1.2이다.

소스열기

그러면 아래에 윗 소스를 설명하면서 commons-upload에 대하여 알아보도록 하자.
파일을 업로드 하기 위하여서 Client Side에서 필히 POST방식으로 데이타를 Server Side에 전송하여야 한다. 우리는 Client에서 파일을 전송하는데 필요한 폼을 이미 구성하였다는 가정하여 Server Side소스만 살펴보자.
파일을 업로드 받는데 필수적 요소는 모두 3가지가 있다.

첫째, 파일소스 (즉 클라이언트에서 전송받은 파일이다.)
둘째, 파일을 저장 할 경로
셋째, 업로드 받을 파일의 최대 사이즈

위 세가지 요소를 제외하고도 사실 고려해야할 사항들이 많지만 여기서 우리는 위 요소들만 고려하여 실제 구현된 소스를 살펴보자.

1.2 이전 버젼을 사용하였다면 아마도 DiskFileUpload upload = new DiskFileUpload(); 이런 식으로 업로드 객체를 만들었었을것이다.
1.2 버젼을 업그레드 되면서 DiskFileUpload 클래스는 Deprecated되였으며 아마 1.3버젼부터는 삭제되여 질 수도 있다. Commons-upload API를 읽어보면 DiskFileUpload 대신 DiskFileItemFactory과 ServletFileUpload를 사용할것을 적극 권장하고 있었다.
자, 그럼 먼저 멀티파일을 업로드 받기 위하여 복수개 FileItem를 구성해야하는데 실제 우리는 request에서 넘어온 멀티 파일을 고려할 필요가 없이 아주 쉽게 이부분을 구현할 수 있다.
DiskFileItemFactory를 통하여 factory인스턴스를 만든다.

DiskFileItemFactory factory = new DiskFileItemFactory();

다음 factory 사이즈 계수를 설정해주어야 한다.

factory.setSizeThreshold(10485760);

여기서는 최대 10MB만 업로드 받을수 있게 숫치 10485760 을 입력한다.
다음 업로드 받을 파일의 경로를 적는다.

factory.setRepository( new java.io.File( currentDirPath ) );

currentDirPath는 사실 업로드될 파일의 경로이다.
만약 지정된 디렉토리가 만들어 지지 않았으면 아래에서 처럼 자동으로 생성해줄 수 도 있다.

File currentDir = new File(currentDirPath);
if ( !currentDir.exists() ) currentDir.mkdir();

factory에 대한 설정이 끝났으면 upload 객체를 만들어보자.

ServletFileUpload upload = new ServletFileUpload(factory);

위에서 만든 factory객체를 통함으로써 아주 쉽게 upload객체를 만들수가 있다.
다음 request를 통하여 넘어온 파일들을 파싱하여 생성된 실제 파일데이타들을 List에 쌓아둔다.
실제 여기서 미리 Generic을 이용하여 List에 저장된 데이타타입을 지정할수도 있지만 소스에서는 그렇게 구현을 하지 않았다.

List<?> items = upload.parseRequest(request);

또한 넘겨받은 필드가 폼필드인지를 검사하여 만약 폼필드인 경우에만 fields에 해당 값들을 쌓아두었다.

if (item.isFormField())
fields.put(item.getFieldName(),item.getString());
else
fields.put(item.getFieldName(),item);

TOAD 한글 깨짐 문제

TOAD For Oracle 에서 한글 깨짐 문제를 아래와 같이 해결한다.

사용자 삽입 이미지


TOAD For Oracle 로 oracle 10g 에서 데이타를 읽어 오는데 한글이 깨질때 아래와 같이 설정하면 된다.
Datagrid 부분에 한글이 깨지면, 아래 경로에 작성하여 주면 된다.
cmd콘솔을 띠우고 regedit를 입력하고 레지스터리 편집기를 켠다.
레지스터리 편집기에 아래 키값을 적어넣는다.
키값이 위치할 경로는
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 이고
추가할 문자열값은
NLS_LANG
값 데이타는
KOREAN_KOREA.KO16MSWIN949
이다.

2007년 10월 19일 금요일

P6SPY Configuration...

Common Property File Settings


먼저 spy.properties 의 간단한 샘플을 첨부하겠다.


설정파일 열기


module
module.xxx는 시스템 시작시 자동으로 로딩되는 특수한 모듈로서 매 모듈마다 여러가지 기능들을 수행하고 있다. 이러한 모듈의 주석문 체크를 해제하면 시스템 시작시 자동으로 메모리에 적재가 되여지며 그 생존주기는 시스템이 종료되기 전까지이다.
P6SPY에서는 아래와 같은 두가지 모듈을 지원하고 있다.

module.log=com.p6spy.engine.logging.P6LogSpyDriver
module.outage=com.p6spy.engine.outage.P6OutageSpyDriver


module.log는 로깅할때 꼭 필요한 모듈이다.
module.outage는 로깅정보를 출력할때 꼭 필요한 모듈이다.

realdriver
실제 p6spy는 WAS에서 들어오는 모든 database 요청들을 가로채고 결과를 log파일로 찍는다. 사실 이 과정에서 사용자는 코드에 전혀 손 댈 필요가 없으며 단순히 p6spy설정파일에 realdriver를 설정해주고 WAS에 wrapped 데이타베이스 driver만 설정해주면 끝난다.

filter, include, exclude
P6Spy는 사용자들로 하여금 특정된 테이블, 특정된 statement 타입들에 대하여 모니터링할수 있게 한다. 간단히 filter=true 라는 세팅만으로 log에 찍힐 모든 내용들을 필터링할수 있다.
Include는 콤마로 분할된 표현식 리스트를 받아 들이는데 실제 로그파일에는 include 리스트에 포함되여있는 문자열들만 log파일에 찍게 된다.

가령 모든 select문을 출력하되 테이블에대한 정열문을 제외하고 싶다면 아래와 같이 세팅하면 된다.

filter = true
# comma separated list of tables to include
include = select
# comma separated list of tables to exclude
exclude = orders

stringmatcher (Custom Filtering)
P6SPY를 이용하여 좀 더 융통적인 로깅정보를 획득하고 싶다면 include,exclude 대신 정규표현식을 사용할수 있다. P6SPY에서 지원하는 RegExp는 두가지가 있는데 하나는 GNU RegExp이고 다른 하나는 Jakarta RegExp이다.

# Use GNU Regex Matching for Filtering
stringmatcher =com.p6spy.engine.common.GnuRegexMatcher
# Use Apache Jakarta Regex Matching for Filtering
stringmatcher =com.p6spy.engine.common.JakartaRegexMatcher

appender

Appenders는 사용자로 하여금 출력될 로그가 어디에 저장될건지 또한 어떤식으로 저장될건지를 설정해주는 작용을 한다. 기존에 p6spy버젼은 3가지 방식의 appender을 지원하는데 그것들로는 log4j, stout, csv text파일 등이다.

CSV 파일 포맷으로 로깅을 하고 싶을때 아주 간단히 appender=com.p6spy.engine.logging.appender.FileLogger 앞의 코멘트 기호를 삭제해주면 된다.

#appender=com.p6spy.engine.logging.appender.Log4jLogger
#appender=com.p6spy.engine.logging.appender.StdoutLogger
appender=com.p6spy.engine.logging.appender.FileLogger

# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname(e:/test/spy.log) (used for file logger only)
logfile = spy.log

# append to the p6spy log file. if this is set to false the
# log file is truncated every time. (file logger only)
append=true

Using StdOut—Uncomment the StdoutLogger as follows and all output will be sent to stdout in a CSV format:
#appender=com.p6spy.engine.logging.appender.Log4jLogger
appender=com.p6spy.engine.logging.appender.StdoutLogger
#appender=com.p6spy.engine.logging.appender.FileLogger

Using Log4J—To output to log4j, make sure log4j is in your path, uncomment the log4j appender, and specify the desired log4j settings:
appender=com.p6spy.engine.logging.appender.Log4jLogger
#appender=com.p6spy.engine.logging.appender.StdoutLogger
# appender=com.p6spy.engine.logging.appender.FileLogger

#The following are for log4j logging only
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n

#log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender
#log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost
#log4j.appender.CHAINSAW_CLIENT.Port=4445
#log4j.appender.CHAINSAW_CLIENT.LocationInfo=true

log4j.logger.p6spy=INFO,STDOUT

If for some reason log4j cannot be initialized, the logging will go to a file called log4jaux.log.