책을 검색하다 ③예제 구현 앱 벤터 #81] 구글북스 API에서
지난번에 소개한 구글북스 검색 API의 XML 패싱방법을 바탕으로 간단한 예제 하나를 공개한다...gunzok.blog.me지
저는 이번 시간에 구글북스 API 검색 쿼리에 대해서 알아보고 간략하게 정리해 보았습니다. 그리고 이를 바탕으로 구글북스 검색 앱을 구상해 보았습니다. 상상력으로는 재미있는 퍼싱 예제를 하나 만들어 볼 수도 있겠다고 생각했지만 진행 중인 프로젝트가 있어 시간을 많이 낼 수 없기 때문에 지난 회에서 언급했다.시피 확장 컴포넌트의 추가 없이 목록 구현이 어려운 관계(앱 인벤토리의 한계)로 간단하게 XML 파싱을 선보이는 선에서 타협이 필요했습니다. 이번에는 업로드한 구글북스 검색 앱을 오픈합니다.구글북스 API로 책을 검색하기(③예제 구현1) 개요개발 앱 구글북스에 등록된 도서(e북)를 검색할 수 있는 모바일 애플리케이션의 주요 기능, 원하는 도서를 검색할 수 있도록 검색옵션 지원 및 찾은 도서의 정보를 볼 수 있는 화면과 관련 기능 제공부가 기능 도서 소개문을 음성으로 읽는 것과 미리 볼 수 있는 샘플 제공 시의 접속, 도서 정보의 간단 공유(외부 스크랩).
2) 디자인 화면
검색된 도서 다수를 출력하는 목록 대신 한 권의 도서정보만 열람할 수 있는 단일 뷰와 이동 버튼을 구성했습니다. 그리고 단일 뷰의 크기를 확보하기 위해 검색옵션 윈도우 오픈 스위치를 켰습니다.3. 블록코딩
모든 블록에 대해 언급하기에는 어렵지 않은 블록들이 대부분이에요. 그래서 보면 알 수 있는 작은 블록(?)은 생략하고 주요 기능의 블록만 간단하게 보도록 하겠습니다.① 검색 쿼리 URL 생성 차단
구글북스의 도서 정보를 요구하는 쿼리 URL을 만드는 버튼 클릭 이벤트 차단입니다.총 5개(기본, 책 제목, 저자, 출판사, 검색 제외) 조건으로 검색을 수행할 수 있도록 하였으며, 결과는 최신 등록된 순서대로(&order By=newest), 도서 한 권의 정보(&max Results=1)만 받도록 하였습니다. 다시 한 번 말씀드리지만, 이것은 목록을 작성할 여건이 되지 않기 위한 방법입니다. 그래서 마지막으로 순서를 지정할 수 있는 쿼리(&start Index=)를 프로시저화하여(아래 블록 이미지 참조), 검색된 도서를 다시 확인할 수 있도록 하였습니다.index 값만 변경하면 검색된 다른 도서 정보도 확인할 수 있도록 하였습니다.아, 각 조건에 관한 상세 쿼리도 프로시저화 했습니다. 웹 컴포넌트의 Get블록에서 요청하면 결과를 GotText블록(②)에서 확인할 수 있습니다.입력된 단어를 쿼리스트링으로 변환하는 프로시저 호출각 조건에 대한 쿼리를 완성합니다.※ 구글북스 검색 API를 테스트 해보니, 공백기로 나뉜 두개 이상의 단어를 입력했을 때 정확도(?)가 많이 떨어지는 것을 확인하였습니다. 그래서 두 개를 입력해도 첫 번째 단어(one_word)만 할 수 있습니다.단어 입력시 웹컴포넌트의 UriEncode블럭은 사용하지 않습니다. 틀린건 아니지만 빈칸을 다른 글자로 처리해서 의도하지 않은 결과를 낳았어요.각 항목에 해당하는 쿼리를 배열화하였습니다.각 조건에 해당하는 쿼리는 if 블록을 사용하지 않고 매칭되도록 배열하였습니다.② 퍼싱 관련 블록
퍼싱을 위한 첫 단계 구글북스 서버에서 전달받은 데이터를 JsonTextDecode 블록으로 배열화(List형식)합니다.필요한 항목의 패싱 기능을 프로시저화하였습니다. 항목 text 블록에서 어떤 항목을 퍼싱하는지 확인할 수 있습니다.필요한 항목의 데이터를 얻기 위한 경로 지정 및 데이터 유무에 따라 값을 바꾸어 반환합니다.79번째에 오픈한 퍼싱의 3번째 방식(경로 지정)으로 더욱 발전시킨 모습입니다. list by walking key 블록의 경로 지정을 프로그래밍화 했습니다. 왜 이렇게 됐는지는 DB의 구조(배열화)와 경로 지정 방식을 얘기한 79번째 포스팅을 보시면 이해가 가실 겁니다. 패스 지정으로 데이터(값)를 추출한 후에는 데이터(값)의 유무에 따라 반환값을 달리했습니다(말미의 result에 조립한 if블록을 참조).지금까지 패싱 앱인 '벤터 포스팅'이 없었어요. 사실 작년에 퍼싱 관련 포스팅(#67, #69)을 했었는데 볼...gunzok.blog.me
③기타: 숫자 3자리마다 쉼표로 구분
도서 정가를 출력하는 블록입니다.digit_format 프로시저는 퍼싱 주요 블록은 아니지만 언젠가 한번 구현해 두고 싶었던 기능이기 때문에 도전해 보았습니다. 가격을 표시할 때 자릿수를 구분하는 쉼표가 없어서 이상했어요. 가격이 가격으로 보이지 않는다고나 할까, 어렵지 않게 실현될 것 같았지만, 막상 코딩을 해보니 조금 까다로웠습니다.숫자 세 자리마다 쉼표를 넣는 프로시저입니다.사실 while 블록을 사용할 수도 있지만 프로젝트에 다양한 기능이 추가되기 시작하면 while 블록으로 인한 오작동이 엉뚱한 곳에서 발생할 수 있기 때문에 그만두고 For 블록을 이용하게 되었습니다. 좀 더 연구하면 위프로시저보다 쉽게 만들 수 있을 것 같은데 아쉽네요. 우선 문자열(가격 숫자)을 역순으로 하여(reverse), 문자열 3의 배수 위치별로(단, 마지막 문자열이 아닌 경우) 뒤에 쉼표를 찍어서 따로 저장합니다. 그리고 다시 원래 순서로 돌렸어요4. 설치 버전의 앱
몇번 운용해봤는데 구글북스에서 반환하는 검색결과 종합에 문제가 조금 있는 것 같습니다. 같은 조건으로 인덱스 값만 바꿨는데도 종합이 제각각이네요. 주의하세요.
※ XML 퍼싱 예를 선보이기 위해 개발된 앱입니다. 바이러스 및 해킹이 의심되면 다운로드 하지 마세요. 또한 테스트를 충분히 하지 않아 오류가 발생할 수 있지만 본 포스팅 이외의 예제 앱 재배포는 금지합니다.전
체적으로 사소한 몇 가지 기능을 원하다 보니 코딩이 조금 복잡해졌습니다. XML 파싱을 학습하는 데는 지장이 없다고 생각해요. 사실은 예제를 만들어 놓고 소스를 오픈하느라 망설였어요. 조금은 싫었다고 할까요?그동안의 블록코딩 노하우가 담겼기 때문. 뭐, 만들려고 하면 번거로울 뿐이지 결코 어렵지 않은 것입니다만. 이것으로 구글북스 검색 API를 활용한 XML 패싱에 대한 이야기는 마치도록 하겠습니다. 궁금하신 점이나 문의사항은 댓글로 남겨주세요. 아는 한도 내에서는 대답해 드리겠습니다. 단, 소스(프로젝트 자료) 공유는 불가능합니다.














