출처 : http://likebnb.tistory.com/97


최근에 자바 애플릿을 만들 일이 있었다.
프로그램을 열심히 작성하고 에러 없이 컴파일까지 완료하였다.
그런데 JAR로 압축하여 웹서버로 배포하여 테스트를 하는데 다음과 같이 에러를 내뿜고 동작하질 않았다.

원인은 아래 그림의 Caused by로 시작되는 줄에 나타난 것 처럼 인증되지 않는 JAR의 실행이 인증예외를 발생시킨 탓이다.
그도 그럴 것이 Java Applet은 로컬 PC로 다운로드 되어 실행되는 것으로 로컬 PC의 자원에 대한 접근이 가능하기 때문에
이를 아무런 제약 없이 실행하게 둘 수 없다는 보안 규칙 때문이다.

java.security.cert.CertificateException: Certificate has been denied at...





그렇다면 결론은? 그렇다. 개발된 JAR를 보안 인증서로 서명하여 배포하면 된다.

그래서 오늘 함께 알아 볼 내용은 개발 및 테스트를 위한 과정에서 임시 인증서를 이용하여 테스트를 위한 서명된 JAR를 만들어 보는 
것이다. 이를 위해 JAVA 개발킷에 함께 딸려 온 keytool과 jarsigner라는 유틸리티가 필요하다.



1. 제일 먼저 키저장소를 새로 생성한다.

keytool -genkey -keystore likebnb.keystore -alias likebnb







2. 생성된 키저장소를 자가인증(self certificate)한다.

keytool -selfcert -alias likebnb -keystore likebnb.keystore






3. 인증된 키저장소를 확인한다.

 keytool -list -keystore likebnb.keystore







4. 키저장소를 이용하여 JAR에 서명을 한다.

 jarsigner -keystore likebnb.keystore test.jar likebnb






5. 서명된 JAR와 그렇지 않은 원본 JAR는 다음과 같이 파일의 크기가 다름을 알 수 있다.





이상과 같이 JAR를 인증서로 서명하여 웹에서 사용할 수 있도록 하는 방법을 알아 보았다. 추가로 ant 등을 이용하여 컴파일을 하기
위해서는 아래 구문과 같이 build.xml 파일을 수정해 주어야 한다.

  <target name="signjar">
    <signjar alias="likebnb" jar="build/jars/test.jar"
     keystore="../likebnb.keystore" storepass="my.password" />
    <delete dir="build/classes"/>
  </target>



이상의 방법은 어디까지나 테스트를 목적으로 하는 임시 인증서 및 서명이므로 실제로 배포할 때에는 공인인증기관에서 발급 받은
인증서를 가지고 서명해야 하는 것은 두말할 것 없는 일이다. 어쨌든 개발하고 있는 애플릿을 테스트 해보기 위해선 알아두면 좋겠다.

JasperForge.org에서 JasperReports를 다운받는다.

http://jasperforge.org/plugins/project/project_home.php?group_id=102

회원 등록 하지 않고 다운 받으려면  No Thanks, Continue to Download  를 누르면 된다.

3.7.2가 이틀전에 나왔다.  몇일전 해본 iReports도 다시 설치했다.


다운받으면 dist 폴더에 있는 jar 파일들을
WEB-INF\lib 에 복사한다. 이것으로 기본 설치는 끝이다.

jasperreports-3.7.2.jar
jasperreports-applet-3.7.2.jar
jasperreports-fonts-3.7.2.jar
jasperreports-javaflow-3.7.2.jar


이제 같이 들어있는 샘플로 테스트를 한다.

테스트 샘플은
jasperreports\demo\samples\webapp
에 있는 것으로 했다.  너무 많아서 고르기가 어려운데 jsp로 구현할 거라 webapp 폴더에 있는 것으로 해보기로 했다.

webapp에 있는 모든 파일을 tomcat 웹서비스 되는 기본 폴더에 모두 복사를 한다.

jasperreports\demo\samples\webapp\WEB-INF\classes 에 있는 java 파일들은 컴파일해서 class파일로 만들어야 한다.
eclipse를 사용하면 src 폴더에만 넣으면 자동으로 해준다.

샘플이 실행되려면 추가로 아래 파일이 필요하다.
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-digester-2.0.jar

http://commons.apache.org/ 에서 다운 받으면 된다.
역시 WEB-INF\lib 에 복사하고, tomcat을 재시작한다.

iText-2.1.7.jar
iTextAsian.jar
위 파일들도 lib에 복사한다. 이 파일들은 iReport를 설치하면 설치 폴더에서 찾을 수 있다. PDF 출력시 필요한 파일들이다.


http://localhost/index.html 을 실행해서 아래 화면이 나오면 잘 된 것이다.



JRXML를 컴파일한다.



성공하면 다음 메시지가 나온다.



Data를 채운다.


성공하면 다음 메시지가 나온다.




HTML Export를 먼저 해본다.





다음 같이 나오면 성공이다.
중간에 한글을 넣어봤는데 잘 안나온다. euc-kr이나 utf8 로 변경하면 잘 나올 것 같다.



PDF로 만드는 건 한글이 잘 안된다.
iReport할때 했던 방식으로 파일을 만들고 했는데 한글이 안나온다.
폰트를 여기저기 다 넣어봤는데도 안된다.

http://blog.naver.com/minis24?Redirect=Log&logNo=80097851388

위 링크로 가서 보고 build/classes 에 폰트를 넣으니 된다.


iReport에서는
Pdf Font를 HYGoThic-Medium,
Pdf Encoding을 UniKS-UCS2-H (Korean) 로 하면 잘 안된다.
하지만 jsp에서 하면 한글이 잘 나온다.

그렇지만 위 링크에 있는 방식이 iReport와 jasperReport 모두 잘 되고,
폰트 변경도 가능해서 좋을 것 같다. 폰트 크기가 크면 다운받을때 좀 부담되지만 일단 한가지 방법이라도 성공하면 오케이...

샘플이 일단 성공했으니 이제 반은 성공한 셈이다. ^^

(참고)
다른 폰트들도 테스트를 해봤는데 파일이 좀 큰 건 안된다.
Java에 Heap 메모리 에러가 나니까 크기를 늘려주면 될 것 같은데 일단 작은걸로 잘되니 문제는 없다.

폰트 폴더에 복사해 놓고 아래와 같이 해주면 되는데 fontName는 중요하지 않지만 안쓰면 한글이 안나온다.

<font fontName="굴림" pdfFontName="fonts/H2GPRM.TTF" pdfEncoding="Identity-H" isPdfEmbedded="false"/>


open source Report tool 을 찾아보던중 iReport라는 것이 있어서 사용해 봤다.

http://jasperforge.org/plugins/project/project_home.php?group_id=83

에 있는 튜토리얼을 따라하면 되는데 한글이 PDF로 안 만들어진다.

웹에서 찾아보고 따라해봐도 안된다.  버젼이 바뀌면서 달라진 것 같다.

해서 여러가지 해봤는데 3시간정도 걸려서 찾은 결과는 간단하다.


우선 폰트를 등록한다.
c:\windows\fonts 밑에 있는 맑은 고딕 (MALGUN.TTF)을 추가했다.


추가하면 C:\Program Files\Jaspersoft\iReport-3.7.1\ireport\fonts 에 파일이 생긴다.




한글이 있는 텍스트 박스를 선택하고 위 그림처럼 해주면 된다.
Pdf Font는 써주고, Pdf Encoding은 선택한다.

Pdf Font : 폰트 파일명
Pdf Encoding : Identity-H (Unicode with horizontal writing)


Pdf Embedded는 선택해제해도 된다.

폰트는 True Type 폰트면 되는 것 같다. 모두 테스트 해보지는 못했다.


메뉴에서 Preview를 PDF로 해주고 Preview를 보면 PDF viewer가 실행되고 한글도 나오게 된다.
static으로 제목만 테스트했고, DB에서도 한글을 잘 가져와서 보여주는 건 해봐야 겠다.

JasperReports 와도 연동해야 하고 넘어야 할 산이 많다....

+ Recent posts