블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
05-06 13:11
 

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
 

최근에 올라온 글

최근에 달린 댓글

java.util.Locale 주의사항

JAVA / 2011. 12. 27. 17:04


사용 언어별 리소스 번들을 사용하기 위해서 java.util.Locale 을 이용하곤 합니다. 하지만 무턱대고 쓰다가는 예상치 못한 결과가 나올 수 있습니다.



위의 코드의 결과는 아래와 같습니다.

ko
ko_kr
ko_KR

1번과 3번은 크게 문제가 없는데, 2번과 같은 경우는 문제가 발생합니다.

bundle.properties 를 사용한다면, 1번과 3번은 각각 "bundle_ko.propertie", "bundle_ko_KR.properties" 를 로드하게 되는데, 2번과 같은 경우 의도한 결과는 "bundle_ko_KR.properties" 인데, 전혀 다른 결과가 나타나게 됩니다.

운이 좋게도 OS 언어가 "ko_KR" 이라서 인식하지 못하는 "ko_kr" 이 나와도 "ko_KR" 로 인식해서 몰랐는데, OS 언어가 "en_US" 인 환경에서 의도하지 않은 결과가 나오지 않아 확인한 결과 알게되었습니다.

뉴_뉴...

Posted by 자수씨
, |

오전/오후가 포함된 날짜를 파싱하기 위해 아래와 같이 코딩을 하였습니다.



하지만 결과는... 오전/오후가 구분이 되지 않았습니다.

실행결과
Mon Oct 31 01:20:00 KST 2011


한참을 고민하고, Locale 도 줘보고 하였으나 결과는 똑같았습니다.


http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800

오전/오후를 구분하는 문자열은 'H' 가 아니고 'K' 였습니다. 코드를 변경해서 실행해보니 원하는 결과가 나왔습니다.



실행결과
Mon Oct 31 13:20:00 KST 2011





Posted by 자수씨
, |

지난번에 한번 포스팅(m2eclipse Run 메뉴 수정~)을 했었던 m2eclipse 의 Run 메뉴 팝업 확장법을 공개합니다.




m2eclipse 플러그인 확인

우선 현재 설치되어 있는 m2eclipse 플러그인을 확인합니다.

[ECLIPSE_HOME]/plugins
 └ ...
 └ org.maven.ide.eclipse.editor.xml_0.12.1.20110112-1712.jar
 └ org.maven.ide.eclipse.editor_0.12.1.20110112-1712.jar
 └ org.maven.ide.eclipse.jdt_0.12.1.20110112-1712.jar
 └ org.maven.ide.eclipse.launching_0.12.1.20110112-1712.jar
 └ org.maven.ide.eclipse.maven_model_edit_0.12.1.20110112-1712.jar

 └ ...

저는 어제 (2011-09-28) 재설치를 했는데, 0.12.1.20110112-1712 버전이 설치되어 있었습니다.


플러그인 수정

org.maven.ide.eclipse.launching_0.12.1.20110112-1712.jar 파일의 압축을 해제합니다.

[ECLIPSE_HOME]/plugins/org.maven.ide.eclipse.launching_0.12.1.20110112-1712.jar
 └ icons
 └ META-INF
 └ org
 └ org.maven.ide.eclipse.cliresolver.jar
 └ org.maven.ide.eclipse.cliresolver30.jar

 └ plugin.properties
 └ plugin.xml



plugin.properties 파일에 아래의 내용을 추가합니다.

plugin.properties
...
m2.popup.lifecycle.cleanAndPackage=Maven clean and package
m2.popup.lifecycle.cleanAndInstall=Maven clean and install
m2.popup.lifecycle.cleanAndDeploy=Maven clean and deploy



메뉴 팝업을 확장하기 위해 plugin.xml 을 수정합니다.

plugin.xml




다시 jar 압축을 묶고 이클립스를 실행하면... 바로 반영이 되지 않습니다.
이전 버전의 이클립스에서는 바로 반영이 되었는데, 플러그인 로딩방식이 바뀌었거나 m2eclipse 에서 캐싱을 하는지 바로 반영이 되지 않습니다.

해결방법은 다음과 같습니다.
1. org.maven.ide.eclipse.launching_0.12.1.20110112-1712.jar 파일을 다른 곳으로 옮겨둔 후 이클립스 실행
2. Run 메뉴에서 maven 관련 메뉴가 빠진 것을 확인
3. org.maven.ide.eclipse.launching_0.12.1.20110112-1712.jar 파일을 복구한 후 이클립스 실행



반복작업을 줄여줄 수 있어서 좋네요~ 쿠헤헤

Posted by 자수씨
, |

JNI 를 사용하기 위해 자바에서는 dll 파일이나 so 파일을 로드하여 사용합니다.

하지만 jar 파일 안에 위와 같은 라이브러리 파일이 있을 경우 별도의 로직으로 로딩을 해야 합니다.


NativeLoader.java


load() 메소드에 라이브러리 이름을 지정하면 해당 클래스로더에서 라이브러리를 로드하게 됩니다.


주의사항

라이브러리를 로드하여 파일과 최초로 호출되는 파일이 동일할 경우 ClassLoader 에서 InputStream 을 정상적으로 가지고 오지 못하는 경우가 있습니다. 예를 들어 A.class.getClassLoader().getResourceAsStream("...") 를 통해 라이브러리에 접근한다고 할 때, 최초로 해당 jar 파일에 접근하는 클래스가 A 일경우 정상적으로 확인이 되지 않습니다. B 클래스를 통해 A 를 이용하여 라이브러리를 로드하면 정상적으로 수행됩니다.

Posted by 자수씨
, |


저희 조직에서는 메이븐 리파지토리로 유명한 Sonatype Nexus 를 사용하고 있습니다.

처음에 설정하기 귀찮아서 모든 사용자에게 Administrator 권한을 주었는데, 간혹가다 deploy 한 후 배포물을 삭제하는 경우가 있었습니다. 별 문제 없이 지나가다가 운영서버 배포 시ㅔ 같은 버전의 다른 배포물로 인해 재대로 반영이 되지 않는 문제가 발생하여 배포물에 대해 삭제를 하지 못하도록 권한을 설정하였습니다.

새로운 Role 을 만들고 아래와 같이 권한을 설정합니다.

  • Nexus Anonymous Role
  • Nexus Developer Role
  • All Repositories - (view)
  • All Repositories - (update)
  • All Repositories - (create)
  • All Repositories - (read)




처음에는 "All Repositories - (update)" 를 빼고 권한을 부여했더니, jar 파일은 올라가는데 나머지 pom 파일이나 sources.jar 파일이 올라가지 않아 update 권한도 추가하니 정상적으로 deploy 가 됩니다.


Posted by 자수씨
, |

Joda Time

JAVA / 2011. 9. 18. 22:39

먼가를 만들다보니 처음보는 Joda Time 이라는 라이브러리가 있어 찾아보았습니다.
http://joda-time.sourceforge.net

Joda Time - Java date and time API

Joda-Time 은 자바의 Date 와 Time 클래스의 품질 교체를 제공합니다. 간단한 API 를 통해 다양한 calendar 시스템을 제공합니다. 기본 calendar 는 ISO8601 표준을 사용합니다. 그레고리안, 율리우스, 불교, 콥틱, 에티오피아과 이슬람 시스템이 포함되어 있습니다. 지원 클래스는 시간대, 기간, 형식 및 파싱이 포함됩니다.


ISO 8601은 날짜와 시간의 표기에 관한 국제 표준 규격이다. 정식 명칭은 Data elements and interchange formats - Information interchange - Representation of dates and times이다. 최신버전인 ISO 8601:2004와 구버전인 ISO 8601:2000, ISO 8601:1988이 있다.
http://ko.wikipedia.org/wiki/ISO_8601


아래는 Joda-Time 의 간략한 예제입니다.



왜 Joda Time 인가?

Joda-Time 프로젝트 페이지에서는 다음같은 이유로 설명하고 있습니다.
  • 사용하기 쉽다.
  • 확장하기 쉽다.
  • 종합 기능 집합
  • 최신 시간대 계산
  • Calendar 지원
  • 간편한 상호 운용성
  • 더 나은 성능
  • 좋은 테스트 커버리지
  • 완전한 문서
  • 오픈 소스

기존 자바에서 제공해주는 Date 와는 달리 산술 연산도 쉽게 처리가 가능합니다. 근데 음력은 보이질 않네요 -ㅅ-...


Posted by 자수씨
, |

다중 프로젝트의 디펜던시 버전 관리

다중 프로젝트를 사용할 경우 디펜던시의 버전 번호를 각각의 pom.xml 파일에 정의하여 설정하여, 새로운 버전으로 업그레이드가 이루어질 경우 모든 pom.xml 을 변경해야 합니다.

메이븐에서는 <dependencyManagement> 엘리먼트를 통하여 디펜던시 버전 번호를 병합할 수 있는 방안을 제공합니다.

부모 POM 에서 <dependencyManagement> 정의를 통해 자식 POM 에서 버전을 명기하지 않아도 디펜던시를 참조할 수 있습니다.

메이븐은 <dependencyManagement> 엘리먼트를 정의한 프로젝트를 찾을 때까지 자식 프로젝트에서 부모 프로젝트까지 확인합니다.


예제

부모 POM의 종송성 버전 정의

자식 프로젝트 POM



위와같이 자식 프로젝트에 버전을 명시하지 않아도 부모 POM <dependencyManagement> 엘리먼트에서 정의되었기 때문에, 자식 프로젝트의 spring-data-jpa 디펜던시의 버전 번호가 전달됩니다.


결론적으로 <dependencyManagement> 엘리먼트는 버전 번호를 지정하지 않아도 어느 하위 프로젝트라도 디펜던시를 정의할 수 있도록 해주는 환경변수와 같습니다.

모든 프로젝트에서 사용하는 디펜던시라면 부모 POM 에서 정의하여 사용하는 것이 훨씬 관리에 용이합니다.

참고자료

Maven, Sonatype이 만든 Maven 핵심 가이드 (팀 오브라이언 지음 / 장선진 옮김)

Posted by 자수씨
, |

자바스크립트 환경변수를 js 파일에 글로벌 변수로 선언한 것을 DB화 시키기 위해 마이그레이션 툴을 만들다가 자바에서 기본으로 제공해주는 스크립트 엔진을 이용하여 파싱을 해보았습니다.

Parser 만들기

javax.script.* 클래스들을 이용하여 자바스크립트 글로벌 변수를 파싱하는 클래스 입니다.
JsGlobalVariableParser.java


간략하게 설명을 하자면, 문자열형 (String), 실수형 (Double), 부울린 형 (Boolean), 자바스크립트 오브젝트 형 (NativeObject) 을 추출하여 Map 으로 반환하는 로직을 가지고 있습니다. 문자열의 경우에는 single quotation 으로 감싸는 작업을 했으며, 실수형의 경우에는 정수로 변환하는 작업을 처리하였습니다. JavaScript Object 의 경우에는 json.js 의 stringify 함수를 이용하여 Object 그대로를 문자열로 치환하였습니다.

javax.script 패키지의 클래스들은 Rhino 가 자바 표준으로 포함되면서 별도의 라이브러리 추가 없이 사용할 수 있게 되었습니다.

Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users. It is embedded in J2SE 6 as the default Java scripting engine


테스트

글로벌 변수를 가지고 있는 실험용 스크립트를 통하여 테스트를 진행해 보겠습니다.
test.js


JsGlobalVariableParserTest.java



녹색바가 정상적으로 뜨는 것을 확인하였습니다.

조금 더 정비할 사항이 있긴 하지만 현재 처리되어야 하는 상황은 충분히 처리가 가능합니다.

Posted by 자수씨
, |

예전에 정리해놓은 줄 알았는데;;;; 아니였나보네요~




익셉션이나 에러 발생 시 스택 트레이스를 활용할 때 사용합니다


Posted by 자수씨
, |


32비트 환경에서 32비트 JVM 으로 자바 프로그램을 실행시켰는데 아래와 같은 메시지가 나오면서 프로그램이 종료됩니다.

Running a 64-bit JVM is not supported on this platform.


혹시라도 머신에 64비트 JVM 이 설치되었는지 아무리 뒤져봐도 나오지 않았는데...

실행 스크립트에 아래와 같은 옵션 때문에 발생했던 문제였습니다.

JAVA_OPTS="-showversion -d64 -Xms512m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=128M"


JAVA_OPTS="-showversion -d32 -Xms512m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=128M"

"-d64" 라는 옵션을 "-d32" 로 변경하고 재구동을 하니 정상동작합니다.


도대체 저걸 왜 달아놓은거지 -_-;;;

Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백