메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

아마존(Amazon.com)의 새로운 웹 서비스 사용하기

한빛미디어

|

2002-10-15

|

by HANBIT

12,170

저자: 워이-밍 리(Wei-Meng Lee), 역 한빛리포터 이상화

최근 Amazon.com은 고객의 웹사이트에 아마존의 다양한 컨텐츠를 통합할 수 있는 웹 서비스를 제공하기 시작하였다. 이러한 움직임은 이미 몇 달 전부터 웹 서비스를 시작한 검색 엔진 Google(http://www.google.com/apis/)을 비롯한 주요한 업체들을 따라가기 위한 것으로 보인다. 만약 Google의 웹 API에 익숙한 독자라면 아마존의 서비스도 쉽게 이용할 수 있다. Google과 아마존 모두 프리 라이센스 키를 요구하며 애플리케이션을 개발하기 위해 개발자 도구를 다운받아야 한다. 현재까지 두 회사의 웹 서비스는 무료이다.

아마존에서 제공하는 웹 서비스는 환영할 만한 소식이다. 출판업자들은 판매량, 도서 서평, 경쟁자들을 감시하기 위해 아마존의 정보를 사용해 왔다. 출판한 책들의 실적을 알기 위해 판매량과 관련된 DB갱신을 위해 출판업자들은 애플리케이션을 직접 개발해야 했었다. 또한 관련 정보들을 얻기 위해 HTML 문서 포맷 상에서 이루어지는 screen-scraping(† 역자 주: 웹 페이지에서 생성된 HTML을 파싱해서 원하는 내용을 얻는 것)이란 기술을 사용했었다. 아마존이 웹 서비스를 제공함으로써 출판업자들은 관련 정보의 생성과 관리를 위해 웹 서비스를 애플리케이션에 손쉽게 통합시킬 수 있게 되었다.
XML in a Nutshell, 2nd Edition

참고 도서

XML in a Nutshell, 2nd Edition
W. Scott Means, Elliotte Rusty Harold




출판업자 이외에도 아마존의 수많은 고객으로 인해 상품을 판매하는 제휴업체에게도 웹 서비스는 이익이 될 수 있다. 제휴업체들은 아마존의 거대한 DB를 이용하여 고객에게 차별화된 서비스를 제공 할 수 있기 때문이다.

이 기사에서 필자는 Visual Studio .Net을 사용하여 아마존 웹 서비스를 어떻게 구현하는지에 대해 살펴볼 것이다.

Developer"s Kit 다운로드

우선 [그림 1]과 같이 http://www.amazon.com/webservices에서 아마존의 무료 개발자 도구를 다운로드 한다.


[그림1] 아마존 웹 서비스 개발자 도구 다운로드

또한 무료 개발자 토큰(token)을 신청해야 한다. 이 토큰은 웹 서비스에 접근할 때 신분확인을 위해 사용된다. 한번 이러한 과정을 거치면 토큰이 주어진다.(†역자 주: 메일주소와 암호를 넣으면 D25L9EQRFQIEZ3과 같은 문자열 토큰을 받게된다.)

예제 애플리케이션 만들기

윈도우 애플리케이션이 어떻게 아마존 웹 서비스를 사용하는지 보여주기 위해 Visual Studio .NET을 이용하여 책제목 검색, 원가, 할인된 가격, 책 표지, 고객평가와 같은 정보를 나타낼 수 있는 프로그램을 작성해 볼 것이다.

먼저 Visual Studio .NET을 실행시켜 새로운 윈도우 애플리케이션 프로젝트를 만든다. 그런 다음 아마존의 웹 서비스에 대한 참조(reference)를 등록한다. 보통 .NET으로 개발할 때(.asmx 확장자) 웹 서비스의 WSDL을 포함하고 있는 URL을 등록하지만 아마존의 경우는 등록시킬 URL이 없다. 대신 WSDL 문서가 개발자 도구에 존재하기 때문에 WSDL.exe를 이용하여 웹 서비스 프록시(proxy)를 수동으로 생성해 주어야 한다.
C:\>wsdl /language:vb /o:Amazon.vb AmazonWebServices.wsdl
위의 과정은 Visual Basic .NET의 프록시 클래스를 생성한다. 이 프록시 클래스를 여러분의 프로젝트에서 사용하기 위해 그림 2에서와 같이 Amazon.vb 클래스를 프로젝트에 추가시킨다.


[그림 2] 웹 서비스 프록시 클래스 추가

또한 System.WebSystem.Web.Services 어셈블리(assemblies)에 대한 참조를 추가한다. (이것은 윈도우 애플리케이션에서 자동으로 추가되지 않는다.)

[그림 3]과 같이 다양한 컨트롤(control)을 윈도우 폼에 추가한다.


[그림 3] 윈도우 폼에 컨트롤 추가

책의 이미지를 나타내기 위해 필자는 Web Browser OCX 컨트롤을 추천한다. [그림 4]와 같이 Customize Toolbox에서 컨트롤을 추가할 수 있다.



[그림 4] Customize Toolbox

Web Browser 컨트롤은 웹 서비스에 의해 리턴 되는 이미지의 URL값을 사용한다. 아마존의 웹 서비스는 이진 이미지 파일을 리턴하지 않기 때문에 이미지를 포함하고 있는 URL을 가리키게 된다. Web Browser 컨트롤의 장점은 추가적인 이미지 작업이 필요 없다는 것이다. 또한 한번 전송된 이미지는 컨트롤에 의해서 캐싱(Cache)되기 때문에 대역폭에 대한 부하를 감소시킨다.

Search Amazon 버튼을 누르면 웹 서비스에 연결될 것이다. 웹 서비스 호출과 관련된 과정들을 코드를 통해 살펴보자.

먼저, 프록시 클래스의 인스턴스를 생성하자(이미 Amazon.vb는 추가된 상태이다)
    Dim ws As New AmazonSearchService()
만약 프록시 서버를 통해서 인터넷에 연결한다면 WebProxy 객체를 생성한다. 이 과정을 따르지 않는다면 웹 서비스에 연결하지 못하고 connection closed error를 보게 될 것이다.
        Dim myProxy As New System.Net.WebProxy("
            yourproxy..company.com", 8080)
        ws.Proxy = myProxy
이제 키워드 검색을 위해 KeywordRequest 클래스를 만들어 보자. 클래스에 대한 다양한 속성(properties)도 필요하다. 다만 이러한 속성 값에는 아직 기본 값이 존재하지 않기 때문에 값을 정해 주지 않으면 "404"에러를 보게 될 것이다.
Dim keywordReq As New KeywordRequest()

   keywordReq.keyword = txtKeyword.Text
   keywordReq.type = "heavy" 
      " type of result expected, lite or heavy
   keywordReq.devtag = "XXXXX" 
      " the token assigned to you
   keywordReq.version = "1.0"  
      " current version number
   keywordReq.mode = "books"   
      " product category, e.g. books, dvd, etc
   keywordReq.tag = "webservices-20" 
      " your amazon.com associates ID
   keywordReq.page = 1         
      " page requesting; for long results
모든 속성 값을 입력한 후 웹 서비스를 호출하면 전역 변수인 ProductInfo 객체를 얻을 수 있다.
        Try
            productsInfo = ws.KeywordSearchRequest(
                 keywordReq)
        Catch err As Exception
            MsgBox("Error accessing Amazon.com"s Web 
                 service. Please try again")
            Return
        End Try
ProductInfo 객체를 통해 리스트 박스 컨트롤에 결과를 표시한다.
        lstTitles.Items.Clear()
        Dim i As Integer
        For i = 0 To productsInfo.Details.Length - 1
            lstTitles.Items.Add(productsInfo.Details(i).
                ProductName.ToString)
        Next
리스트 박스 안에 있는 도서제목을 선택하면 책이 가지고 있는 정보를 표시해야 한다.
        " Displays the title information
        lblTitle.Text = productsInfo.Details
            (lstTitles.SelectedIndex).ProductName
        lblListPrice.Text = productsInfo.Details
            (lstTitles.SelectedIndex).ListPrice
        lblAmazonPrice.Text = productsInfo.Details
            (lstTitles.SelectedIndex).OurPrice
만약 책의 저자가 한 사람 이상일 경우 Authors 객체의 내용을 반복해서 정보를 얻어내야 한다.
        " Display all the author(s) of a book
        Dim i As Integer
        lblAuthors.Text = ""
        For i = 0 To 
          productsInfo.Details(lstTitles.
          SelectedIndex).Authors.Length - 1
            
            lblAuthors.Text += productsInfo.
               Details(lstTitles.SelectedIndex).
               Authors(i).ToString
            If i <> productsInfo.
               Details(lstTitles.SelectedIndex).
               Authors.Length - 1 Then 
               " not the last author
               
                lblAuthors.Text += ", "
            End If
        Next
대부분의 책들은 도서 서평과 고객 평가를 가지고 있다. "*"을 사용해서 고객 평가를 표현해 보자.
  " Displays the average customer ratings using asterisks
        If Not productsInfo.Details(lstTitles.
            SelectedIndex).Reviews Is Nothing Then
                lblRating.Text = ""
                For i = 1 To 
                    productsInfo.Details(lstTitles.
                    SelectedIndex).Reviews.
                    AvgCustomerRating
                lblRating.Text += "*"
            Next
        End If
마지막으로 Web Browser OCX 컨트롤을 사용하여 책 표지를 나타내보자. 라디오 버튼은 사진의 크기를 조절한다.
        " Display image according to size preference
        If optSmall.Checked Then
            AxWebBrowser1.Navigate(productsInfo.
                Details(lstTitles.SelectedIndex).
                ImageUrlSmall)
        ElseIf optMedium.Checked Then
            AxWebBrowser1.Navigate(productsInfo.
                Details(lstTitles.SelectedIndex).
                ImageUrlMedium)
        Else           
            AxWebBrowser1.Navigate(productsInfo.
                Details(lstTitles.SelectedIndex).
                ImageUrlLarge)
        End If
이제 [그림 5]와 같이 애플리케이션을 실행해보자.


[그림 5] 책표지 사진

아마존 웹 서비스의 다른 기능들

이전 KeywordRequest 클래스에서는 Page 속성 값을 1로 설정했었다.
   keywordReq.page = 1
      " page requesting; for long results
기본적으로 아마존은 하나의 요청마다 최대 10 개의 제품에 대한 결과를 보여준다. 검색 기준에 일치하는 다음 제품들을 보여 주기 위해서 Page 속성 값을 변경 할 수 있다. Page 속성 값이 2이면 11번째부터 20번째 제품까지 보여주고 3이면 21번째부터 30번째 제품을 보여주게 된다.

가장 많이 쓰이는 키워드에 의한 검색 이외에도 제품 카테고리로 검색 할 수도 있다. 예를 들어 책 카테고리로 검색하고 싶다면
    keywordReq.mode = "books"
혹은 Kitchen 카테고리로 찾고 싶다면
    keywordReq.mode = "kitchen"
또한 ASIN(Amazon Standard Item Number: 아마존 제품의 유일한 식별 번호), ISBN, UPC로 검색하고 싶을 수도 있다. 책의 경우 ASIN은 ISBN (International Standard Book Number)과 비슷하다. CD와 테이프의 경우 UPC (Universal Product Code)을 사용한다. 좀더 강력한 검색을 위해서 다음과 같은 클래스를 이용해 보자.
  • Author 검색
            Dim authorReq As New AuthorRequest()
    
  • UPC 검색
            Dim UPCReq As New UpcRequest()
    
  • ASIN 검색
            Dim ASINReq As New AsinRequest()
    
  • Actor 검색
            Dim actorReq As New ActorRequest()
    
  • Artist 검색
            Dim artistReq As New ArtistRequest()
    
  • Director 검색
            Dim directorReq As New DirectorRequest()
    
  • Manufacturer 검색
            Dim manuReq As New ManufacturerRequest()
    
  • ListMania 검색
            Dim listReq As New ListmaniaRequest()
    
  • Similarity 검색
            Dim simReq As New SimilarityRequest()
    
  • Browse ID 검색
            Dim browseReq As New BrowseNodeRequest()
    
각각의 클래스의 속성들은 앞선 것과 마찬가지로 값 할당이 필요하다. Visual Studio .NET Intellisense 기능(†역자 주: 객체이름과 마침표를 입력하면 해당 객체의 메소드와 속성목록을 보여 주는 기능)은 이런 작업을 좀더 단순하게 해줄 것이다.

BrowserNodeRequest 클래스에 대해 좀더 자세하게 논의해 보자. 아마존에 자주 왔었다면 제품들을 카테고리나 Browse ID로 그룹화 시켜놓은 것을 보았을 것이다. 예를 들어 "Book" 은 다음과 같이 서로 다른 카테고리로 세분화되어 있다.
Books, Top Selling    1000
Books, Bargain        45
Books, Technical      173507
각 카테고리 옆에 있는 숫자는 Browse ID 이다. Browse ID로 제품을 나열하기 위해 BrowseNodeRequest 클래스를 사용한다.
        Dim browseReq As New BrowseNodeRequest()
        browseReq.browse_node = "602320"  
           " Magazines, Business
        browseReq.type = "heavy"
        browseReq.devtag = "XXXXX"
        browseReq.version = "1.0"
        browseReq.mode = "magazines"
        browseReq.tag = "webservices-20"
        browseReq.page = 1
        productsInfo = ws.BrowseNodeSearchRequest(browseReq)
예를 들어 위의 코드는 "Magazines, Business" 카테고리(Browse ID : 602320)로 제품을 나열한 것이다.

요약

아마존 웹 서비스에 접근하기 위해서 SOAP 메시지뿐만 아니라, XML/HTTP 메소드도 사용할 수 있다. 필자는 우선 SOAP 메시지에 중점을 두었다. 개발자 도구에 포함되어 있는 문서를 참조한다면 XML/HTTP 메소드도 사용할 수 있을 것이다. 문서에는 필자가 언급하지 못한 아마존의 XSLT 서비스와 같은 고급 내용과 제품을 어떻게 쇼핑 바구니에 담는지에 대한 내용도 포함되어 있다. 이 기사를 통해서 아마존 웹 서비스를 사용하는데 도움이 되었기를 바란다.

샘플 코드는 여기서 다운받을 수 있다. (149K zip)
† 역자 주
소스 코드를 그대로 다운 받아서는 실행되지 않습니다. 코드의 내용을 고치셔야 기사의 내용을 실행 시켜 보실 수 있습니다. 수정하실 내용은 아래와 같습니다.

Form1.vb 파일에서 프록시 관련 설정에서 프록시 서버를 통하지 않으신다면 다음과 같이 주석처리 해주셔야 합니다.
"Dim myProxy As New System.Net.WebProxy("staffproxy.np.edu.sg", 8080) 
"ws.Proxy = myProxy 
그런 다음
"--- 
"Dim keywordReq As New BrowseNodeRequest() 
"keywordReq.browse_node = "602320" 
이 부분을 주석처리 해준 후, 아래 내용의 주석을 해제합니다.
Dim keywordReq As New KeywordRequest() 
keywordReq.keyword = txtKeyword.Text 
다음 keywordReq.devtag = "자기가 받은 토큰"으로 설정합니다. 따라서
keywordReq.mode = "magazines"  이 부분을
keywordReq.mode = "books"  으로 바꾸어 줍니다.
마지막으로 다음과 같은 부분의 주석을 해제하시고
productsInfo = ws.KeywordSearchRequest(keywordReq) 
다음을 주석처리 합니다.
"productsInfo = ws.BrowseNodeSearchRequest(keywordReq) 
그런 다음 실행하시면 네트워크 기사의 내용과 같은 화면을 보실 수 있습니다.
워이-밍 리(Wei-Meng Lee)는 .NET 분야를 전문으로 하는 필자이자 개발자로 SQL Server Magazine, Visual Studio Magazine, .NET Magazine에 기사를 기고하고 있다.
TAG :
댓글 입력
자료실