프로그래밍 이야기

JAXB를 이용한 XML UnMarshalling(HttpUrlConnection) 예제 #2

박디 2013. 8. 19. 22:43

JAXB를 이용한 File로 마샬링, 마샬링된 XML을 언마샬링 하는 방법에 대해 살펴보았습니다. 이번엔 HttpUrlConnection

 

을 통해 얻어온 InputStream으로 언마샬링 하는 예제를 써보겠습니다. 1부의 File을 통한 Marshalling, UnMarshalling

 

예제를 보시고 나면 금방 이해 되실 듯 싶습니다. 1부에서는 List형 데이터를 마샬링, 언마샬링 하는 방법을 다뤘고

 

이번에는 약간 변경하여 XML Element의 Attribute처리를 다뤄봤습니다.

 

-XML 원본 데이터 예시(UnMarshalling시 사용)

 <packing_list>
    <packing_data barcode_read_date="XXX" packing_no="XXX" reg_userid="XXX" complete_yn="Y"     matched_result="N" /> 

    <packing_data barcode_read_date="XXX" packing_no="XXX" reg_userid="XXX" complete_yn="Y"     matched_result="N" /> 
 </packing_list>

 

-------------------------------------------------------------------------------------------------※ HttpUrlConnection을 통해 XML을 InputStream으로 가져옴

 public InputStream getXmlStreamFromUrl(Map<String, Object> paramMap){
  String packingNo = (String)paramMap.get("packing_no");
  
  URL url = null;
  HttpURLConnection httpUrlConnection = null;
  InputStream ips = null;
  
  try {
   url = new URL("
http://testurl.com/test.xml");   
   URLConnection urlConnection = url.openConnection();
   httpUrlConnection = (HttpURLConnection) urlConnection;
   
   httpUrlConnection.setDoInput(true);
   httpUrlConnection.setDoOutput(true);
   httpUrlConnection.setRequestMethod("POST");
   httpUrlConnection.setUseCaches(false);
   httpUrlConnection.setDefaultUseCaches(false);
   httpUrlConnection.setRequestProperty("Content-Type", "text/xml");
   
   ips = httpUrlConnection.getInputStream();
   ips.close();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return ips;
 }

------------------------------------------------------------------------------------------------

 - HttpUrlConnection을 통해 가져온 XML(InputStream) 언마샬링

 //UnMarshalling을 위해 XML을 HttpURLConnection을 통해 가져온 InputStream을
 //가져온다.  

 import javax.xml.bind.JAXBContext;

 import javax.xml.bind.Marshaller;

 

 JAXBContext jaxbContext = null;


 InputStream xmlStream = getXmlStreamFromUrl(paramMap);   
 PackingList packingList = null;

 

  try {   
   jaxbContext = JAXBContext.newInstance(PackingList.class);
   packingList = (PackingList) jaxbContext.createUnmarshaller().unmarshal(xmlStream);  
  } catch (JAXBException e) {
   e.printStackTrace();
  }

------------------------------------------------------------------------------------------------

- UnMarshalling을 위한 Java Class - PackingList

//UnMarshalling시에는 Marshalling과 반대로 XmlRootElement어노테이션에 지정한 이름에
//해당하는 데이터를 가져오게 된다.
@XmlRootElement(name="packing_list")
@XmlAccessorType(XmlAccessType.FIELD)
public class PackingList {
 //UnMarshalling시에는 Marshalling과 반대로 XmlElement어노테이션에 지정한 이름에 해당하는
 //데이터를 가져오게 된다.(Marshalling시에는 필드이름으로 지정하게 됨)
 
 //PackingListVO에서는 원본 XML과 같이 각 속성의 이름을 통해 값을 가져오도록 함.
 @XmlElement(name="packing_data")
 private List<PackingListVO> list = null;

 public void setPackingList(List<PackingListVO> packList){
  this.list = packList;
 }
 public List<PackingListVO> getPackingList(){
  return this.list;
 }
}

------------------------------------------------------------------------------------------------

- PackingListVO Class - ValueObject Class(DTO)

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;

 

//XML로드시 필드명으로 읽어 들이겠다고 선언
@XmlAccessorType(XmlAccessType.FIELD)
public class PackingListVO {
 
 //XML에 정의된 속성명을 동해 값을 가져오게 된다. 
 @XmlAttribute(name="barcode_read_date")
 private String barcodeReadDate = "";
 @XmlAttribute(name="packing_no")
 private String packingNo = "";
 @XmlAttribute(name="reg_userid")
 private String regUserID = "";
 @XmlAttribute(name="complete_yn")
 private String completeYN = "";
 @XmlAttribute(name="matched_result")
 private String matchedResult = "";

 

 ..

  getter/setter 생략

 ..

------------------------------------------------------------------------------------------------

HttpUrlConnection을 통해 언마샬링 처리는 실무에서 직접 적용 해본바로는 다른 프로그래밍 언어를 사용하는 타사와의

 

데이터 연동시에 유용하게 쓰였습니다. 사용하는 방법은 1부에서 파일로 XML마샬링 후 처리하는것과 비슷하게 크게

 

복잡한 부분은 없었습니다. 접속만 잘된다면 매우 유용하겠지요.