---
title: "Groupon API 활용 – 마무리"
date: "2011-11-28"
categories: 
  - "applications"
tags: 
  - "data-integration"
  - "data-mapping"
  - "mapforce"
  - "stylevision"
  - "xmlspy"
description: 본 기사에서는 그룹온 API를 사용하는 데이터 매핑 애플리케이션의 디버깅 기술에 대해 논의하며, 특히 예상치 못한 데이터 처리 문제 해결과 데이터 통합 개선에 중점을 둡니다.
---
Status: #blog

Tags:  #data-integration #data-mapping #mapforce #stylevision #xmlspy

Categories: [data-integration](/blog/ko/category/data-integration.md)
# Groupon API 활용 – 마무리

드물지만 예외적인 상황은 느슨하게 결합된 데이터 매핑 애플리케이션을 망칠 수 있습니다. 특히 인터넷을 통해 제공되는 대규모 데이터 세트를 사용하는 경우, 그리고 데이터 소스에 대한 통제력이 거의 없거나 전혀 없는 경우에는 더욱 그렇습니다. 이 글에서는 데이터 매핑 및 변환 프로젝트를 수행하는 개발자들이 원격 소스에서 수신되는 데이터 스트림에서 예상치 못한 데이터를 신속하게 식별하고 처리할 수 있도록 하는 디버깅 기술을 소개합니다. **문제점** 지난 여름, 저희는 일련의 블로그 게시물을 통해 어떻게 하는지 설명하는 글을 작성했습니다 [Groupon API를 활용하여 개발 작업을 수행합니다](https://www.altova.com/blog/2011/08/processing-groupon-api-with-altova.html) 그루폰이 서비스되는 모든 도시에서 특정 조건에 맞는 할인 상품 목록을 추출하고, 이를 웹 브라우저나 모바일 기기에서 보기 쉽도록 목록을 정리합니다. 

[![Groupn API에서 생성된 MapForce 데이터를 모바일 기기 화면에 표시한 모습입니다](https://lh4.ggpht.com/-QZjPbYC7-LA/Tspu1d6EDiI/AAAAAAAAAj4/yCjai-3pxpU/clip_image001_thumb.png?imgmax=800 "MapForce output from the Groupn API")](http://lh4.ggpht.com/-Q5Fuliv98jw/Tspu06W2rTI/AAAAAAAAAjw/Y1zVMdAW1JQ/s1600-h/clip_image001%25255B3%25255D.png)

저희는 MapForce를 사용하여 데이터를 매핑하는 명령어를 실행했습니다. 이 명령어는 Groupon API를 150번 이상 호출하여 각 Groupon 도시의 데이터를 가져온 후, 실제 매장이 아닌 온라인으로 판매되는 상품만 필터링하고, StyleVision을 사용하여 결과를 HTML 형식으로 변환합니다. 매일 아침, 저희는 이 명령어를 배치 파일로 실행하여 HTML 결과를 로컬 서버에 저장합니다. 이렇게 하면 동료들이 웹 브라우저를 통해 접속하여 전국 각지의 흥미로운 상품 정보를 확인할 수 있습니다.

이 매핑 작업은 두 달 이상 문제없이 진행되었지만, 어느 날 다음과 같은 오류 메시지가 발생했습니다. "dateTime 유형의 소스 값 ""을 대상 유형 dateTime으로 변환할 수 없습니다." 구체적인 원인은 매핑 과정에서 dateTime 값을 기대했지만, 빈 값이 전달되었기 때문입니다. 좀 더 추상적인 관점에서 보면, 이 오류는 저희의 매핑 전략에 잠재적인 결함이 있음을 시사합니다.

저희는 Groupon API를 호출할 때마다 <response> 요소 안에 잘 구성된 XML 데이터 스트림을 받습니다. 하지만 API 사양에는 반환될 수 있는 데이터에 대한 XML 스키마가 포함되어 있지 않습니다. 저희가 매핑을 개발할 때, 원시 데이터를 분석하고 원하는 결과를 선택해야 했기 때문에, 첫 번째 단계는 API를 호출하여 특정 대도시 지역의 모든 Groupon 상품 정보를 수집하는 것이었습니다. 저희는 API 응답에 모든 가능한 옵션을 포함할 만큼 충분한 데이터 샘플을 얻을 수 있을 것이라고 예상했습니다.

두 달 동안 매핑 작업이 성공적으로 진행되다가, 마침내 API가 예상했던 패턴에 맞지 않는 특수한 경우의 데이터를 반환했습니다.

**디버깅 도구**
MapForce는 디버깅을 위한 도구를 제공합니다. MapForce에 내장된 실행 엔진을 사용하여 데이터 매핑을 실행하면 메시지 창에서 더 자세한 정보를 확인할 수 있습니다. 

[![MapForce 메시지 창에 데이터 매핑 오류가 표시됩니다](https://lh6.ggpht.com/-b1cUWq4TO6s/Tspu1zjU9tI/AAAAAAAAAkI/F1fqK3mu1H4/clip_image002_thumb.png?imgmax=800 "MapForce Messages window")](http://lh4.ggpht.com/-aaLuFh8g-5o/Tspu1iP_n7I/AAAAAAAAAkA/SZcyqjCaUiw/s1600-h/clip_image002%25255B3%25255D.png) 

"관련 위치"라고 표시된 항목은 오류가 발생한 매핑 내의 해당 구성 요소로 연결되는 하이퍼링크입니다. 결과 오류를 클릭하면 "format-dateTime" 함수로 이동합니다. 

[![MapForce에서 제공하는 날짜 및 시간 형식 지정 함수](https://lh6.ggpht.com/-K3r_SwpjT_o/Tspu2o6VB_I/AAAAAAAAAkY/sPBjmx1X1Mk/clip_image003_thumb.png?imgmax=800 "MapForce format-dateTime function")](http://lh5.ggpht.com/-tGo-OsyDmA8/Tspu2IqSEII/AAAAAAAAAkQ/rWCM52S3hWY/s1600-h/clip_image003%25255B3%25255D.png) 

오류 메시지를 클릭하거나, 값 연결을 추적하여 "format-dateTime" 함수에 입력되는 요소를 확인할 수 있습니다. 어떤 방법을 사용하든, 오류를 발생시킨 요소를 찾아야 합니다. 

[![(이미지 삽입)](https://lh3.ggpht.com/-YHrc-ebzcN8/Tspu3HEowtI/AAAAAAAAAko/RRHKpl_y2QE/clip_image004_thumb.png?imgmax=800 "clip_image004")](http://lh5.ggpht.com/-ABexBoUezwE/Tspu2_oTjOI/AAAAAAAAAkg/3Boath9vSdg/s1600-h/clip_image004%25255B3%25255D.png) 

문제의 원인은 입력 구성 요소에 있습니다. 이 구성 요소는 저희가 Groupon API에 요청을 보내서 받은 모든 데이터를 필터링이나 변환 과정에 들어가기 전에 수집합니다. 저희가 매핑을 설계할 때, 샘플 데이터에서 "endAt" 항목은 각 Groupon 상품의 종료 날짜와 시간을 항상 표시했지만, 어떤 이유로 인해 이 필드에 빈 값이 들어오는 경우가 있었습니다. 만약 오류가 로컬 입력 파일을 실행하면서 발생했다면, 파일 내용을 간단히 확인하여 문제를 해결할 수 있었겠지만, 이번 경우에는 데이터가 여러 URL에서 가져오기 때문에 일시적으로만 저장되며, 출력 구성 요소에 매핑되기 전까지는 유지됩니다. 다행히도, 저희는 간단한 방법을 사용하여 매핑을 쉽게 수정하고 Groupon API로부터 받은 모든 데이터를 보존할 수 있습니다. 입력 구성 요소를 복사한 다음, 복사본을 매핑에 붙여넣습니다. 원래 구성 요소의 응답 항목을 복사본에 연결하면, 두 구성 요소 사이의 모든 하위 항목이 동시에 매핑됩니다. 

[![(이미지 삽입)](https://lh6.ggpht.com/-zirg0u2c5-s/Tspu32QIMOI/AAAAAAAAAk4/qEknuzEA-yY/clip_image005_thumb.png?imgmax=800 "clip_image005")](http://lh5.ggpht.com/-5mRDG72tuHY/Tspu3StJOhI/AAAAAAAAAkw/Z1EnXl8bWgY/s1600-h/clip_image005%25255B3%25255D.png) 

저희의 원래 입력 구성 요소는 이제 두 개의 출력 구성 요소와 연결되어 있습니다. 맵포스 내장 실행 엔진을 통해 어떤 출력 구성 요소를 생성할지 선택하려면, 어떤 출력 구성 요소의 오른쪽 상단 모서리에 있는 눈 모양 아이콘을 클릭하면 됩니다. 새로운 출력 구성 요소는 단순히 입력 구성 요소에 있는 모든 내용을 복사하여 저장합니다. XMLSpy를 사용하여 원시 데이터를 살펴보면, 예상했던 날짜와 시간이 표시되어야 하는 위치에 빈 요소가 있는 것을 확인할 수 있습니다 

[![(이미지 삽입)](https://lh6.ggpht.com/-VkHxtsBRdIk/Tspu4haNB5I/AAAAAAAAAlI/G70KMzzM4io/clip_image006_thumb.png?imgmax=800 "clip_image006")](http://lh4.ggpht.com/-xYA8oU0hbYw/Tspu4KpB3oI/AAAAAAAAAlA/zE-fh7-uvGE/s1600-h/clip_image006%25255B3%25255D.png) 

## 해결책

이제 특정 종료 시간이 없는 프로모션이 있을 수 있다는 것을 알게 되었으므로, 지도 작성 시 이러한 가능성을 고려할 수 있습니다. 수정된 `endAt` 요소 처리 방식에서는, 원래의 `format-dateTime` 함수를 실행하기 전에 조건 검사를 수행하고, `endAt` 요소가 비어 있을 경우 다른 결과를 출력합니다. 

[![(이미지 삽입)](https://lh3.ggpht.com/-0Uh2-8whtOQ/Tspu5Lxkh5I/AAAAAAAAAlY/n78OuQLIJ-s/clip_image007_thumb.png?imgmax=800 "clip_image007")](http://lh6.ggpht.com/-4lj33Go9j2A/Tspu41hgGTI/AAAAAAAAAlQ/3yT89qXGqRc/s1600-h/clip_image007%25255B3%25255D.png)

저희는 모든 그루폰 데이터가 시간 제약이 있기 때문에 빠르게 작업해야 했습니다. 특수한 경우의 데이터는 결국 만료되어 데이터 흐름에서 사라집니다. 이번 경험을 통해 강력한 디버깅 도구를 갖추고, 데이터 매핑 프로젝트가 성공적으로 진행된다고 생각하더라도 창의적으로 활용하는 것이 얼마나 중요한지 알게 되었습니다. Altova MapForce는 [무료 평가판으로 제공](https://www.altova.com/ko/download-trial/)됩니다. 다음에 해결해야 할 문제가 여러분의 문제일 수도 있습니다. 

**편집자의 글:** 저희가 제공했던 Groupon API 데이터를 활용한 시리즈는 총 세 부분으로 구성되어 있으며, 아래 링크를 클릭하시면 각 부분을 확인하실 수 있습니다. 1부, [Altova MapForce를 사용하여 Groupon API 처리하기](https://www.altova.com/blog/2011/08/processing-groupon-api-with-altova.html)에서는 여러 URL에서 데이터를 수집하여 동적인 입력 데이터를 생성하는 방법을 설명합니다. 2부, [MapForce를 사용하여 Groupon API 처리하기 – 2부](https://www.altova.com/blog/2011/08/processing-groupon-api-with-mapforce.html)에서는 API에서 데이터를 필터링하고, 가장 흥미로운 정보만 추출하도록 출력 형식을 정의하는 방법을 설명합니다. 3부, [Groupon API 처리 – 3부](https://www.altova.com/blog/2011/08/processing-groupon-api-part-3.html)에서는 데스크톱 및 모바일 기기에 최적화된 단일 HTML 문서로 출력을 포맷하는 방법과, 반복적인 작업을 자동화하는 방법을 소개합니다.
