JAXB를 통해 자바객체를 XML로 변환할 때 몇가지 이슈(?)

WEB API를 하나 만들게 되었는데 응답데이터 형식을 XML로 해야했다. XML로의 응답은 처음개발하다보니 3가지 간단한 이슈(?)가 생겨서 해결하는 방법을 적어보려 한다.

POM.XML 설정

 

1. XML 태그 순서

제일 간단한 문제였고 해결 방법도 간단하다. 아래 Root.java에서 @XmlType(propOrder = {“num”, “cdNm”, “cd”}) 를 설정하면 된다.

  • Root.java

 

 

2. DB에서 조회한 값이 NULL일 때 XML 태그 출력 안됨

DB에서 조회한 값이 NULL이면 JAXB에서는 태그 자체를 출력하지 않는다.  ECLIPSELINK라는 특정 라이브러리를 사용하면 위 코드의 1번과 같이 표현할 수 있다. 하지만 내가 원하는 형태는 2번이었고 좋은 방법은 아니지만 해결한 방법을 적겠다(무조건 2번 형태가 나와야 했음).

이런식으로 DB에서 가져온 정보가 NULL일 때, 빈공간으로 세팅해준다. 왜냐하면 NULL인 태그는 JAXB에서 파싱해주지 않아 태그가 안나오기 때문이다. 또한 Root.java에서 set메서드를 보면 set할 파라미터가 빈공간일 때, 전역변수에 빈공간을 할당해준다. 내 기억에 저렇게 하지 않으면 빈공간을 위의 코드처럼 세팅해더라도 다시 NULL이 되어 태그가 출력되지 않는다.

 

3. CDATA 처리

최종 처리할 변수가 root 이고, 이 변수의 타입은 Root라고 하면 위의 코드처럼 입력하라. 마지막 리턴은 toString()만 해도되는데 인코딩이 깨지길래 getByte했다. Root.java에서 @XmlJavaTypeAdapter 부분을 설정해야만 실제 CDATA가 처리된다. 필요한 AdapterCDATA 클래스는 아래에 작성했다. Root.java에서 세터부분 this.cdNm =”<![CDATA[” + cdNm + “]]>”; 을 통해 CDATA 처리된 것을 표현했다.

AdapterCDATA.java