retrofit 안드로이드 | 안드로이드 통신

retrofit Android Tutorial


이 글은 안드로이드에서 retrofit을 사용하기 위해 헤메던 분이라면, 길더라도 끝까지 봐주시기 바랍니다. 저는 많이 헤매고.. 왔습니다. 튜토리얼이나 사용법이 제대로 정리되있지 않더라구요. 가장 이해하기 간단하고 쉬운 샘플(100line, 3class)로 가르쳐 드리겠습니다.

여기서 가르쳐드릴 내용은, retrofit을 android에서 사용하는 것입니다. 우선 기초적으로 get / post 를 가르쳐 드리고 추가적으로 알려드리겠습니다.

  1.  환경 설정
    먼저 두 군데 환경 설정을 해주어야 합니다.
    첫 번째, manifest입니다.  ( app > manifests ) 



    안드로이드에선 H/W의 기능을 사용할 때 이에 대한 허가가 필요한데 이를 uses-permission이라고 합니다. 여기서 인터넷 기능을 사용 가능하도록 합니다.
    위치는 <manifest> 바로 뒤라고 보시면 됩니다. 코드는 아래 것 사용하세요.

    <uses-permission android:name="android.permission.INTERNET"/>

    * 위 코드는 대, 소문자를 포함해 오타가 하나라도 있다면 에러가 발생하구요.. 찾기 힘들어서 난처했던 경험이...

    두 번째, gradle 입니다.  ( Gradle Scripts > build.gradle (Module: app) ) 



    dependencies에서 compile 부분에 retrofit2라고 쓰여 있는 두개를 넣어주면 됩니다. okhttp3는 retrofit에서도 사용되지만, 다음에 배울 파일 전송 부분에서 사용되고, post / get 에서는 굳이 필요하지 않습니다.

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'

    
    
  2. 서버 확인
    먼저 서버부터 확인하도록 합니다. 서버가 제대로 동작하지 않는다면 아무리 고쳐봤자 소용이 없겠죠.
    먼저 GET을 확인하도록 합니다. 이유는 POST는 서버에서 확인해야 하는데, GET은 가져오는 거니까 서버에서 확인하지 않아도 되기 때문이죠.

    서버가 제대로 동작하는지 POSTMAN을 활용해 알아보겠습니다. 사용할 줄 모르신다면, 유용하면서 간단하니까 다음 글을 참고해주세요.  POSTMAN 사용법 

    POSTMAN을 사용해서 http://api.github.com/users/meansoup 에 GET을 실행시킨 결과는 아래와 같습니다. 아래의 데이터로 GET 예제를 진행하도록 하겠습니다.

    {
      "login": "meansoup",
      "id": 24368552,
      "avatar_url": "https://avatars2.githubusercontent.com/u/24368552?v=3",
      "gravatar_id": "",
      "url": "https://api.github.com/users/meansoup",
      "html_url": "https://github.com/meansoup",
      "followers_url": "https://api.github.com/users/meansoup/followers",
      "following_url": "https://api.github.com/users/meansoup/following{/other_user}",
      "gists_url": "https://api.github.com/users/meansoup/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/meansoup/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/meansoup/subscriptions",
      "organizations_url": "https://api.github.com/users/meansoup/orgs",
      "repos_url": "https://api.github.com/users/meansoup/repos",
      "events_url": "https://api.github.com/users/meansoup/events{/privacy}",
      "received_events_url": "https://api.github.com/users/meansoup/received_events",
      "type": "User",
      "site_admin": false,
      "name": null,
      "company": null,
      "blog": "",
      "location": null,
      "email": null,
      "hireable": null,
      "bio": null,
      "public_repos": 2,
      "public_gists": 0,
      "followers": 0,
      "following": 1,
      "created_at": "2016-12-04T10:54:17Z",
      "updated_at": "2017-05-18T01:35:45Z"
    }
    


  3. 요청 데이터

    다음으로 요청 데이터를 뽑도록 합니다.



    User라는 클래스를 만들었습니다. 다른 블로그에서 볼 수 없게 자세히 가르쳐 드리는 거니까 잘보세요!
    클래스 이름은 당연 상관 없구요. 여기 들어가는 login, html_url 이라는 String 변수들의 이름이 중요합니다. 잘보면 2번에서 확인한 JSON 형식 데이터에 login, html_url 이라는 key들이 있는 것을 볼 수 있습니다. 우리 목표는 저 값을 가져오는 것입니다.
    그니까, 서버에서  key : value  형식으로 보낼 때  key 가 저기 들어가야 된다는 거죠.

  4. 서비스

    다음으론 서비스 interface를 구현합니다.



    자, 서비스인데요. inteface로 구현해서 retrofit에서 제공하는 annotation(@GET @POST) 를 사용합니다.
    여기서 중요한점은, Call<> 안의 데이터 형식이  미리 구현한 User  라는 것이구요.
    추가로 어노테이션에 나오는 것은  상세 경로 에요. 이건 activity 부분에서 다시 설명하도록 할게요.
    여기서 { *** } 의 값은 @Path( *** ) 의 값 을 받아와요. 동적 으로 주소를 할당할 수 있게 되죠. (하지 않아도 됨)
    POST 부분의 @Body는 보낼 데이터를 쓰는 것입니다.



  5. 실제 사용 (Activity)

    100줄도 안되지만 mainActivity는 코드가 길어요. 아래에 추가하지만, 보기도 불편하니까  github only-post-get branch 를 참고해 주세요

  6.  
    get/post Button을 생성해서 누르면 오고 가도록 구성하였구요. GET은 앞서 말한 것처럼 github에서 정보를 가져오는 것으로 빌드하시면 작동하구요. POST는 서버가 있으시다면 서버와 주소만 바꿔주시면 될 것 같습니다. (실제 프로젝트에서 사용해보았어요)

    뷰를 구성하는 코드를 제외하면 중요한 부분은
    먼저 retrofit과 service 선언입니다.



    여기서 baseUrl은 기본적인 주소가 되는 곳을 말합니다. 앞서 service에서 구현한 POST/GET에서 /users/{ID} 와 같은 Path가 baseUrl에 붙여지는 것이라 보시면 됩니다.
    결과적으론 http://api.github.com/users/{ID} 와 같이 되겠죠.

    다음으론 getData 입니다. 



    여기서도 출력 확인을 위한 코드를 뺀다면 사실상 볼 것은 구조와 getRepos의 사용입니다.
    Call<User> call 을 사용해 통신을 보냅니다. 여기서 service에 만들어 놓은 getRepos를 사용하는데, 서비스에서 Path로 String 값을 매개변수로 받기 때문에 우린 "meansoup"를 보내줍니다.
    그럼 결과적으로 http://api.github.com/users/meansoup 으로 통신하게 되죠.
     onResponse는 응답에 대한 부분 이고, isSuccessful을 통해 응답이 왔는지 확인합니다.
    응답은 response.code()가 200이면 제대로 온것으로 확인하시면 되겠습니다.
    여기서 또 중요한 것은, response.body()로 받는 것이 아닌, response.body().login, response.body().html_url 과 같이, 미리 선언해 놓은 데이터 구조로 받아와야 합니다.
    onFailure는 실패했을 때 입니다.

    다음으로 postData 입니다.



    자 같은 방식입니다. meansoup을 path로 보내고, user는 우리가 보낼 데이터에요. service 부분 선언을 보시면 Body에 User가 있는 것을 보실 수 있을겁니다.
    Toast는 확인을 위해 만들었는데.. 빼면 정말 아무것도 없죠? GET을 참고하시면 이해하는데 어려운 점 없을 거라 생각합니다.
별도로 retrofit 사용 이유와 retrofit에 대해 알고 싶다면 아래를 참고해 주세요
 retrofit 이란? 
Previous
Next Post »