반응형

현재 날씨 어플을 AsyncTask를 통해 구현한 후, 같은 기능을 Retrofit을 이용해 RESTful API를 구현해봤다.

어플의 기능은 아래 링크와 같다.

 

[안드로이드 스튜디오 독학#27] 현재 날씨 어플

Thread와 Network를 공부하고 개념을 정리하기 전에 간단한 예제를 구현하려고 했는데, 생각지 못한 에러가 여러곳에서 발생했고, 이를 해결하다보니 게시물을 올리는 시간이 늦춰졌다. 스레드를

seminzzang.tistory.com

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

 

OKKY - All That Developer

Editor's Choice 국비 학원 Weekly Best 사람들과 맞춰 가는 것 길더 77 2021-02-05 13:02:01 수학 공부 fender 20k 2021-02-03 12:55:54 이직에 성공했네요 ㅎㅎ 콰아앙 54 2021-02-04 23:18:48 Q&A 안드로이드 부모 프래그먼트

okky.kr

 

Stack Overflow - Where Developers Learn, Share, & Build Careers

Stack Overflow | The World’s Largest Online Community for Developers

stackoverflow.com

 이 어플을 만든 목표는 Retrofit을 사용해서 OpenAPI 데이터를 가져오는 것이였다.

 Retrofit을 구현하기 위해 자료를 여기저기 찾아봤지만,

 안드로이드에서 제공하는 라이브러리가 아니고 미국의 Square사에서 제공하는 라이브러리여서 그런지 자료를 찾기 어려웠다.

 기존에 안드로이드 스튜디오를 공부하면서 developer android를 많이 애용했는데 Retrofit 관련 자료는 Square 사의 깃허브 링크를 많이 참고했다.

 이번에는 한 5일은 삽질을 했던것 같은데 여기저기서 자료를 찾으면서 유용한 사이트를 많이 알 수 있었다.

 위에 링크를 걸어놨는데, okky와 stack overflow를 보고 내가 겪었던 에러와 비슷한 경우를 많이 볼 수 있었다.

 okky는 국내 커뮤니티이고, stack overflow는 해외 커뮤니티이다.

1. 시행착오 

 초기 시행착오의 내용은 아래 게시물에 작성했다.

 

[안드로이드 스튜디오 에러#2] Retrofit, Jaxb, OkHttpClient

오늘도 삽질을 했습니다..... 난이도가 어려워질수록 한번에 되는게 없네요 RestAPI까지만 혼자 공부하고 학교 취업 커뮤니티에서 알게된 같은과 선배님이랑 프로젝트 하나 진행해보려 했는데, 언

seminzzang.tistory.com

 1) XML 에러

 기존에 OpenAPI를 XML형태로 파싱해서, Retrofit으로도 XML을 다루고 싶어서 Retrofit에서 제공하는 컨버터를 확인했는데,

 SimpleXMLConverter에 관한 자료가 많이 나와서 SimpleXMLConverter를 사용하려 했다.

 그런데 SimpleXMLConverter는 deprecated 되었다 해서, 새로 찾은 컨버터가 JAXB였다.

 JaxbConverter를 등록하고 URL을 통해 XML데이터를 가져오려 했는데, 아래와 같은 에러메세지를 받았다.

 "Unable to create converter for class "MyClass" for method "MyMethod"

 아무리 코드를 찾아봐도 오류를 찾을 수 없었고, 여기저기 찾아보다가 okky커뮤니티에 질문을 하게 되었는데, 

 한 분이 아래 링크를 보여주셨다.

 

JAXB converter throws java.lang.ClassNotFoundException for ContextFactory · Issue #2707 · square/retrofit

I'm using the new JAXB converter and dropping in my gradle dependencies like so: implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:conver...

github.com

 JAXB또한 Retrofit에서 더이상 지원하지 않는다고 한다.....

 JAXB를 붙잡고 한 3일동안 삽질한 것 같은데, 현타가 많이왔다.....

 그래서 XML 말고 JSON 타입의 데이터를 받아오기로 했다.

 2) Query 에러

 Json타입을 다루기 위해 GsonConveter를 등록하고, Query를 작성했는데, 다음과 같은 에러를 얻었다.

 "Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $"

 구글링을 해봤는데 JSON의 처음이 배열형태( [ ] ) 일 때 저런 비슷한 에러메세지를 받는다는 내용이 많았는데, 내 JSON 데이터는 배열형태 시작이 아니였다.

 에러메세지를 해석해보니 특정 위치의 메세지가 BEGIN_OBJECT( { } )로 들어와야 되는데 STRING(" ")으로 들어온다는 내용이였다. 

 그래서 URL을 넘겨줄 때 유효하지 않은 URL을 넘겨준다고 생각했다. 

 일부러 URL에 오타를 내서 @GET을 통해 똑같이 보내주었는데 동일한 에러를 얻을 수 있었다.

 비슷한 사례를 찾아보면서 이것 역시 okky에 질문했는데, 딱히 도움을 얻지는 못했고 혼자 이것저것 해보다가 어떻게 오류를 해결할 수 있었다.

 기상청의 OpenAPI에서 내가 사용한 초단기실황은 8개의 요청 메세지를 갖고 있는데

 URL을 이것저것 건드려보다가 서비스 키가 제대로 인식되지 못하는 상황이 생길 수 있는 것을 확인했다.

 그래서 서비스키를 변수로 넣어주지 않고, URL에 String 형태로 붙이고 그 뒤에 나머지 항목을 Query문으로 붙였더니, JSON을 제대로 읽어올 수 있었다.

 사실 왜 이렇게 되는지는 모르겠는데, 내가 생각하기에는 문자열이 너무 길어 문자열을 넘겨주는 과정에서 잘리거나 뭔가 수정된 것이 아닐까 생각이 든다.

2. 결과물 

 이러한 과정을 거치면서 Retrofit을 이용해서 실시간 날씨 값을 얻어올 수 있었다.

3. 앞으로의 목표

1) 현재 위치값을 받아 현위치의 실시간 날씨 출력하기.

 2) 리사이클러뷰를 이용해서 여러개의 날씨 목록 출력하기.

 3) 기상청 API에서 제공되는 위치값과 실제 GPS를 통해 받는 위도/경도 값이 단위가 다른데, 이때 값의 변환.

 4) 기상청 API에서 제공되는 좌표값은 지역에 따라 총 3,770개인데 이를 처리할 방법.

 5) 디자인 변경( 날씨에 따른 이미지, 커스터마이징 인터페이스 등)

반응형

+ Recent posts