Flex에서 결과 객체를 올바르게 반복하는 방법

Apache Flex로 작업할 때 개발자들은 웹 서비스에서 가져온 데이터를 반복할 필요성을 자주 마주칩니다. 일반적인 시나리오는 HTTPService 호출을 통해 반환된 XML 데이터를 처리하는 것입니다. 그러나 응답에 행(row)의 수가 가변적으로 포함되는 경우 문제가 발생하는 경우가 많습니다. 이 블로그 게시물에서는 이러한 XML 결과 객체를 오류 없이 올바르게 반복하는 방법을 살펴보겠습니다.

문제: XML 데이터 반복하기

일반적인 상황에서는 HTTPService 호출을 하고 다음과 같이 구성된 XML 데이터를 받을 수 있습니다:

<DataTable>
    <Row>
        <text>foo</text>
    </Row>
    <Row>
        <text>bar</text>
    </Row>
</DataTable>

이 데이터를 처리할 때 많은 개발자들은 다음과 같은 코드를 사용하여 “Row” 노드를 반복하기 위해 for 루프를 사용합니다:

for (var i:int = 0; i < event.result.DataTable.Row.length; i++) {
    if (event.result.DataTable.Row[i].text == "foo")
        mx.controls.Alert.show('foo found!');
}

이 코드는 여러 “Row” 노드가 있을 때는 올바르게 작동하지만, “Row” 노드가 하나만 있을 때는 length가 반환된 XMLList 객체의 속성이 아니기 때문에 문제가 발생합니다. 이런 경우에는 예기치 않은 오류가 발생할 수 있습니다.

해결책: for each 루프 사용하기

XMLList 길이 이해하기

문제를 해결하는 핵심은 length가 속성이 아니라 XMLList의 메서드라는 점을 인식하는 것입니다. 따라서 올바르게 행의 수를 얻는 방법은 다음과 같습니다:

event.result.DataTable.Row.length();

그러나 길이를 직접 쿼리하는 것은 여전히 혼란을 초래할 수 있으며, 특히 이를 간과하는 개발자나 일관성이 없는 XML 응답을 받을 경우 더욱 그렇습니다.

모범 사례: for each 루프 사용하기

코드의 명확성을 높이고 잠재적인 오류를 피하려면 XMLList를 작업할 때 for each 루프를 사용하는 것이 가장 좋습니다. 이 방법은 XML 노드를 반복하는 데 더 안전하고 관용적입니다:

for each (var node:XML in event.result.DataTable.Row) {
    if (node.text == "foo") {
        mx.controls.Alert.show('foo found!');
    }
}

for each 루프의 장점:

  • 가독성: 코드가 더 간단하고 읽기 쉬워집니다.
  • 견고성: 길이에 접근하는 문제를 우회하여 오류 발생 가능성을 줄입니다.
  • 유연성: 자식 노드 수가 가변적일 때도 원활하게 작동합니다.

결론

Flash와 Apache Flex에서 XML 데이터를 올바르게 처리하는 것은 쉽지 않을 수 있습니다. HTTPService 호출의 XMLList 결과를 반복하기 위해 for each 루프를 사용하면 단일 자식 노드와 관련된 오류를 방지할 뿐만 아니라 더 깨끗하고 유지 관리가 용이한 코드를 작성할 수 있습니다.

이러한 관행을 구현하면 코드 품질을 향상시킬 수 있으며, Flex 애플리케이션에서 XML 데이터를 작업할 때 런타임 문제의 가능성을 줄일 수 있습니다.