오늘은 그간 네이버 페이 Node 모듈을 개발 하면서 다뤘던 JSON 객체와 XML 에 대해서 이야기 해보고자 한다.
네이버 페이는 XML의 방식에 데이터 전송을 요구했고 우리가 개발하는 환경에 데이터는 MongoDB 뿐만아니라. 자료구조자체를
JSON 방식을 이용하고있었다. JavaScript 단에서 XML 을 생성할수도 있었겠지만, 결제 모듈에 관련된 모든 엔진들이
MVC 패턴을 따르는 JAVA 기반 서버에서 돌아가고있었기때문에 JAVA로 응답과 전송처리를 진행해야만했다.
그럼 먼저 JSON 처리과정에 대해서 설명해보겠다.
1.JSON 변환 - 2개의 라이브러리
클라이언트 에서 서버로 데이터를 요청할때 클라이언트는 JSONARRAY 방식으로 데이터를 가지고있다.
JSONARRAY 는 다음과같은 형식을 취하고 있다.
JSONARRAY [{jsonobject},{jsonobject}]
request.getParameter 를 통해서 자바의 서버단에서 값을 불러오면 JSONARRAY는 String 형태의 문자열에 담기게된다.
JSONARRAY 형상을 하고있지만 String 타입의 문자열인것이다.
그렇기때문에 자바에서 JSONARRAY 를 정의해줘야 한다.
처음 시도한 방식은 구글링을통해 Huck's 님의 블로그에 있는 글을 기반으로 진행했다. (참조 : http://huskdoll.tistory.com/38 )
사용한 라이브러리는 json_simple-1.1.jar
원리는 아주 간단했다. 하지만 문제가 발생했다.!
1
2
3 |
JSONParser jsonParser = new JSONParser(); // 파서 인스턴스화
JSONArray jsonarray = (JSONArray) jsonParser.parse(jsonString); //파싱된 값을 JSONARRAY 담기 |
JSONARRAY 형식을 갖고있는 String 타입을 parser 가 인식하지못하는상황이였고 ARRAY 형식인데도 불구하고
수많은 에러가 발생되었다.
그래서 JSON 을 다루는 다른 라이브러리를 사용하게 되었다.
사용한 라이브러리는 gson-2.2.4.jar
이름에서 느껴지는대로 구글에서 만든 라이브러리이다.
json-simple 과의 차이점은 Json 에대한 정보를 element 에 담고 꺼내쓰는방식을 취하고 있다는것이였다.
json-simple 라이브러리에서 난항을 겪고있던 JSONARRAY 문제는 GSON 라이브러리를 사용 하면서 깔끔하게 해결 되었다.
1
2
3 |
JsonParser parser = new JsonParser(); //파서 인스턴스화
JsonElement element = parser.parse(json); //엘리멘트에 파싱한 JSONARRAY 담기
JsonArray jArray = element.getAsJsonArray(); //엘리먼트로부터 JSONARRAY 꺼내쓰기 |
위에 코드와 비교해보면 차이점을 금방알수있을것이다.
GSON 라이브러리를 이용해 JSON 객체를 자유롭게 JAVA 단에서 다룰수있게되었다면 이제 XML 변환방식에 대해서
알아보자.
2.XML 생성 - 2가지 방법
보편적으로 가장 쉬운건 서블릿단에서 response.getWriter 를 통해
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n")
해당 형식처럼 Write 하고 flush , close 하는방법이 있다.
여기선 다른방식을 소개하고자 한다.
자바는 기본적으로 xml 형식을 지원하기때문에 내장 라이브러리를 사용할수있다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
//docFactory 를 인스턴스화 한다.
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
//docBuilder 를 생성한다.
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
//XML 문서를 생성한다. doc 은 xml 문서의 최상위 루트이다.
Document doc = docBuilder.newDocument();
//element 를 생성한다. 해당처리는 xml 문서상에 <item></item> 태그가 된다.
Element item = doc.createElement("item");
//xml문서에 appendChild로 item 엘리멘트를 붙여준다.
doc.appendChild(item);
//item 태그의 내부값도 지정할수있다.
//해당 처리의 결과값은 <item id="itemid"></itemid> 가 된다.
item.setAttribute("id","itemId"); |
appendChild 파라미터값으로는 doc 으로 부터 다양한 함수들을 호출해 입력할수있는데 2가지를 많이사용한다.
doc.createTextNode("텍스트") : 해당함수는 <item> 태그 내부에 들어가는값을 텍스트로 정의해주는 역할을 한다.
doc.createCDATASection("텍스트): 해당함수는 <item> 태그 내부에 들어가는값을 CDATA 텍스트로 정의해주는 역할을 한다.
xml 을 doc에 추가하는 작업들이 끝나면 이제 파일을 생성한다.
파일생성도 자바의 내장 라이브러리인 TransformerFactory 를 사용한다.
1
2
3
4
5
6
7
8
9
10
11 |
//파일생성 부분
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
//옵션정의
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//xml 문서 를 DOM에 담는다.
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new FileOutputStream(new File("")));
//(xml이담긴DOM,저장될파일경로)
transformer.transform(source, result); |
이렇게해서 JSONARRAY 데이터를 XML로 변환해보고 파일생성까지 마무리되었다.
도움이되셨나요..? ^^