프로그래밍/웹서비스
JavaTM Web Services Developer Pack 2.0 (2)
라제폰
2008. 12. 13. 20:27
JAXB 2.0의 추가 기능
JAXB(Java Architecture for XML Binding)는 XML 스키마로부터 클래스 데이터를 바인딩, XML로부터 객체를 직렬화(Serialization) 하거나 마샬링, 언마샤링을 수행 할 수 있도록 지원해준다. JWSDK 2.0에 포함되어있는 JAXB는 2.0이며 이전 버전에 비해 다음 기능이 추가되었다. 이전 버전에 관한 내용은 http://blog.empas.com/inter999/6549631을 참고하시기 바랍니다.
Sample Program 작성
user.xsd 작성
XML 스키마에서 Java 클래스 생성
JAXB 1.x 버전에서는 Java 클래스가 20개 이상 생성되었지만 2.0에서는 스키마 생성 클래스가 대폭 줄어들어 클래스가 2개만 생성됨을 볼 수 있다. 파생된 Java 클래스를 컴파일 하기위해 JWSDP_HOME/jaxb/lib, JWSDP_HOME/jwsdp_shared/lib 하위의 jar 파일을 classpath에 추가하고 컴파일 한다.
Server Program 작성
userSVR.java
marshal, unmarshal에서 “JAXBElement”을 이용한다. 가장 크게 바뀐 부분은 검증 부분이다.
JAXB 2.0에서는 JAXP 1.3 스키마 검증 프레임워크를 이용하여 검증 기능을 보다 향상시켰다.이처럼 강화된 레벨의 검증을 이용하려면 먼저 W3C XML Schema 1.0 언어를 위한 SchemaFactory 인스턴스를 생성한다.
SchemaFactory 인스턴스는 새로운 JAXP 1.3 Schema 객체를 생성하는 데 사용된다.
그런 다음 setSchema 메소드를 이용하여 이어지는 언마샬링 동작을 검증하는 데 사용할 JAXP 1.3 Schema 객체(이 경우에는 user.xsd)를 식별한다. 한편, 이 메소드에 null을 패스하면 검증 기능은 디스에이블("사용하지 않음") 상태가 된다.
애플리케이션은 기본값 이벤트 핸들러를 오버라이드하여 검증 오류 처리를 커스터마이즈할 수 있는 옵션을 가지는데, 이 경우에는 메소드 콜 setEventHandler(ValidationEventHandler)가 사용된다.
JAXB 1.0으로 언마샬링을 하는 이전의 접근법(소위 '구조적 언마샬링')은 유효하지 않은 XML 컨텐츠에 대해 더 엄격한 편이다. JAXB 1.0은 복구 불가능한 구조적 불일치가 탐지되면 언마샬링 프로세스를 취소하고 UnmarshalException을 throw한다. 실례로, 예상치 않은 엘리먼트나 속성에 마주치면 언마샬링을 중단할 수 있다.
이와 달리 JAXB 2.0은 보다 유연한 언마샬링을 허용하는데, 이는 부적절한 XML 컨텐츠의 언마샬링 과정에서의 예측 가능성을 더욱 높여준다. JAXB 2.0의 경우, 컨텐츠 모델 내의 엘리먼트 위치를 기준으로 하여 엄격하게 적용시키기 보다는 엘리먼트 이름 별로 xml을 언마샬링한다.
각자의 커스텀 이벤트 핸들러를 지정하는 방법은 다음과 같다.
커스텀 검증 이벤트 핸들러는 반드시 ValidationEventHandler 인터페이스와 handleEvent 메소드를 구현해야 한다. JAXB Provider가 경고 또는 오류를 처리한 후에 현재의 언마샬링, 검증, 또는 마샬링 연산을 계속하려고 시도할 경우에는 불(boolean) 리턴 값이 true로 설정되어야 한다. 프로바이더가 적절한 UnmarshalException, ValidationException, 또는 MarshalException으로 현재의 연산을 종료할 경우에는 리턴 값이 false로 설정되어야 한다. JAXB 2.0의 기본값 ValidationHandler는 항상 true를 리턴한다는 점에 유의할 것(단, handleEvent가 오버라이드되지 않아야 함). 다음은 커스텀 이벤트 핸들러의 예제이다.
JAXB 스펙은 오류 발생 시 모든 프로바이더 구현이 검증 오류를 보고할 것을 요구하고 있지만, 구현이 데이터 프로세싱을 중단할 필요까지는 없다. 한편, XML 문서가 유효하지 않더라도 JAXB 구현은 XML 문서를 성공적으로 언마샬링 할 수 있다.
po.xml이 언마샬링된 후에는 마샬링된 객체를 다른 자바 객체와 마찬가지로 처리할 수 있다. 예를 들어, shipTo 주소를 디스플레이하려면 다음 절차를 따르도록 한다.
컨텐츠를 다시 XML 파일로 마샬링하려면 JAXB 1.0과 동일한 단계를 거치도록 한다. (앞서 언마샬링 과정에서 본 것처럼) JAXBContext 객체를 생성한 후에는, 마샬링 프로세스를 제어하는 Marshaller 객체를 생성한다. 예를 들어, 다음의 코드 단편은 Marshaller를 생성하여 컨텐츠를 incorrectpo.xml이라는 이름의 파일로 마샬링하는 경우를 보여주고 있다.
JAXB.FORMATTED.OUTPUT 속성은 Marshaller가 출력된 XML 데이터를 줄바꿈과 들여쓰기로 포맷할 것인지 여부를 제어한다.
본 팁의 예제 코드에는 표시되어 있지 않지만, JAXB 2.0은 마샬링 시에(언마샬링 시에도) 검증을 지원한다. 한편, JAXB 1.0의 경우에는 언마샬링 시에만 검증을 규정하고, JAXB 컨텐츠 트리의 온디맨드 검증을 지원하는데, 마샬링 시의 검증은 웹 서비스 때문에 추가된 것이다. 웹 서비스 프로세싱 모델은 데이터를 읽어들일 때는 어느 정도 느슨하고 반대로 데이터를 기록할 때는 엄격해야 한다. 이 모델에 부합하도록, JAXB 2.0은 사용자가 xml 문서를 JAXB 양식으로 수정할 경우 문서가 무효화되지 않도록 하기 위해 마샬링 시의 검증을 추가하였다.
Servlet을 컴파일 한다.
작성한 Servlet을 jaxb20test라는 Webapplication에 배포하고 web.xml파일에 등록하였다. XML 스키마에서 생성된 Java 클래스도 Server모듈의 ClassPath에 등록해준다. 여기서는 WEB-INF/classes 디렉토리에 패키지를 설치 하였다.
web.xml
Server Application 확인
Client Program
실행
Web Application을 구동하고 작성한 클라이언트 프로그램을 실행한다.
|