Java/Tip & Tech2013. 11. 21. 11:45

여러 사이트를 돌아다니다 보면 운영서버를 관리하다보면 수정사항을 변경했으나 서버를 재시작하지 못해 애태우는 경우가 다반사인듯 하다. 주로 SI를 하는 나로서는 그리 중대한 문제가 아닌듯 느껴지나 SM 하는 분들의 입장에서 생각해보면 꽤나 스트레스 받는 문제가 아닌듯 싶다. 이 이슈로 인해 개발 초기단계 이런 말까지 나온다..


"유지보수의 용이함을 위해 모두 JSP로 해주세요..."


유지보수의 용이함을 위해 아키텍쳐를 잘 잡아주세요가 아...니...다.... ㅡㅡ+

저렇게 말씀하시는 분의 개념을 운운하기 이전에 운영서버 재시작이 유지보수 하는 분들에게 얼마나 큰 부담인지 먼저 생각해보게 된다. 서비스의 영속성은 아주 중요한 부분이니까~~~ (그 느낌 아니깐~~~)

하여...

시간될때 JMX(Java Management Extensions)에 대해 공부를 좀 해보기로 했다..


아래는 JMX를 이용한 JVM 모니터링 관련 글들이다.


[JMX를 이용한 daemon 모니터링]

http://blog.kangwoo.kr/76


[Instrumenting applications with JMX]

- http://www.ibm.com/developerworks/java/library/j-jtp09196/


[Java Management Extensions (JMX) - Best Practices]

- http://www.oracle.com/technetwork/java/javase/tech/best-practices-jsp-136021.html


계속...





Posted by 꼰스
Java/Tip & Tech2012. 1. 25. 15:33

UTF-8 로 작성된 Java 소스를 import 하면 당연히 깨집니다.. 저는 Java 소스를 MS9494 인코딩으로 쓰니깐요..
해서 한칼에 모든 소스를 변경하고 싶은데 마땅한 툴이 없네요..
이럴때 개똥도 약에쓰려면 없다는 말이 생각납니다.
땡칠이 작업으로 변경을 하려 하다가 훗날을 생각하며 후딱 짜서 돌려봅니다.. 잘 되네요..

SrcEncodingConverter.jar

 SrcEncodingConverter.java

 
사용법은 아래와 같습니다.

1. SrcEncodingConverter.jar 를 다운로드하여 임의의 폴더에 저장

Ex) C:\temp 에  SrcEncodingConverter.jar을 다운로드

2. 변경되어진 소스가 저장될 폴더 생성

Ex) C:\temp\src 를 생성

3. 명령프롬프트에서 jar 파일이 있는 폴더로 이동

Ex) CD C:\temp

4. 명령구문 실행

Ex) C:\workspace\MyPrj\src 내 *.java 파일의 인코딩 변경후 C:\temp\src 에 넣을때 예제

java -classpath SrcEncodingConverter.jar kr.innofactory.util.SrcEncodingConverter C:\orkspace\MyPrj\src c:\temp\src .*\.java UTF-8 MS949

arguments 는 아래와 같습니다.

- args[0] : 소스 input 폴더
- args[1] : 변경소스 output 폴더
- args[2] : 파일패턴 정규식
- args[3] : 현재 Encoding (null 이면 시스템 charset)
- args[4] : 바꿀 Encoding (null 이면 시스템 charset)

도움 되셨길...

SrcEncodingConverter.jar

Posted by 꼰스
Java/Tip & Tech2012. 1. 6. 23:49
[ 2010년 01월 27일 에 작성한 글입니다 ]

Java 응용프로그램을 만들면 모하나.. Windows 가 시작되면서 자동으로 이 프로그램을 구동시키려면 Windows 서비스에 등록해야만 하는데..

예전 회사에서 KT회선을 쓰고 있을때 퇴근하고 난뒤 2~3시간만 지나면 회사서버에 접속이 되지 않았었지.. 그래서 난 java 로 1시간에 한번씩 특정사이트를 호출하게 만드는 어플리케이션을 만들고 이것을 회사 서버에 윈도우 서비스에 등록해서 우리 회사서버를 외부에서 언제나 접속하게 했던 기억이나.. 이렇게 만들어놓음으로써 회사에는 언제나 사람이 브라우저를 사용하는 것처럼 될테고.. KT는 서버로의 접근을 차단할 근거가 없어지게 되니깐~~ ^^

[방법 1] Java Service Wrapper 를 이용하는 방법

http://wrapper.tanukisoftware.org 를 잘 참조하면 되겠어..
Profession 은 상용이지만 Community 버전은 프리하게 사용가능한가바. 문서도 좀 읽어야 가능하겠는걸?

[방법 2] JavaService 를 사용하는 방법

이건 좀 자세히 설명할꺼야.. 오늘 내가 직접 해볼꺼거등 ^^

[STEP 1] 프로그램 다운로드

http://javaservice.objectweb.org (http://forge.ow2.org/projects/javaservice/)
2010년 01월 27일 현재 "JavaService-2.0.10.zip" 이 나와있네...
압축파일을 풀면 많은 JavaService.exe 라는 파일이 있어.. 그게 젤 중요하니 한번 살펴보자...
(다른 bat 파일들은 이름만 살펴봐도 그 용도를 알 수 있을꺼야..)
JavaService.exe 을 C:\temp 에 한번 복사해놓고 테스트해보자구..



[STEP2] JavaService 의 install 옵션 둘러보기


자.. 도스커멘드에서 JavaService 어떻게 사용하나 알아보려고 "-help" 옵션으로 실행시킨 결과야..
-----------------------------------------------------------------------------------------------------
JavaService (Windows NT Service Daemon) commands:-
        -version
        -licence
        -install service_name jvm service_options...
        -queryconfig service_name
        -status service_name
        -uninstall service_name
        -help
        -help topic
-----------------------------------------------------------------------------------------------------

빨간 install 옵션이 제일 중요하니 어떻게 쓰는지 살펴보기 위해 다시한번 "-help install" 을 해보자고..
-----------------------------------------------------------------------------------------------------


To configure and install a background service:
JavaService -install service_name jvm_library [jvm_options]
        -start start_class [-method start_method] [-params (start_parameters)]
        [-stop start_class [-method stop_method] [-params (stop_parameters)]]
        [-out out_log_file] [-err err_log_file]
        [-current current_dir]
        [-path extra_path]
        [-depends other_service]
        [-auto | -manual]
        [-shutdown seconds]
        [-user user_name -password password]
        [-append | -overwrite]
        [-startup seconds]
        [-description service_desc]
Where:
  service_name: The name of the service. ← 서비스명
  jvm_library:  The location of the JVM DLL used to run the service.  ← jvm.dll 위치
  jvm_option:   An option to use when starting the JVM, such as: "-Djava.class.path=c:\classes" or "-Xmx128m".
  start_class:  The class to load when starting the service.  ← 클래스명
  start_method: The method to call in the start_class. default: main
  start_parameters:Parameter(s) to pass in to the start_method.
  stop_class:   The class to load when stopping the service.
  stop_method:  The method to call in the stop_class. default: main
  stop_parameters:      Parameter(s) to pass in to the stop_method.
  out_log_file: A file to redirect System.out into. (gets overwritten)
  err_log_file: A file to redirect System.err into. (gets overwritten)
  current_dir:  The current working directory for the service. Relative paths will be relative to this directory.
  extra_path:   Path additions, for native DLLs etc. (no spaces)
  other_service:        Single service name dependency, must start first.
  auto / manual:        Startup automatic (default) or manual mode.
  seconds:      Java method processing time (startup:sleep, shutdown:timeout).
  user_name:    User specified to execute the service (user@domain).
  password:     Password applicable if user specified to run the service.
  append / overwrite:   Log file output mode, append (default) or overwrite.
  service_desc: Text describing installed service (quoted string, max 1024).
-----------------------------------------------------------------------------------------------------
저 위에서 service_name, jvm_library, start_class 옵션 정도만 사용해서 한번 install 해볼 예정이야..
jvm_option 은 필요할때 사용하고, start_method 는 대부분 main() 일테니 생략하자구..

[STEP3] 테스트 java 클래스 만들기

지금 테스트 하려고 하는데.. 아.. 간단한 클래스 없을까 하다가..
간단하게 10초에 한번씩 standard out으로 "hello word"를 찍는 클래스를 만들어보려구 해..
Timer 나 TimerTask 에 대한 것은 API를 참조해바바.. (자꾸 말로 물어서 해결하려하지 말구...)
-----------------------------------------------------------------------------------------------------
package test;

import java.util.Timer;
import java.util.TimerTask;

public class HelloWorldPrinter extends TimerTask {
    private static int count = 0;
    public void run() {
        count ++;
        System.out.println(count + " : Hello World !");
    }

    public static void main(String[] args) {
        HelloWorldPrinter printer = new HelloWorldPrinter();
        Timer timer = new Timer();
        timer.schedule(printer, 0, 10 * 1000);
    }
}
-----------------------------------------------------------------------------------------------------


이 클래스를 빌드해서 C:\temp\classes\test\HelloWorldPrinter.class 에 놓어보자구효~

[STEP4] Windows Service에 클래스 등록하기

아래와 같은 정보로 서비스를 등록해볼 참이야..
service_name : HelloWorldPrintingService
jvm_library : %JAVA_HOME%\jre\bin\server\jvm.dll
jvm_option : Djava.class.path=.\classes
start_class : test.HelloWorldPrinter
out_log_file : C:\temp\javaservice_test.log (테스트 결과확인을 위해 등록)
도스커멘드에서 아래의 커멘드를 실행시켜서 서비스로 등록을 해보자구..
-----------------------------------------------------------------------------------------------------
JavaService -install "HelloWorldPrinting Service" %JAVA_HOME%\jre\bin\server\jvm.dll -Djava.class.path=c:\temp\classes -start test.HelloWorldPrinter -out C:\temp\javaservice_test.log
-----------------------------------------------------------------------------------------------------


자.. 멋지게 등록되었고 SC를 이용해 서비스 등록상태까지 확인해봤어..

[STEP5] 서비스 실행하기

-----------------------------------------------------------------------------------------------------
net start "HelloWorldPrinting Service"
-----------------------------------------------------------------------------------------------------
이렇게 실행하고 서비스 등록시에 지정했던 로그파일을 보자구.. C:\temp\javaservice_test.log 에는 아래와 같이 찍혀있을꺼야..
1 : Hello World !
2 : Hello World !
3 : Hello World !
4 : Hello World !
5 : Hello World !
6 : Hello World !
7 : Hello World !
8 : Hello World !
9 : Hello World !
10 : Hello World !
성공이닷 !!

[STEP6] 서비스 종료하기
-----------------------------------------------------------------------------------------------------
net stop "HelloWorldPrinting Service"
-----------------------------------------------------------------------------------------------------

[STEP7] 서비스 삭제하기

-----------------------------------------------------------------------------------------------------
JavaService -uninstall "HelloWorldPrinting Service"
-----------------------------------------------------------------------------------------------------

파일 첨부해놨으니 쉽게 테스트 할수 있을꺼야.. 수고했샤~~
Posted by 꼰스
Java/Tip & Tech2012. 1. 6. 23:32
[ 2010년 05월 14일에 작성된 글입니다 ]

업계표준이 참으로 무섭기는 한가봅니다. 그토록 M$ 를 싫어하지만 내가 쓰는 OS도, 내가 쓰는 Office 도 모두 M$ 이니깐요.. (Open Office 바꿔타기를 해봐야하눈뎅.. ㅡㅡ;)
이같은 심정은 IT 시스템 개발을 발주하는 고객사 또한 마찬가지가 아닐까 합니다. 때문에 싫던 좋던 프로젝트 수행중에 Java 플랫폼에서 M$ Office 포멧을 다뤄야 하는 경우가 다반사입니다. M$ 오피스군의 파일포멧을 다룰 수 있는 Java 기반의 라이브러리는 뭐니뭐니해도 Apache POI 가 아닐까 합니다.

너무 많이 알려진 라이브러리이므로 장황하게 설명할 필요하는 없을듯하고 2009년12월에 발표된 POI-3.6 최신버전으로 여러가지 Excel 을 다루는 샘플을 만들어봤습니다. Deprecated 된 메쏘드들은 모두 새로운 사용법으로 교체되었으니 참고하세요.

예제를 실행시키기 위한 환경 및 참조된 문서는 아래와 같습니다.

[JRE]
jdk-1.6.x 이상 필요
※ jdk-1.5.x 환경은 예정실행시 "NoClassDefFoundError: javax/xml/stream/XMLStreamException" 가 발생됨

[POI 다운로드]
http://poi.apache.org/download.html

[의존성]
xmlbeans - http://xmlbeans.apache.org/sourceAndBinaries/index.html
dom4j : http://sourceforge.net/projects/dom4j/files/

[문서링크]
POI의 Excel 관련 문서홈 - http://poi.apache.org/spreadsheet/index.html
바쁜개발자를 위한 HSSF와 XSSF 가이드 - http://poi.apache.org/spreadsheet/quick-guide.html ★★★★
HOW-TO 문서 - http://poi.apache.org/spreadsheet/how-to.html

예제파일은 여기 있습니다.


동일한 Class명이 여러 패키지에 존재하니 예제 상단의 import 구문을 세심히 체크해야 할 것이다.
Posted by 꼰스
Java/Tip & Tech2012. 1. 6. 23:22

RIA 개발시 Ajax 를 많이 사용하다보니 서버 응답 포멧이 XML 이나 JSON 이 대부분일 것입니다.

Java에서 String 연산으로 JSON 을 생성할 경우 예상치 못한 특수문자 오류를 만나게 되며 디버깅 또한 쉽지 않습니다. 따라서 기존에 잘 만들어진 JSON 변환 라이브러리를 사용하는 것이 현명한 선택일 것입니다.

현재 배포되고 있는 JSON 스팩 구현체들은 상당히 다양합니다. 이 여러가지 가운데 무엇을 써야할지 선택하는 것조차 쉽지 않습니다. 여러 방면으로 검토한 후 가장 쓸만한 라이브러리를 링크를 걸어봅니다.


날이 갈수록 봐야할 자료가 너무 많아 탈이날 지경이네요. ^^

첨부된 파일은
1) json.jar - 라이브러리 파일 

2) json_doc.zip - java doc
3) json_src.zip - 라이브러리 소스파일

json.jar

json_doc.zip

json_src.zip


JSON 에 대해 보다 상세한 내용은 http://www.json.org 을 참조하시기 바랍니다.


Posted by 꼰스