레이블이 xml인 게시물을 표시합니다. 모든 게시물 표시
레이블이 xml인 게시물을 표시합니다. 모든 게시물 표시

2009년 12월 31일 목요일

PHP XML Writer 속도

XMLWriter

0.000063


XMLDocument

0.000068


String

0.000084

 

XMLWriter가 가장 빨라보이기는 했는데 XMLDocument가 String으로 XML을 만든 것보다 빠른 것은 예상 밖이었다. 위의 값은 평균 값은 아니고 어떤 특정시점의 스냅샷이다. 그렇지만 여러번 실행시켜도 결과는 마찬가지다.

HTTP XML output

flash, php 통신에서 XML을 사용했다. XML 구조에 flash가 호출하고 싶은 php의 영역과 기능에 대한 정의가 포함되어 있고 결과에도 역시 같은 내용이 담겨있었다. 결과를 flash에서 파싱할 때 어떤 호출에 대한 응답인지를 확인하겠다는 의도였다. 그러나 잘못된 생각이었다. request에 대한 response는 정해져 있기 때문에 응답에 대한 핸들러가 작동하는 시점에는 호출한 내용이 무엇인지 이미 알고있기 때문이다.

 

따라서 xml output에 기입되는 내용, 실제 데이타를 표현하기 위해 시스템 전반적으로 XML 객체를 넘기는 것을 빼는 게 좋겠다. xml이 사용되는 해당 시점에서 output을 관리하는 게 좋아 보인다. 다른 경우에 이 코드를 사용한다면 output이 xml이 아닐 수도 있고 객체 생성시 xml 오브젝트를 계속 넘겨주는 암담한 인터페이스를 피할 수 있기 때문이다.

PHP에서 XML 다루기

XMLWriter 라는 스트링으로 XML을 생성하는 클래스를 구해다가 사용하고 있었다. 그런데 계층 구조의 객체 관계를 모델링하고 이를 XML로 바꾸는 과정에서 스트링은 문제가 생겼다. 스트링은 여태까지 만들어 놓은 XML 텍스트를 수정하는 것이 불편하다.

 

따라서 PHP에서 XML을 다루는 방법을 찾아본 결과 역시나 정리되어 있는 문서를 찾아볼 수 있었다. XML을 다루는 방법은 크게 네 분류로 나뉘는데 tree based, streaming, event based, transformation 이다.

 

tree based

- ext/dom

PHP 4에서는 ext/domxml을 쓰고 PHP 5에서는 ext/dom을 사용한다. 사용법은 매우 비슷하다.

- ext/simplexml

 

 

streaming (빠르고 간단함)

- ext/xmlreader

- ext/xmlwriter

 

event based

- ext/xml

 

transformation

- XSL

 

 

2009년 11월 12일 목요일

XML과 데이타

생성되는 오브젝트와 엘리먼트를 1:1로 매칭 시키는 것이 좋은 상황이 있다. 파싱한 정보를 기반으로 다시 필요한 데이터 형태로 변환하는 과정이 생략되고 Object 관계를 다시 xml로 변환 할 때도 쉽다.

 

이 경우 다른 의미의 Element 가 다른 Depth에서 나타나는 것은 좋지 않다. 엘리먼트 이름을 클래스 명으로 사용하면 같은 소스 내에서 같은 클래스 명을 사용하는 게 짜증나기 시작한다.

2009년 11월 1일 일요일

XML 다루기

http://koojunho.textcube.com/22

http://koojunho.textcube.com/38

http://koojunho.textcube.com/55

 

몇 번의 고민을 통해 XML을 직접 데이터로 사용하기 보다는 XML의 엘리먼트들을 잘 표현하는 Object로 바꿔주고 컬렉션을 통해 사용하는 것이 좋을 것 같다는 결론을 내렸다. (물론 여전히 상황따라 다를 수 있다는 전제를 깐다. ㅎ)

 

XML만을 사용하는 경우 XML을 데이터로 주고받는 상황에서 문제가 많이 생긴다. 어떤 XML 엘리먼트건 XML로 받을 수 있기 때문에 해당 값이 내가 받고자 하는 엘리먼트인지 아닌지를 판단하는 문제는 런타임으로 넘어가게 된다. XML이 수정되는 경우라도 컴파일 타임에는 아무런 문제를 일으키지 않기 때문에 모든 문제를 런타임으로 넘기게 된다. 문제가 런타임으로 넘어가면 프로그램의 해당 부분을 실행하기 전까지 문제가 있는지 아닌지 알 수 없게된다.

 

Object라고 해서 데이터가 수정될 때 아무런 작업이 필요 없는 것은 아니다. XML을 파싱해서 객체로 만들어 주는 과정과 자료구조를 만들어 주는 과정이 필요하다. 게다가 검색기능은 E4X, XPath 등에 비해 훨씬 귀찮다. 그러나 데이터가 바뀌고 클래스를 바꾸면 해당 값을 사용하는 모든 클래스들이 반응하게 된다. XML에서 특정 엘리먼트의 데이터를 다루는 방법이 바뀔경우 캡슐화된 클래스 내에서 처리방법만 바꿔주면 그 클래스를 사용하는 모든 클라이언트 코드가 자동으로 바뀌는 셈이다.

 

그렇지만 XML을 클래스로 만드는 것도 일은 일이다. 그래서 유닛테스트 프레임워크를 사용해서 완성된 XML을 기반으로 클래스를 만들면서 테스트를 하면 구현이 필요한 클래스의 나머지 일부가 어떤 것인지를 에러로 보여주는 클래스를 구현했다. 만약 내가 어떤 엘리먼트의 자식 엘리먼트로 <title />을 추가하고 실행을 했다면, 알 수 없는 title이라는 존재를 인식한 객체가 예외를 발생시키는 구조다. AS3.0에서 this[elementName] 으로 접근하여 값을 집어넣게 하는 방식으로 처리했다. this객체가 dynamic 클래스의 인스턴스는 아니기 때문에 동적으로 값을 넣을 수 없으면 예외를 던지는 것이다.

 

직접 XML을 클래스로 바꾸는 작업도 같이 진행했는데 처음에는 더뎌 보였지만 기반 클래스가 갖춰지자 테스트에 의존해서 클래스를 만들어 내는 쪽이 더 빨리 끝났다. 별로 머리 쓸 일이 없게 해준다.

 

엘리먼트마다 클래스가 생겨서 해당 엘리먼트 또는 자식 엘리먼트들을 처리하기 위한 기능들을 추가할 수 있게 됐다. 예를 들어 날짜를 갖고있는 XML이 있다면 XML로 접근했을 때 텍스트일 뿐이고 나중에 클라이언트 코드에서 해당 XML을 Date 클래스 등으로 변환해 주어야 한다. 클래스로 구현이 되어 있는 경우는 미리 그 작업을 베이스 코드에서 해주기 때문에 편해 보인다.

 

물론 XML을 OOP 구조로 치환 했을때 데이터를 제대로 표현했다고 하기에는 무리가 있다. 객체를 사용하는 게 더 좋다고 결론을 내렸다지만 XML을 객체로 치환하는 게 중요한 게 아니라 XML로 표현 된 데이터를 객체로 제대로 표현하는 게 더 중요하다. 사람의 고민이 필요한 부분에선 이 클래스들도 영 쓸모가 없다. 그래서 중요한 것은 만드려는 게 무엇인가를 먼저 봐야 하는 거고, 그 보다 더 좋은건 XML 정의하는 과정에도 참여하는 게 더 좋았을 텐데, 아직 설명은 못들었고 주말엔 쉬어야 한다는 생각이 갑자기 들었기 때문에. 오케이 여기까지. ㅎ

2009년 6월 21일 일요일

XML이냐 Array냐

Array로 구성한 트리를 마구 돌아다니다가 "XML 노드들을 기본 클래스로 바꾸고 Array 같은 기본 컬렉션에 담는 것"이 과연 좋은 일인지 생각하게 됐다.

 

처음에는 바꾸는 게 좋다고 생각 했다. XML 구조가 바뀌어도 오브젝트의 프로퍼티들을 바꿔주면 컴파일 타임에 문제가 생기는 위치를 알 수 있었다. 컴파일 에러가 나는 위치로 가서 코드를 고쳐주면 간단했다.

 

타입을 명확히 하여 생긴 이득이다. 소트웍스 앤솔러지에서도 보면 원시값은 아무 의미 없는 스칼라 값이며 의미를 분명히 하는 데 노력하라고 써있다. 날짜를 받기위한 매개변수 when을 int 타입으로 설정하면 누군가는 날짜 대신에 시간을 넣을지도 모를 일이다.

 

그러나 기본 컬렉션의 단점도 있다. 자료구조를 검색, 수정 하려니 만만치 않다. Flash에서는 DB를 지원하지 않아서 불편하다. MFC 할 때도 웬만한 자료구조는 기본 컬렉션을 쓰지 않고 SQLite로 처리했다. 검색, 수정, 추가등이 편리하기 때문이다.

 

Flash에서 XML, 특히 E4X로 XML을 다루면 자료구조를 어느정도 쉽게 다룰 수 있을거라고 생각된다. XML만 사용하고 타입이 모호해지는 문제(런타임에서야 문제를 확인할 수 있는 단점)는 테스트를 강하게 하는 쪽으로 해결하는 게 더 효율적일 것 같다.

 

아직 추측이니 XML 쓰면서 익혀봐야겠다. 당장에 객체에 해당하는 XML 노드에 행위(메소드)를 부여하려고 하면 XML은 불편해 보인다.

 

참고 :

(1) http://www.actionscript.org/forums/showthread.php3?t=156040

(2) http://norman.walsh.name/2003/06/01/xmlnotoo

(3) http://stackoverflow.com/questions/719674/hierarchy-data-structure-in-java-or-xml-to-object-conversion-best-practices

2009년 6월 5일 금요일

Flash에서 비동기로 얻어오는 XML파일 순서대로 여는 방법

Flash에서 몇 개의 XML을 읽을 때 1번 파일에서 얻은 값을 2번을 읽는데 사용하는 경우가 생길 수 있다. 문제는 XML을 비동기로 호출하니 1번은 다 얻어오기 전에 2번을 읽으려고 한다는 것.

 

PureMVC의 App Skeleton에서는 리소스 목록을 관리하는 StartupMonitorProxy에 XML파일 하나를 대표하는 Proxy들을 추가하여 Proxy가 생성되는 순서대로 XML을 얻어오게 하는 코드가 있다.

 

물론 내가 뛰어난 실력으로 그런 것들을 한 눈에 파악한 것은 아니고. 아무 생각없이 지웠다가 안되길래 다시 보며 파악한 것. ㅎ 집에 가고싶다.