본문 바로가기
Kotlin/Kotlin 팁

Android HTTP 통신을 위한 Retrofit 사용하기

by MonoSoft 2022. 9. 14.
728x90
반응형

Android HTTP 통신을 위한 Retrofit 사용하기

 

Android Retrofit을 소개합니다.

 

Retrofit은 

HTTP REST API 구현을 위한 라이브러리입니다.

 

jakewharton이 소속된 Square, Inc의 

오픈소스 라이브러리입니다.

 

Square, Inc에는 많이 들어보셨을 

otto, dagger, picasso, OkHTTP 등

오픈소스로 배포 중입니다.

 

REST : Representational State Transfer의 약자로, 

웹에서 사용하는 Architecture의 한 형식입니다. 

네트워크 상에서 클라이언트와 서버 간의 통신 방식을 말합니다.

HTTP에서는 GET, POST, PUT, DELETED 등의 Method를 제공합니다.

클라이언트에 대한 응답은 xml, json, text, rss 등으로 전달하게 됩니다.

 

What exactly is RESTful programming?

 

Retrofit

Retrofit은 REST API을 구현한 상태입니다.

그래서 간단하게 GET, POST, PUT, DELETED 등을 전달하면 

서버에서 처리 후 xml, json, text, rss 등으로 응답을 제공받을 수 있는 형태입니다.

(실제 서버에서 응답 오는 방법은 다를 수 있습니다.)

 

Retrofit 적용하기

Retrofit 설명 페이지

Gradle와 JAR를 모두 제공하고 있으며, Android Studio의 build.gradle에 다음과 같이 추가합니다.

compile 'com.squareup.retrofit2:retrofit:(insert latest version)' 

 

Introduction

Retrofit은 interface을 정의하고, 이 interface class을 Retrofit에 

초기화를 하는 과정을 거치면, HTTP 통신을 할 준비가 완료됩니다.

아래는 GitHub에서 제공하는 API 중 

user와 관련된 부분을 불러오는 부분입니다.

interfaceService로 정의하고, 

@GET annotation을 추가하고 다음을 정의하면 됩니다.

 

public interface GitHubService { 

  @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); }

 

다음과 같이 Retrofit을 초기화합니다. 

간단하게 baseUrl을 적어서 초기화할 수 있습니다.

Retrofit을 생성하면, 위에서 생성한 GitHubService을 retrofit을 통해 생성합니다.

 

이후부터는 service을 통해서 Retrofit을 사용하게 됩니다.

Retrofit retrofit = new Retr

ofit.Builder() .baseUrl(  "https://api.github.com/ ") .build(); GitHubService service = retrofit.create(GitHubService.class);

 

그 외 @GET, @POST, @PUT, @DELETED, @HEAD 등의 

자료는 Retrofit API 문서를 참고하시면 되겠습니다.

(실제 서버와 통신하는 방법에 따라서 달라지는 부분이 되겠습니다.)

 

Retrofit API

ConvertFactory 이용하기

대부분의 서버에서는 응답으로 json을 주로 이용합니다.

retrofit은 이러한 응답을 간단하게 변환할 수 있도록, 

다양한 Converter을 제공하고 있습니다. 

바로 addConverterFactory()로 추가하는 방법입니다.

 

Retrofit에서 소개하고 있는 

간단한 예제를 동작하면 아래와 같이 오류가 발생할 수 있습니다.

Caused by: java.lang.IllegalArgumentException: Unable to create converter for class

tech.thdev.customlistviewsample.data.GitHubUserResponse 

 

Converter 초기화 안되어서 나타나는 오류입니다.

이번 글에서는 GsonConverterFactory을 추가하는 방법을 정리합니다.

 

GsonConverterFactory 추가하기

GsonConverterFactory을 사용하기 위해서는 

먼저 build.gradle에서 다음을 추가합니다.

compile 'com.squareup.retrofit2:converter-gson:(insert latest version)' 

 

그리고 retrofit 초기화 코드에 addConverterFactory을 

 

다음과 같이 추가해주시면 됩니다.

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com

") .addConverterFactory(GsonConverterFactory.create()) .build();

 

이렇게 하면 다음과 같은 interface 정의를 사용할 수 있습니다.

public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); }

 

Repo 객체도 당연히 구현되어 있어야 합니다.

아래는 data 객체 예입니다.

data class Repo(val name: String)

 

Retrofit에서 응답받은 데이터 처리하기

Retrofit과 생성한 interface을 연결하였습니다.

응답받는 곳에서는 다음과 같이 처리할 수 있습니다.

다음과 같이 searchGitHubUser을 호출하였습니다.

이때 Retrofit은 알아서 Thread을 처리하고, 

동기화로 데이터를 넘겨줍니다.

받아온 데이터를 enqueue을 통해서 

onResponse와 onFailure을 사용합니다.

onResponse의 경우 서버에서 정의하는 

success가 아닌 경우에 대한 예외 처리를 포함한 

코드 작성을 해주시면 되겠습니다.

GsonConverterFactory을 설정하였기 때문에 

response.body()는 다음과 같이 처리가 가능합니다.

 

final Call<GitHubUserResponse> gitHubUserCall = retrofitGitHub.searchGitHubUser(userKeyword, ++page, DEFAULT_I

TEM_COUNT); gitHubUserCall.enqueue(new Callback<GitHubUserResponse>

 

() { @Override public void onResponse(Call<GitHubUserResponse> call, Response<GitHubUserResponse> response) { 

 

if (!response.isSuccessful()) { return; } 

// 정상 응답 

// Retrofit에서 GSON을 GitHubUserReponse로 변환한 결과를 받아온

다 

GitHubUserResponse gitHubUserResponse = response.body(); } 

@Override public void onFailure(Call<GitHubUserResponse> call, Throwable t) 

{ // 응답 실패(네트워크 오류 등) } });

 

728x90
반응형

댓글