Transaction 이란.
  : 컴퓨터 프로그램에서 트랜잭션의 일반적인 의미는 정보의 교환이나 데이터베이스 갱신 등
    연관되는 작업들에 대한 일련의 연속을 의미한다. (http://www.terms.co.kr/transaction.htm)

이번 프로젝트에 ORM이 무엇인지도 처음 들었고 또한 ORM프레임워크중에 한 종류인 Hibernate또한
처음 사용해보면서 느꼈던 점은 ..

어렵다 이다.-_-; 마냥 어려운거임.

뭐 어찌됐든 프로그래머로써 Transaction을 무시할 수 있는 프로그래머는 없을터.

프로젝트를 진행하던 도중 org.hibernate.TransactionException: Transaction not successfully started의

예외상황이 자꾸 발생하길래 디버깅 고고.

(사실은 무시하려했지만 심각 :
 Servlet.service() for servlet default threw exception이라는 메세지만 내가 보지 못했더라면...ㅋㅋ)

현재 MVC 프레임워크로 Struts2를 사용하고 있는데 이 에러가 나는 페이지들을 검사해 보았더니

Action이 Chain으로 묶여있는(연쇄호출되는) 요청들은 다 이 예외를 뱉어내고 있었다.

트랜잭션 begin -> 커밋 or 롤백 -> 트랜잭션 close의 정상적인 과정이 아닌 중간에 커밋하지 않고 begin을 두번 수행하는걸 발견 (커밋이 두번이였던가.-_-;; 뭐어쨌든 발견했다는게 중요한거 아니겠음?)

현재 트랜잭션의 코딩 패턴은 OSIV패턴(Open session in view)으로 구현되어있었고.
(최범균저 (Hibernate3 프로그래밍) 책에 나와있는 패턴)

책에는 Servlet Filter로 구현되어있었지만 현재 프로젝트에선 Interceptor로 구현.

정확하고 자세한 건 Struts2의 Interceptor의 아키텍쳐를 다시 한번 봐야겠지만

Chain으로 또 다른 Action을 수행할때에 다시 한번 Interceptor를 타기때문에 commit하기도 전에 또다시

Transaction을 begin하는것 같았다.

결국 Interceptor로 구현되어있는 Transaction처리 로직을 Servlet Filter로 재구현해서 테스트해서

다행히 이 문제를 해결.

(또 나면 어쩌지?ㅠㅠ)




이 포스팅을 100% 전적으로 믿지 마세요.(나중에 또 이상황이 발생했을때 참고하려고 적는 글입니다.)







신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

Out Of Memory

language/java 2009.06.12 20:49
이클립스로 웹프로젝트 개발을 하다보면 사용하는 클래스의 양이 늘어남에 따라 간간히 PermGen Space라는 메세지와 함께 Out Of Memory Error가 뜨면서 서버가 다운되는 경우가 있다.

그동안은 그냥 서버를 재시작하면서 개발을 해왔지만 이번프로젝트에서는 위 상황이 상당히 많이 발생하여서

검색해보니 PermGen이란 Permanent generation이라는 JVM의 메모리영역이며 이 메모리영역에 클래스의 정보가 로드되어진다고 나와있다.

대략 계산해보니 이번프로젝트에 쓰이는 클래스파일이 대략 3500개정도 되는데 아마도 자주 발생한 이유가
Permanent 영역을 기본으로 잡아주어서 그런것같다.

그러다 검수를 앞두고 이번엔 java heap space 메세지의 Out Of Memory Error가 발생..

보안테스트 도중 발생하였는데 테스트를 직접 고객사 담당자가 해서 통보받았으니 정말 진땀이 나던 상황이었다.

일단 이 문제를 해결하기 위해 검색을 하던도중. 지금까지 내가 발로 개발을 했구나 라는 생각이 스물스물...

그냥 저냥 돌아가기만 하면 되지. 라는 생각으로 만들었던 생각이 들며 나 자신에게 참 부끄러운 하루였다.

또한 자바에 대한 조금의 지식을 더 얻고 이해하는 시간이기도..

일단 서론은 여기에서 접고.

난 문제점이 Memory Error이기때문에 프로그램의 실행중 JVM영역의 메모리상태를 프로파일링하고자 이리저리 검색하던도중 블로그를 운영하시는 어떤 개발자분의 http://www.tuning-java.com/248  게시물에서 좋은 정보를 얻었다.

jdk\bin\jvisualvm.exe 라는 파일인데 실행중인 모든 JVM을 모니터링 하는 프로그램이다.

이번개발은 JDK6 버젼으로 하고있어서 기본으로 들어있다.

일단 이 프로그램(Java VisualVM)을 실행시킨후 톰캣을 실행.

Java VisualVM 에서 톰캣이 실행이되면 알아서 톰캣을 실행하는 JVM을 catch~

catch된 JVM을 오른쪽버튼 OPEN한다.

아래 그림과 같이 나온다.


위는 현재 내가 검사하고 있는 화면이라 초기화면이랑은 조금 틀리지만 현재 실행중인 톰캣의 JVM의 상태를 확인할 수 있다.

OverView는 여러가지 환경정보들이 있다. JVM arguments, System properties등등..

다음으로 Monitor탭을 보자.



현재 JVM 의 Heap영역의 상태를 보여주고 있다.

위 그림을 보면 현재 약 3시간이 넘게 톰캣을 실행중이며 시간대별로 Heap영역의 메모리점유율 상태를

그래프와 수치로 보여준다. 또한 우상단에 Heap Dump버튼을 클릭하면 클릭하는 시점의 Heap영역의 메모리점유율 덤프가 생성된다.(객체의 instance갯수, 현재 차지하고 있는 메모리용량(%, 수치) 를 볼 수 있다.

덤프된 화면은 아래와같다.


이것을 보고 문제점이 무엇인지 대략 유추할 수 있었고.

몇시간의 테스트끝에 99% 확실한 문제점을 찾아낼 수 있었다.

개발을 하면서 간과했던점이 웹어플리케이션 전체에서 코드값을 사용하는데 이값을 어플리케이션 속성에 담아놓고 쓰지 않고 세션에 담아서 쓰고 있었다.

세션은 웹페이지를 요청하는 사용자 한명당(요청수가아니다.) 한개식 생성이되며 현재 session timeout 시간은 7일이다.......-_-

스트레스툴로 여러번의 XSS공격과 SQL Injection공격등등을 하며 테스트를 하는걸 상상해보면 계속해서 쌓여가는 세션때문에 결국엔 메모리의 한계가와 Out Of Memory를 토해내는 것이었더랬지..

뭐 톰캣의 JVM Heap메모리 설정을 기본으로 잡고 했던것도 문제점이긴하다.

일단 해결법은 JVM 메모리영역을 늘려주고 Session TimeOut시간을 30분에서 1시간정도를 잡아주면 될것같다.

다음부턴 절대 세션에 코드값을 담는 일은 하지 않도록 다짐하면서..



2009년 6월 더운 초여름날 두달째 야근을 하며 폐인의 모습으로







아참!오픈소스 스트레스툴로 Jmeter라는것도 있다. (좋드만 ㅋ)
저작자 표시 비영리 변경 금지
신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

java의 java.awt패키지는 이미지처리시 운영체제의 자원을 사용한다.

윈도우즈의 경우에는 아무설정을 해주지 않아도 잘돌아가지만(그래서 어떤방식인지는 아직 잘모르겠다.)

유닉스나 리눅스 시스템 환경에서는 X11이라는 흔히 말하는 X-window가 설치되어있고 데몬이 구동되고 있을시에

패키지사용이 가능하다.

보통 웹상에서 JSP & SERVLET을 이용 이미지 썸네일을 구현할시에 여러가지 방식이 있겠지만

나는 JAI를 사용한다.

JAI(Java Advanced Imaging ) 는 SUN에서 발표한 이미지 처리를 위해 만들어 진 API이다.

필요한 jar파일은 jai_core.jar, jai_codec.jar가 필요하다.(sun 홈피에서 다운받을수 있다.)

JAI또한 내부에선 java.awt.를 사용한다.

대략적인 설명을 마치고

================================================================================================

어제부터 썸네일 생성시 에러가 나면서 로그파일에

java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
 at java.lang.Class.forName1(Native Method)
 at java.lang.Class.forName(Class.java(Compiled Code))
 at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:91)
 at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1073)
 at com.nowonplay.hover.image.ImageConverter.create(ImageConverter.java:295)
 at com.nowonplay.hover.image.ImageConverter.create(ImageConverter.java:254)
 at com.nacf.util.ImageUtil.createThumbnail(ImageUtil.java:32)
 at jeus_jspwork._media._vodRrcCenter._photo._403_write._jspService(_403_write.java:346)
 at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:269)
 at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:102)
 at jeus.servlet.jsp.JspServletWrapper.execute(JspServletWrapper.java:63)
 at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:175)
[2008.08.28 12:25:28][1] [SRVL-2456] [E] (/media/vodRrcCenter/photo/write.jsp) fail to execute servlet

이러한 메세지가 남아있다..

검색해보니 X11자원을 찾기 못하는것 같았다..아니면 설치되어 있지 않던가.

첫번째 방법은 일단 X11이 설치되어 있지 않다면 설치해야한다.

설치가 되어있는 상태라면 웹서버의 설정파일에서

jvm구동 옵션에 -Djava.awt.headless=true 을 포함해서 웹서버를 재시작 하면 X11데몬을 띄우지 않고

X11의 자원을 사용할 수 있다.


신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

Commons-Lang




IV. org.apache.commons.lang.StringUtils


java api의 String을 보면 문자열 처리하기에는 제공하는 기능들이 너무 빈약합니다.

그래서 프로그래머들은 자기 나름데로의 독특한 Utils를 만들어 사용하지요.

하지만 Commons-lang에서 제공하는 StringUtils를 사용한다면 더이상 자신만의 Utils를 사용할 필요가 없습니다. 여기 모두 ㄷ ㅏ ~ 있기 때문이지요 ^^

한가지 더 장점이 있다면 String의 null 값때문에 더이상 NullPointerException을 생각하지 않아도 된다는 것입니다. StringUtils에서 ㄷ ㅏ ~ 알아서 해주기 때문입니다.


그럼 어떠한 기능들의 함수가 있는지 알아봅시다


반환값 함수명 파라미터
String abbreviate String str, int maxWidth
"…"를 포함한 지정한 사이즈로 문자열을 축소한다 maxWidth은 4보다 커야한다
String abbreviate String str, int offset, int maxWidth
"…"를 포함한 지정한 사이즈로 문자열을 앞/뒤로 축소한다 offset은 7보다 커야한다
String capitalise String str
deprecated
String capitaliseAllWords String str
deprecated
String capitalize String str
문자열중 첫번째 문자를 대문자로 만든다
String center String str, int size
str의 길이가 size가 되도록 문자열 좌우에 공백문자를 하나씩 추가한다 (우측부터 시작한다)
String center String str, int size, char padChar
str의 길이가 size가 되도록 문자열 좌우에 padChar를 하나씩 추가한다 (우측부터 시작한다)
String center String str, int size, String padStr
str의 길이가 size가 되도록 문자열 좌우에 padStr을 하나씩 추가한다 (우측부터 시작한다)
String chomp String str
문자열 맨 끝에있는 '\n' , '\r', '\r\n'을 제거한다
String chomp String str, String separator
문자열 맨 끝에 separator가 있으면 이를 제거한다
String chompLast String str
deprecated
String chompLast String str, String sep
deprecated
String chop String str
문자열 맨 끝에있는 문자 하나를 제거한다
String chopNewline String str
deprecated
String clean String str
deprecated
String concatenate Object array[]
deprecated
boolean contains String str, char searchChar
str이 searchChar를 포함하고 있으면 true
boolean contains String str, String searchStr
str이 searchStr을 포함하고 있으면 true
boolean containsNone String str, char invalidChars[]
str이 invalidChars의 각 문자를 모두 포함하고 있지 않으면 true
boolean containsNone String str, String invalidChars
str이 invalidChars를 모두 포함하고 있지 않으면 true
boolean containsOnly String str, char valid[]
str이 valid의 각 문자들만 포함하고 있어야 true
boolean containsOnly String str, String validChars
str이 validChars 들만을 포함하고 있어야 true
int countMatches String str, String sub
str중에 sub가 포함되어있는 갯수를 반환한다
String defaultString String str
str이 null이면 ""를 반환하고 아니면 str을 반환한다
String defaultString String str, String defaultStr
str이 null이면 defaultStr을 반환하고 아니면 str을 반환한다
String deleteSpaces String str
deprecated
String deleteWhitespace String str
문자열중 공백문자가 있으면 모두 제거한다
String difference String str1, String str2
str1과 str2를 비교하여 다른부분을 반환한다 (str2의 부분을 반환)
boolean equals String str1, String str2
str1이 null이면 str2가 null인지 유무를 반환하고 str1이 null이 아니면 str1과 str2의 equals를 반환
boolean equalsIgnoreCase String str1, String str2
equals와 동일하며 대소문자를 무시하고 비교한다
String escape String str
deprecated
String getChomp String str, String sep
deprecated
String getNestedString String str, String tag
deprecated
String getNestedString String str, String open, String close
deprecated
String getPrechomp String str, String sep
deprecated
int indexOf String str, char searchChar
str에서 첫번째 searchChar의 인덱스를 반환한다
int indexOf String str, char searchChar, int startPos
str의 startPos 인덱스부터 첫번째 searchChar의 인덱스를 반환한다
int indexOf String str, String searchStr
str에서 첫번째 searchStr의 인덱스를 반환한다
int indexOf String str, String searchStr, int startPos
str의 startPos 인덱스로부터 첫번째 searchStr의 인덱스를 반환한다
int indexOfAny String str, char searchChars[]
str에서 searchChars중 포함하고 있는 문자의 첫번째 인덱스를 반환한다
int indexOfAny String str String searchChars
str에서 searchChars중 포함하고 있는 문자열의 첫번째 인덱스를 반환한다
int indexOfAny String str, String searchStrs[]
str에서 searchStr중 포함하고 잇는 문자열의 첫번째 인덱스를 반환한다
int indexOfAnyBut String str char searchChars[]
str에서 searchChars중 포함되지 않은 문자 첫번째 인덱스를 반환한다
int indexOfAnyBut String str, String searchChars
str에서 searchChars중 포함되지 않은 문자 첫번째 인덱스를 반환한다
int indexOfDifference String str1, String str2
str1과 str2를 비교하여 문자열이 틀려지기 시작하는 인덱스를 반환한다
boolean isAlpha String str
문자열이 모두 Character.isLetter 이면 true (모두 문자이면 true)
boolean isAlphanumeric String str
문자열이 모두 Character.isLetterOrDigit 이면 true (문자거나 숫자이면 true)
boolean isAlphanumericSpace String str
문자열이 모두 Character.isLetterOrDigit 이거나 공백이면 true
boolean isAlphaSpace String str
문자열이 모두 Character.isLetter 이거나 공백문자이면 true
boolean isBlank String str
문자열이 공백문자이거나 길이가 0이거나 null인경우 true
boolean isEmpty String str
문자열이 길이가 0이거나 null인경우 true
boolean isNotBlank String str
문자열이 공백문자도 아니고 길이가 0도 아니고 null도 아니면 true
boolean isNotEmpty String str
문자열이 길이가 0이 아니고 null도 아니면 true
boolean isNumeric String str
문자열이 모두 Character.isDigit 이면 true (모두 숫자이면 true)
boolean isNumericSpace String str
문자열이 모두 Character.isDigit 이거나 공백문자이면 true
boolean isWhitespace String str
문자열이 모두 Character.isWhitespace 이면 true (모두 공백이면 true)
String join Object array[]
array에서 문자열을 읽어와 모두 연결시킨다
String join Object array[], char separator
array에서 문자열을 읽어와 separator를 구분자로 연결시킨다
String join Object array[], String separator
array에서 문자열을 읽어와 separator를 구분자로 연결시킨다
String join Iterator iterator, char separator
iterator에서 문자열을 읽어와 separator를 구분자로 연결시킨다
String join Iterator iterator, String separator
iterator에서 문자열을 읽어와 separator를 구분자로 연결시킨다
int lastIndexOf String str, char searchChar
str에서 마지막 searchChar의 인덱스를 반환한다
int lastIndexOf String str, char searchChar, int startPos
str의 startPos 인덱스부터 마지막 searchChar의 인덱스를 반환한다
int lastIndexOf String str, String searchStr
str에서 마지막 searchStr의 인덱스를 반환한다
int lastIndexOf String str, String searchStr, int startPos
str의 startPos 인덱스부터 마지막 searchStr의 인덱스를 반환한다
int lastIndexOfAny String str, String searchStrs[]
str에서 searchStr의 문자열들중 포함하고 있는 문자열의 마지막 인덱스를 반환한다
String left String str, int len
str의 좌측에서 len 길이만큼 문자열을 구한다
String leftPad String str, int size
str의 길이가 size가 되도록 문자열 왼쪽에 ' '을 추가한다
String leftPad String str, int size, char padChar
str의 길이가 size가 되도록 문자열 왼쪽에 padChar를 추가한다
String leftPad String str, int size, String padStr
str의 길이가 size가 되도록 문자열 왼쪽에 padStr을 추가한다
String lowerCase String str
str을 소문자로 변환한다
String mid String str, int pos, int len
str의 pos 인덱스부터 len 길이만큼의 문자열을 구한다
String overlay String str, String overlay, int start, int end
str의 start부터 end까지overlay로 변환한다
String overlayString String text, String overlay, int start, int end
deprecated
String prechomp String str, String sep
deprecated
String repeat String str, int repeat
str을 repeat만큼 반복하여 반환한다
String replace String text, String repl, String width
text에서 모든 repl을 width로 변환한다
String replace String text, String repl, String width, int max
text에서 모든 repl을 width로 변환하는데 최대 max개만큼 변환한다
String replaceChars String str, char searchChar, char replaceChar
str에서 searchChar를 replaceChar로 모두 변환한다
String replaceChars String str, String searchChars, String replaceChars
str에서 searchChars를 replaceChars로 모두 변환한다
String replaceOne String text, String repl, String width
text에서 repl를 width로 변환하는데 첫번째 하나만 변환한다
String reverse String str
문자열을 앞뒤 순서를 바꾼다
String reverseDelimited String str, char separatorChar
separatorChar를 구분으로 문자열을 나눈 후 나눠진 단어들을 역순으로 바꾼다
String reverseDelimitedString String str, String separatorChars
deprecated
String right String str, int len
str의 len길이만큼 우측에서 문자열을 구한다
String rightPad String str, int size
str의 길이가 size가 되도록 문자열 오른쪽에 ' '을 추가한다
String rightPad String str, int size, char padChar
str의 길이가 size가 되도록 문자열 오른쪽에 padChar를 추가한다
String rightPad String str, int size, String padStr
str의 길이가 size가 되도록 문자열 오른쪽에 padStr을 추가한다
String[] split String str
공백문자를 구분자로 사용하여 분리한다
String[] split String str, char separatorChar
separatorChar를 구분자로 사용하여 분리한다
String[] split String str, String separatorChars
separatorChars를 구분자로 사용하여 분리한다
String[] split String str, String seperatorChars, int max
separatorChars를 구분자로 사용하여 분리한며 최대 max개 만큼한다. 배열의 크기는 max가 된다
String strip String str
문자열 좌우에 있는 공백문자를 제거한다 trim과 동일하다
String strip String str, String stripChars
문자열 좌우에 stripChars에 존재하는 문자를 제거한다
String[] stripAll String strs[]
배열에 있는 모든 문자열 좌우에 있는 공백문자를 제거한다
String[] stripAll String strs[], String stripChars
배열에 있는 모든 문자열 좌우에 stripChars에 존재하는 문자를 제거한다
String stripEnd String str, String stripChars
문자열 우측에만 strip 한다
String stripStart String str, String stripChars
문자열 좌측에만 strip 한다
String stripToEmpty String str
str이 null이면 ""를 반환하고 아니면 strip 한다
String stripToNull String str
str이 null이면 null을 반환하고 아니면 strip 한다
String substring String str, int start
str의 start 인덱스부터 문자열을 구한다
String substring String str, int start, int end
str의 start 부터 end 인덱스 까지 문자열을 구한다
String substringAfter String str, String separator
str의 처음 separator 부분부터 문자열을 구한다
String substringAfterLast String str, String separator
str의 마지막 separator부분부터 문자열을 구한다
String substringBefore String str, String separator
str의 처음 separator 부분까지 문자열을 구한다
String substringBeforeLast String str, String separator
str의 마지막 separator부분까지 문자열을 구한다
String substringBetween String str, String tag
str에서 tag 사이에 있는 문자열을 구한다
String substringBetween String str, String open, String close
str에서 open부터 close 까지 사이에 있는 문자열을 구한다
String swapCase String str
대문자는 소문자로 변환하고 소문자는 대문자로 변환한다
String trimToNull String str
str이 null이거나 length가 0이면 null을 반환하고 그렇지 않으면 좌우 공백문자를 제거한다
String trim String str
문자열 좌우 공백문자를 제거한다
String trimToEmpty String str
str이 null이면 ""를 반환하고 그렇지 않으면 좌우 공백문자를 제거한다
String uncapitalise String str
deprecated
String uncapitalize String str
문자열의 첫문자를 소문자로 변환한다
String upperCase String str
str을 대문자로 변환한다

사용법

모두 static 함수이기때문에 다음과 같이 사용하면 됩니다.

String text = StringUtils.replace(str, repl, width);


=============================================

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

http://jonggyu.com/blog/tag/eclipse?TSSESSION=2263d701401abfef3b614c1e5ff6bcdc#entry_13

http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

http://kwon37xi.egloos.com/2852803

아주. 어젯밤부터 지금까지 캐삽질끝에...겨우 연결성공...

근데...좌절...

나 바보? ㅠ_ㅠmysql jdbc jar파일을 ...WEB-INF/lib에 놔서 된줄알았는데...

결국엔 그것때문에 안먹었다는..분명히 이클립스에서 빌드패스도 잡혔었는데...

이거 뭥미.-_-

결국엔 tomcat5.5/common/lib에 갔다놓고 실행했더니 바로되는..쿨럭;

아...완전 삽질..정말...

그덕에 한 1년간은 이 설정하는건 절대 까먹지 않겠군..-_-
신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

<%@ page contentType="application/vnd.ms-excel; charset=euc-kr" %>

contentType을 위와 같이 선언.

<%
String file_name = "ExcelTest.xls";

response.setHeader("Content-Disposition", "attachment; filename=\"" + file_name + "\";");

response.setHeader("Content-Description", "JSP Generated Data");
%>


Header정보를 위와 같이 세팅해준다.

-_-쉽다. 근데..문제는 이미지파일은 저장이 안된다.

방법없을까..ㅠ_ㅠ

신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

Tag Excel, jsp

위 첨부파일을 classpath에 추가한후

import com.sun.jimi.core.Jimi;
import com.sun.jimi.core.JimiException;
import com.sun.jimi.core.JimiUtils;
import java.awt.Image;
import java.io.File;

public class JimiTest {
    public static void main(String [] args) {
        String UPLOAD_PATH = "C:" + "/" +
                             "my work" + "/" +
                             "java exam" + "/" +
                             "data";
        String imgFile    = "sample.jpg";
        
        Image thumbnail = JimiUtils.getThumbnail("C:/" + imgFile, 150, 150, Jimi.IN_MEMORY);

        try {
            Jimi.putImage(thumbnail, UPLOAD_PATH + "/" + imgFile);
        } catch (JimiException e) {
            e.printStackTrace();
        }
    }
}

간단히 작성해 보았다.

중요한건 getThumbnail메소드로 image객체를 얻어온 후 putImage 로 저장한다.

끝 -_-



신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

ResourceBundle의 활용

by kkaok
2003-05-12


API 위치
java.util.ResourceBundle


역할
프로그램 배포시 고정된 자원과 변화하는 자원이 있다.
게시판 배포를 예로 든다면 안에 소스는 대부분 고정된 자원이다. 하지만 사용자마다 database의 설정 등은 수정해서 사용해야 하는 부분이다.
이러한 값들은 프로그램의 알고리즘과 상관없는 부분으로 따로 관리해야 하는 자원들이다. 이러한 자원은 파일로 저장해서 관리하는 것이 보편적 추세로 ResourceBundle을 이용 할 수 있다.


아래는 현제 사용중이 properties 파일이다.

ADMIN_ID=id
ADMIN_PWD=pass
MAX_UPLOAD_SIZE=6291456


위에서 보면 단순히 "="를 기준으로 해서 왼쪽에 key 오른쪽에 value가 들어 가는 단순한 형식임을 볼 수 있다.

#주석

[key]=[value]


주의 할점은 String 형식이라고해서 ",' 이런걸 사용하면 안된다는 것이다.


ResourceBundle 클래스는 자원을 저장하고 반환하는 기능을 제공하는 클래스이다. 이 클래스의 getBundle 메소드는 파일이나 클래스등으로 부터 ResourceBundle 객체를 생성시켜 주어 key값을 통해 해당 value를 얻을 수 있다.

주요 메소드

static ResourceBundle  getBundle(String baseName)
 주어진 값으로 해당 자원을 가지는 ResourceBundle객체를 만든다.
Object  getObject(String key)
 키값에 해당되는 객체를 반환한다.
String  getString(String key)
 키값에 해당되는 문자열을 반환한다.


자원 파일

ResourceBundle 클래스는 국제화를 지원하기 위한 클래스로 파일명은 Locale 파일 규칙을 사용한다. 파일의 기본 이름은 "Res"이고, 언어 코드가 "ko", 지역 코드가 "KR"이라면 "Res_ko_KR.properties"  이런식으로 만들며 확장자는 반드시 .properties인 텍스트 파일이어야 한다. 하지만 우리는 국제화에 따라 다양한 언어와 지역을 지원하기 위해 사용하는 것이 아니니 그냥 "Res_성격에 맞는 이름.properties"로 사용하면 되겠다.


자원 파일의 위치

properties 파일은 getBundle 메소드에 의해 객체로 전환이 된다. 따라서 클래스 파일과 같이 위치를 추적하면 되겠다. 만일 "Res_test.properties"라는 파일을 classes 폴더 밑에 test라는 폴더 아래 두었다면 우리는 "test.Res_test" 라고 해서 찾아가면 된다.


Res_test.properties

SINCE_YEAR=2002
SINCE_MONTH=5
SINCE_DATE=8
SINCE_DAY=Wednesday


이 파일을 "web-inf/classes/test/" 아래 두고 테스트를 해보겠다.


불러오기 테스트

간단하게 jsp에서 호출을 해보겠다.

resourceBundleTest.jsp

<%@ page contentType="text/html;charset=MS949"%>
<%@ page import="java.util.ResourceBundle" %>
<%@ page import="java.util.Enumeration" %>
<%
    ResourceBundle bundle = null;
    try {
        bundle = ResourceBundle.getBundle("test.Res_test");
        Enumeration enum = bundle.getKeys();
        for (; enum.hasMoreElements(); ) {
            String name = (String)enum.nextElement();
            String value = bundle.getString(name);
            out.println(name + " : " + value);
            out.println("<BR>");
        }
    } catch (Exception e) {
        out.println("Err: "+e.toString());
    }
%>


결과

SINCE_YEAR : 2002
SINCE_DATE : 8
SINCE_MONTH : 5
SINCE_DAY : Wednesday


ResourceBundle 클래스는 사용이 너무도 간단하기에 web에서 자주 사용 되리라 생각된다.


신고

'language > java' 카테고리의 다른 글

jsp파일을 Excel파일로 출력(저장)  (1) 2008.05.13
Jimi를 이용한 Thumbnail  (2) 2008.04.22
ResourceBundle의 활용  (1) 2008.04.19
java.mail패키지를 이용한 JSP페이지에서 SMTP서버 메일 전송  (0) 2008.04.18
exe 파일 만들기  (0) 2008.02.12
Algorism의 복잡도  (0) 2008.01.21
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import="java.util.*,
   java.io.*,
   javax.mail.*,
   javax.mail.internet.*,
   javax.activation.*" %>
<%

String msgText = "mail content... 한글 메일 내용";
String msgSubj = "E-mail Test subject";

// 아래 인코딩 부분은 환경에 따라 제목의 한글이 깨질 경우 주석을 제거하세요.
// msgSubj = new String(msgSubj.getBytes("euc-kr"),"8859_1");


// 받는이 메일주소
String to   = "virusabum@cyworld.com";
// 보내는이 메일주소
String from = "bhlee@withustech.com";
// Ex) withustech.com 우리 회사 smtp서버이다. 아웃룩을 회사서버로 사용한다면 아웃룩계정설정에 서버정보가 나와있다.
// Ex) String host = "withustech.com";
String host = "mail.smtp.host";

// create some properties and get the default Session
Properties props = new Properties();
props.put("mail.smtp.host", host);

Session sess = Session.getDefaultInstance(props, null);

try {
 // create a message
 Message msg = new MimeMessage(sess);
 msg.setFrom(new InternetAddress(from));
 InternetAddress[] address = {new InternetAddress(to)};
 msg.setRecipients(Message.RecipientType.TO, address);
 msg.setSubject(msgSubj);
 msg.setSentDate(new Date());
 msg.setContent(msgText,"text/html; charset=euc-kr"); // HTML 형식
 // msg.setText(msgText); // TEXT 형식

 Transport.send(msg);
 out.println(host+"를 통해 발송했습니다. ^_^");
} catch (MessagingException mex) {
 out.println(mex.getMessage()+"<br>");
 out.println(host+" 접속에 문제가 생겼네요.\n발송하지 못했습니다.");
}

%>

아주 간단하다 -_-

PS.

local에서 웹서버를 구축하고 실행해 보고자 한다면 윈도우즈의 경우 따로 smtp메일서버를 구축해야 한다.

일단 제어판 - 관리도구에가서 인터넷 정보 서비스(IIS) 구성요소가 설치되있는지 확인

없다면 제어판 - 프로그램 추가/제거 - 윈도우즈 구성요소 추가/제거 - 인터넷 정보 서비스(IIS)

를 설치하여 준다.(윈도우즈 CD필요)

설치 완료후 제어판 - 관리도구 - 인터넷 정보 서비스(IIS) - 기본 SMTP 가상 서버의 속성으로 들어간후
엑세스탭 - 릴레이 - 추가(A) - 단일컴퓨터 선택후 로컬IP 127.0.0.1 입력 - 확인 쭈욱~확인

그리고 시작.-_-




신고

'language > java' 카테고리의 다른 글

Jimi를 이용한 Thumbnail  (2) 2008.04.22
ResourceBundle의 활용  (1) 2008.04.19
java.mail패키지를 이용한 JSP페이지에서 SMTP서버 메일 전송  (0) 2008.04.18
exe 파일 만들기  (0) 2008.02.12
Algorism의 복잡도  (0) 2008.01.21
I/O의 기본 개념 & Stream  (0) 2008.01.21
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.

http://pds2.egloos.com/pds/1/200609/06/17/%5B1%5Djsmooth_ko.zip

↑ Download

jsmothgen.exe 실행~


사용법(퍼옴)

1) Skeleton
    1> Skeleton 선택하기
       : 간단히 말해 콘솔을 보이게 할것인지에 대한 선택이다.
        콘솔 어플 또는 해당 어플의 로그를 보고자 한다면 콘솔을 선택 하면 된다.
    2> Skeleton  등록 정보
       : 모른다..(건들지 않았다..--;;)

2)실행파일
    1> 실행 가능한 바이너리
        : 만들고자 하는 실행 파일명을 입력하면 된다. (.exe가 아니면 실행파일을 인식 못함 -- )
    2> 실행 파일 아이콘
        : 구찬아 입력하지 않았음. --;;
    3> 현재 디렉토리
        : 입력 없음 (도움말 참조)

3) 어플리케이션
    일단 클래스 패스 부터 설정해 줘야 한다.
    "+" 버튼을 눌러 내가 만들어 놓은 jar 파일을 선택해 주면 된다.
    1> Main 클래스
        : 클래스 패스가 설정되었다면 Main 클래스 선택이 가능하다.
    2> 어플리케이션 인자
        : 구찬아 입력 하지 않았음
    3> 꾸겨 넣는 jar
        : 건들지 않았음.. ㅋㅋ

4) JVM 고르기
     1> JVM 최소버전
        : 어디서 본듯한데... 1.4 버전 이후부터 가능하다 들은듯  함.
          도움말에 1.4.2가 있기에... 1.4.2라 입력 하였음.
     2> JVM 최대버전
        : 최소 버전이후는 다 될꺼라는 생각에..- -;; 입력하지 않음.
     3> JVM 번들
        : 뭔 소린지 몰라 그냥 둠. ㅋㅋ
     4> JVM 찾는순서
        : 뭐.. 알아서 찾겠지 뭐.. - -^

5) JVM 설정
     1> 최대 메모리
        : 도움말 보면 보통 64M라 함... (알아서 하겠지.. 무시했음.--);
     2> 최소 메모리
        : 도움말 보면 메모리를 늘려 주면 VM 실행 시간이 단축된다고함.(알아서 하겠지.. 무시했음 --)



출처[펌] : http://hotae.egloos.com/946570
신고
블로그 이미지

웹오피스 개발자 피스티스

사이냅소프트에서 웹오피스를 개발하고 있습니다.