블로그 이미지
올해목표 // 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
 
12-31 00:00
 

달력

« » 2024.12
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
 

최근에 올라온 글

최근에 달린 댓글


JAXB를 통해 XML을 생성하게 되면 아래와 같은 헤더가 자동적으로 생성됩니다.

<?xml version="1.0" encoding="EUC-KR" standalone="yes"?>

위의 헤더 외에 DTD를 지정해야 한다면, 그리고 standalone="yes" 속성을 제거해야 할 경우가 생겨서 수 많은 검색 끝에 해결책을 찾아냈습니다.


Marshaller marshaller = JAXBContext.newInstance(XXX.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "EUC-KR");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

...

StringWriter writer = new StringWriter();
writer.append("<?xml version=\"1.0\" encoding=\"EUC-KR\"?>\r\n");
marshaller.get().marshal(xxx, writer);

JAXB_FRAGMENT 를 true 로 설정하면 상단의 헤더를 제외하게 됩니다. 마샬링을 하게 되는 Writer 객체에 사용할 헤더를 append 시키는 것으로 처리할 수 있습니다.


마샬러에 프로퍼티를 설정하면 된다는 글도 있었는데, 잘 안되는 것 같아 위의 방식을 사용하였습니다.

Posted by 자수씨
, |


회사일을 하다가 불연듯 아이디어가 떠올라서 프로그램을 만들다 보니 XML 설정파일을 만들 일이 생겼습니다. JAXB 로 뚝딱뚝딱 만들고 xml 을 생성하다보니 무엇인가 아쉬움이 있었습니다.

"Code Assist 가 있었으면 좋겠는걸?"

처음에는 dtd 를 만들어볼까 했지만, 먼가 수작업이 많이 들어갈 것 같아 JAXB 문서를 참고해서 생성하였습니다.



위의 코드를 쉽게 설명하자면 Vicki 라는 클래스는 XmlRootElement 입니다. 관련된 클래스를 모두 context 에 설정하는 것이 아니라 XmlRootElement 만 설정하면 됩니다.

xml 형식은 언제든지 변하니 소스로 만들어 놓으면 쉽게 샥샥 처리될 듯 합니다.

참고사이트: http://jaxb.java.net/guide/Invoking_schemagen_programatically.html

Posted by 자수씨
, |


<!DOCTYPE pubdoc SYSTEM "pubdoc.dtd">

위와 같이 XML 에 dtd 가 정의되어 있는 경우 JAXB 로 unmarshal 을 할 경우 dtd 의 위치가 명확하지 않아 재대로 unmarshal 이 되지 않을 수 있습니다.

좀 더 안전한 시스템을 위해서는 명확하게 정의해야 하는데요... 아래와 같은 방법을 사용합니다.



XMLReader 객체에 설정된 EntityResolver 를 통해 해당 dtd 와 관련된 정보들을 InputSource 로 참조할 수 있도록 처리하는 것 입니다.

EntityResolver 의 resolveEntity 메소드는 필요로 하는 리소스들을 두번째 파라미터인 syustemId 로 넘기게 됩니다.

즉, "C:/JAVA/Temp" 폴더에서 실행을 한다면 "pubdoc.dtd" 는 "C:/JAVA/Temp/pubdoc.dtd" 에서 찾게 됩니다. 해당 systemId 를 적당히 잘라내어 클래스패스 내에 리소스의 위치와 결합시켜서 로드하는 방식을 사용하였습니다.


먼가 systemId 자르는 것이 찝찌름 하지만 정상구동 확인하였습니다.

Posted by 자수씨
, |

JAXB 를 하면서 약간 귀찮은 작업들을 ant 나 콘솔에서 실행하기 귀찮아서 간단한 플러그인 개발해보았습니다.


ㅁ 잘 만들어 놓은 DTD 를 준비합니다.



model.dtd



ㅁ DTD 파일 > 오른쪽 클릭 > JAXB Tools > Generate XJC Model ... 를 선택합니다.
(원래 Action 이름이 저게 아닌데 ... -_ㅜ)





ㅁ Source Folder 를 Browser 버튼을 통해 선택합니다.





ㅁ model 객체들이 생성될 package 도 Browser 버튼을 통해 선택합니다.





ㅁ 설정이 완료된 화면입니다. Finish 를 과감하게 눌러줍니다.





ㅁ 생성된 객체를 확인합니다.



생성된 Body.java





schemagen 이랑 wsimport 도 만들어 볼 까 생각 중입니다. ㅋㅋㅋ





Posted by 자수씨
, |

O/X Mapper 살짝 비교~

JAVA / 2009. 8. 16. 14:04


ㅁ JAXB
Hompage: https://jaxb.dev.java.net/
JDK 6.0 Spec 에 포함된 JAX-WS 에서 사용되는 JAXB 입니다.
Model 객체에 Annotation 을 달아주는 것으로 marshalling/unmarshalling 이 가능합니다.
xjc (xml -> java object), schemagen (java object -> xsd) 와 같은 tool 을 제공합니다.


ㅁ Castor
Homepage: http://castor.org/index.html
mapping 관련 설정 파일 (xml) 을 이용합니다.
다른 것들과 마찬가지로 스키마 파일 (xsd) 가 있다면 mapping 파일 생성에 용이합니다.


ㅁ XMLBeans
Homepage: http://xmlbeans.apache.org/
아파치 프로젝트 중 하나입니다.
스키마를 따로 빌드해주어야 하는 것으로 확인이되어서... model 수정시에는 약긴 귀찮을 것 같습니다.


ㅁ JiBX
Hompage: http://jibx.sourceforge.net/
castor 와 유사하게 binding(mapping) 파일이 필요합니다.
그리고 binding 에 필요한 class 들을 미리 빌드해야 합니다.
가장 퍼포먼스가 좋다고 하네요.




그냥 간단하게 비교만 할 정도로 찾아보았습니다.
제가 JAXB 를 즐겨사용하다보니, JAXB 가 제일 손에 익네요.
어떤 설문 조사를 보니 JiBX 가 퍼포먼스가 좋고 JAXB 가 가장 사용성이 좋다고 합니다.





Posted by 자수씨
, |

집에 도착하여 굶주린 하이에나 처럼 웹 서핑을 하다가 Spring 3.0 과 JAXB 를 연동할 수 있는 것을 보았습니다.
그 이름은 바로 Spring OXM...

자세한 내용을 확인할 시간이 없어서 그냥 바로 예제 프로젝트를 생성해보았습니다.

간단한 dtd 를 만들어서 >>> [JAXB] DTD -> JAXB Model <<< 글을 참조하여 model 객체를 생성하고
Toby님의 글을 참조하여 pom.xml 을 구성하였습니다.


프로젝트 구성은 아래처럼 되었네요





그냥 살짝 테스트 해본 것이라 될지 안될지 약간 의구심이 있었지만... 예상외로 빠른 시간내에 결과를 보아서 뿌듯합니다.
다른 기능이나 문제점이 없는지도 살펴보아야 할 것 같네요...


[참고자료]
1. springsource doc - 14. Marshalling XML using O/X Mappers (Link)
2. Toby’s Epril - Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기 (Link)



Posted by 자수씨
, |

JAXB로 XML을 마셜링 할 때 사용하는 프로퍼티들 입니다.

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

JAXBContext jaxbInstance = JAXBContext.newInstance(MapPoint.class);
marshaller = jaxbInstance.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);



프로퍼티들~ 마지막꺼는 해석이.. 잘 안되네요 ㅋㅋㅋ





Posted by 자수씨
, |

[JAXB] DTD -> JAXB Model

JAVA/JAXB / 2009. 7. 2. 12:41

XML 파서와 제너레이터를 만들어야 하는 일이 생겼습니다.
DTD는 있는데 이걸 가지고 JAXB 모델 클래스를 만들자니 귀찮고 해서 검색을 해 보았습니다.

다행히도 JAXB 문서 중에 JAXB- RI Extensions / DTD 가 있었습니다.

일단 xjc를 사용하기 위해 jaxb를 다운받고 인스톨을 한 후 bin 폴더에서 xjc.bat 를 이용하여 테스트를 해보았습니다.




xjc.bat -dtd exchange_v2.dtd

위의 명령을 실행하면 아래와 같은 결과가 제너레이트 됩니다.






위와 같이 하게되면 generated 라는 패키지로 생성이 됩니다. 간략한 옵션으로 원하는 패키지로도 생성할 수 있습니다.

xjc.bat -p kr.co.vicki.ex -dtd exchange_v2.dtd







Posted by 자수씨
, |

쉽게 Java Beans ↔ XML 처리를 할 수 있는 JAXB 라이브러리를 통해서 java.util.Map 의 구현체 (HashMap)을
XML 화 처리하려고 하였습니다.



원래 JAXB 는 JAX-WS 때문에 나온 거 같은데 요긴하게 잘 써먹고 있습니다.
자바랑 플렉스간의 연동시에도 JAXB 를 활용하면 좀더 편하게 처리를 할 수 있을 것 같아요 ㅋㅋㅋ

Posted by 자수씨
, |
GWT 1.5 가 나오면서 어노테이션을 당당하게 쓸 수 있다고 생각했는데...

GWT 서버단에서 JAXB 를 이용한 모델을 클라이언트 쪽에 전달하는 로직을 작성하게 될 경우 컴파일 시에 javax.xml 을 참조할 수 없어서 에러들을 내뱉게 됩니다. (컴파일은 되긴 합니다.)

항상 컴파일 할 때 마다 에러를 볼 수 는 없는 일이기 때문에... 다음과 같이 처리를 해줍니다.

https://jaxb.dev.java.net/2.1.8/ 이 곳에서 jaxb binary 를 다운받습니다.

압축을 풀고 lib 폴더에 있는 jaxb-api-src.zip 파일을 프로젝트의 적당한 경로에 복사를 합니다.

그런 후에 컴파일에 사용하는 라이브러리 목록에 추가한다면 에러는 발생하지 않습니다.


Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백