티스토리 뷰

이전에 Retorfit이 왜 필요하고 기본적인 구조는 어떻게 되어 있는지 알아봤으니 사용하기 위해 준비해야 하는 작업과 간단한 사용법을 알아보도록 하자. [깡샘의 안드로이드 프로그래밍] 책을 기본으로 정리하는 포스팅이 되겠다.

 

0. 목차

우선 Retrofit을 사용하는 순서를 정리하자면 다음과 같다.

  1. build.gradle 설정
  2. 권한 설정
  3. Model 정의
  4. Retrofit 객체 생성
  5. Service 인터페이스
  6. Call 객체 획득
  7. 네트워킹 시도

하나하나 차근차근 살펴보자.

 

 

1. build.gradle 설정

1
2
3
4
5
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
// gson : Json, XML을 파싱하여 VO 객체로 변환해주는 컨버터의 종류
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

Json과 XML을 VO 객체로 파싱해주는 컨버터의 경우에는 jackson, Moshi 등등 다양한 컨버터가 있지만 예시에서는 Gson 라이브러리를 활용하였다.

 

 

2. 권한 설정

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

Retrofit도 서버 연동을 목적으로 하므로 AndroidManifest.xml 파일에 다음처럼 퍼미션을 설정해야 한다.

 

 

3. Model 정의

JSON이나 XML 데이터를 개발자가 직접 파싱하지 않고 컨버터가 자동으로 VO 객체를 생성하기 위해서는 Model 클래스를 정의해야 한다. Model은 데이터를 담기 위한 목적이므로 아래처럼 public으로 선언한 변순들이 나열된 클래스여야 한다. 

1
2
3
4
5
6
7
8
public class ItemModel {
    public long id;
    public String author;
    public String title;
    public String description;
    public String urlToImage;
    public String publishedAt;
}

위처럼 변수를 선언하면 컨버터는 변수명과 파싱된 데이터의 키값을 매핑해서 데이터를 저장한다.

1
2
3
4
5
6
7
8
{
    "author":"weekyear",
    "description":"적어야 살아남는다.",
    "id":"1",
    "publishedAt":"2021-03-22",
    "title":"[Android] Retrofit 기본 사용법",
    "urlToImage":"retrofit.jpg"
}

 

단일 객체의 경우에는 위와 같이 사용하면 되겠지만 JSON은 아래와 같이 여러 항목 데이터가 넘어올 때도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "articles":[{    
        "author":"weekyear",
        "description":"적어야 살아남는다.",
        "id":"1",
        "publishedAt":"2021-03-22",
        "title":"[Android] Retrofit 기본 사용법",
        "urlToImage":"retrofit.jpg"
    },{
        "author":"weekyear",
        "description":"적응해야야 살아남는다.",
        "id":"2",
        "publishedAt":"2021-03-23",
        "title":"[Android] Retrofit 사용하는 이유와 기본 구조조",
        "urlToImage":"retrofit.jpg"
    }],
    "id"0,
    "totalResults"24718
}

 

위 데이터는 articles라는 ItemModel들이 여러 항목 담긴 array와 id, totalResults를 필드로 가지는 객체이다. 그래서 위와 같은 경우에는 articles, id, totalResults의 필드를 가지고 있는 Model 클래스와 articles안에 들어가는 몸체에 해당하는 Model 클래스 두 개가 필요하다.

안에 들어가는 몸체는 위에 정의한 ItemModel과 동일하고 articles, id, totalResults의 필드를 가지고 있는 Model 클래스 PageListModel 클래스는 다음과 같이 표현할 수 있다.

1
2
3
4
5
6
public class PageListModel {
 
    public long id;
    public long totalResults;
    public List<ItemModel> articles;
}

 

 

4. Retrofit 객체 생성

Model이 준비되었다면 이제 Retrofi을 이용해야할 차례다. Retrofit은 Builder에 의해만들어지며 Builder의 세터 함수에 각종 정보를 설정해주면 된다.

1
2
3
4
5
6
7
8
public class RetroHelper {
    static Retrofit getRetrofit() {
        return new Retrofit.Builder()
                .baseUrl("https://~~~~")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
}
  • baseUrl() : Retrofit을 이용할 때 기본적으로 적용되는 서버 URL
  • addConverterFactory : 서버와 통신할 데이터 타입에 맞는 컨버터를 지정. 위 예시의 경우에는 GsonConverterFactory를 지정하였기 때문에 JSON 데이터를 Gson 라이브러리로 파싱하고 그 데이터를 Model에 자동으로 담아준다.

 

5. Service 인터페이스

Retrofit의 핵심에 해당하는 부분이다. 서버 네트워킹을 위한 함수를 인터페이스의 추상 함수로 만들고 그 함수에 어노테이션으로 GET/POST 등의 HTTP method 지정, 서버 전송 쿼리 지정 등을 하면 그 정보에 맞게 서버를 연동할 수 있는 Call 객체를 자동으로 만들어 주는 구조다.

1
2
3
4
5
6
7
public interface RetrofitService {
    @GET("/v2/everything")
    Call<PageListModel> getList(@Query("q"String q,
                            @Query("apiKey"String apiKey,
                            @Query("page"long page,
                            @Query("pageSize"int pageSize);
}

어노테이션 선언이 중요한데 위에서 나와있는 어노테이션은 다음과 같은 의미를 가지고 있다.

@GET("/v2/everything")

GET 방식으로 연동이 이루어져야 하며 baseUrl 뒤에 붙는 Path로 "/v2/everything"가 지정되어야 한다.

 

@Query("q") String q

서버 연동 시 넘어가야 하는 쿼리를 지정하는 부분이다. 위와 같이 지정되어 있으면 서버 URL이 https://~~~~/v2/everything?q=1로 넘어가게 된다.

 

 

6. Call 객체 획득

이제 Call 객체를 만들어줄 Retrofit Service 객체를 아래 코드로 획득하면 된다.

1
networkService = RetrofitHelpler.getRetrofit().create(RetrofitService.class);

위 create() 함수로 네트워킹을 위한 Call 객체를 가지는 Service 객체가 자동으로 만들어진다. 이렇게 얻은 Service 객체를 이용해 인터페이스에서 정의한 함수를 호출하면 Call 객체를 얻을 수 있다.

1
Call<PageListModel> call = networkService.getList(QUERY, API_KEY, 12)

 

 

7. 네트워킹 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
call.enqueue(new Callback<PageListModel>() {
    @Override
    public void onResponse(Call<PageListModel> call, Response<PageListModel> response) {
        if (response.isSuccessful()) {
 
            //...
 
        }
    }
 
    @Override
    public void onFailure(Call<PageListModel> call, Throwable t) {
 
 
    }
});

Call 객체의 equeue() 함수를 호출하면서 Callback 클래스의 객체를 매개변수로 지정하면 네트워킹을 시도하고 서버에서 정상적으로 결과를 받았을 때와 서버 연동에 실패했을 때 동작할 함수를 지정할 수 있다.

 

 

마무리

사실 책보고 정리한 내용에 불과하기 때문에 직접 해보고서 또 느끼는 내용이 있을거라고 생각한다. Retrofit을 써보고 또 새로운 포스팅을 써보도록 하겠다.

 

참고자료

<깡샘의 안드로이드 프로그래밍> 3판

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함