Android (안드로이드)

[Android] HTTP 통신 라이브러리 - Retrofit / 예제 / 사용법

Oscar:) 2024. 1. 25. 07:14

 

 

이번 포스팅에서는 HTTP 통신 라이브러리 중

Retrofit 사용법을 알아보겠다.

 

 


 

Retrofit 이란?

 

 

공식 깃허브 ↓

 

 

GitHub - square/retrofit: A type-safe HTTP client for Android and the JVM

A type-safe HTTP client for Android and the JVM. Contribute to square/retrofit development by creating an account on GitHub.

github.com

 

 


 

Square 사에서 2016년도에 출시하였다.

 

Retrofit은 사실 2010년 부터 Square 사에서는 사용되고 있었지만,

본격적인 출시와 함께 사용자들에게 많이 알려지기 시작한 것은

2016년 Retrofit2 버전 배포 이후다.

 

우리가 현재 사용하고 있는 라이브러리가 Retrofit2 다.

 

 


 

Retrofit은 OkHttp의 상위 호환 버전이다.

 

그렇기에 OkHttp의 기본 문법을 계승하여 거의 비슷하다.

추가적인 기능이 늘어나고 코드를 세분화하여 생산성을 높였다고 볼 수 있다.

 

 


 

Retrofit의 특징을 간단히 이야기 하자면,

 

- 다른 라이브러리와는 다르게, Interface를 활용하여 요청을 보낸다.

- 어노테이션을 많이 사용하여, 코드의 목적이 뚜렷하다.

- ConverterFactory를 사용하여 다양한 변환기를 적용할 수 있다.

- 동기 · 비동기 처리 방식 중 선택하여 사용할 수 있다.

  (execute / enqueue)

 

 


 

사용해보기

 

✅ 의존성 추가

 

build.gradle(모듈 수준)에 다음 의존성을 추가해준다.

 

// 레트로핏
implementation 'com.squareup.retrofit2:retrofit:2.9.0'

// 스칼라 변환기
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'

// gson 변환기
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'

 

제일 위에 있는 레트로핏 의존성만 추가해줘도 되지만,

 

아래 2개의 변환기도 추가해준다.

 

변환기에 대한 설명은 아래 내용에서 하겠다.

 

 

 

레트로핏 최신 버전은 위 깃허브 링크에서 확인하기 바란다.

 

 


 

✅ 기본 문법

 

레트로핏을 사용하기 위해서는 필요한 요소부터 정리해야 한다.

일반적으로 사용하는 요소는 다음과 같이 3가지로 볼 수 있다.

 

- 레트로핏을 사용하는 액티비티.java

- 요청 인터페이스.java

- 데이터 클래스.java

 

 

이번 예제에서는 레트로핏 클라이언트를 액티비티에서 생성하고 사용하지만,
흔히 클라이언트를 클래스로 분류하여 싱글톤으로 사용하곤 한다.
그러면 java 파일이 4개가 된다.

반대로, 데이터 클래스를 생략하고 String 타입으로 응답을 받는다면
java 파일 2개로 해결할 수도 있다.

 

 

 

이제 하나씩 차근차근 알아보겠다.

 

 

RetrofitActivity.java

// 1) 레트로핏 클라이언트 초기화.
Gson gson = new GsonBuilder().setLenient().create();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl('URL')
    .addConverterFactory(ScalarsConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

// 2) 레트로핏 인터페이스 및 Call 객체 초기화
RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
Call<'데이터 클래스'> call = retrofitInterface.method();

// 3) Call 객체를 비동기 방식으로 요청 및 응답
call.enqueue(new Callback<'데이터 클래스'>() {
    @Override
    public void onResponse(Call<'데이터 클래스'> call, Response<'데이터 클래스'> response) {
        // 응답 성공 시 처리
    }
    @Override
    public void onFailure(Call<'데이터 클래스'> call, Throwable t) {
        // 응답 실패 시 처리
    }
});

 

 

1) 레트로핏 클라이언트 초기화

 

레트로핏 클라이언트를 초기화해주는 부분이다.

addConverterFactory() 메서드를 이용하여 변환기를 장착할 수 있다.

 

위 예제에서는 2개의 변환기를 장착했는데,

ScalarsConverterFactory는 문자열(String) 응답을 자동 파싱해준다.

GsonConverterFactory는 JSON 타입의 응답을 자동 파싱해준다.

 

위 2개의 Converter를 장착하기 위해 초반부에 의존성을 추가해줬다.

 

각자 앱 환경에 알맞는 Converter를 장착하기 바란다.

 

 

 

2) 레트로핏 인터페이스 및 Call 객체 초기화

 

인터페이스를 생성하고 Retrofit 객체의 create() 메서드에 초기화 해준다.

그리고 Call 객체를 생성하고 해당 인터페이스 내 메서드를 호출한다.

 

Call 객체는 제네릭'<>' (타입 지정)이 필요하다.

만들어줄 데이터 클래스를 넣어주면 된다.

 

 

 

3) Call 객체를 비동기 요청 및 응답

 

Call 객체의 enqueue() 메서드를 사용하여 비동기 요청을 진행한다.

 

 

 

 


 

다음은 요청할 부분을 담당하는 인터페이스다.

 

RetrofitInterface.java

public interface RetrofitInterface {

    // Http Method == GET
    @GET("요청 URL 내 세부 경로")
    Call<'데이터 클래스'> method (
            @Query("php 파일에서 구분할 식별자") String example
    );
    
    // Http Method == POST
    @POST("요청 URL 내 세부 경로")
    Call<'데이터 클래스'> method (
            @Field("php 파일에서 구분할 식별자") String example
    );

}

 

레트로핏을 사용하는 곳에서 호출할 메서드를 만들어준다.

 

Http Method에 따라 어노테이션이 달라진다.

 

상황에 따라 더 다양한 어노테이션을 붙여줘야 한다.

어노테이션은 각자 공부하기 바란다.

 

 

 


 

다음은 데이터 클래스다.

 

Data.java

public class Data {

    @Expose
    @SerializedName("name") String name;

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

}

 

예제는 'name' 데이터라고 가정한다.

 

마찬가지로 어노테이션을 사용하여 식별자를 지정해준다.

 

그리고 간단한 getter & setter를 만들어줬다.

 

 

 


 

✅ 사용해 보자

 

서버에 간단한 php 파일을 만들고,

해당 URL로 요청을 보내서 응답을 확인해 보겠다.

 

위 문법에서 사용한 예제를 그대로 사용한다.

 

RetrofitActivity.java

String url = "http://1.23.456.78/";
Gson gson = new GsonBuilder().setLenient().create();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(ScalarsConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
Call<Data> call = retrofitInterface.getData("Oscar", "9살");

call.enqueue(new Callback<Data>() {
    @Override
    public void onResponse(Call<Data> call, Response<Data> response) {

        String name = response.body().getName();
        String age = response.body().getAge();
        Log.d(TAG, name + "는 " + age + "이에요!");

    }
    @Override
    public void onFailure(Call<Data> call, Throwable t) {
        Log.d(TAG, "onFailure : " + t);
    }
});

 

'URL' 부분에 실제 경로를 넣어주었고,

응답 성공·실패 시 로그를 찍어놓았다.

 

url 같은 경우는, 해당 파일 명까지 넣을 필요는 없다.

인터페이스에서 파일 명 분류를 해줄 것이다.

 

 

 

해당 php 파일은 다음과 같다.

 

 

GET 메서드로 요청 변수 데이터를 받고,

Array에 담아서 JSON 인코딩하여 출력하는게 전부다.

 

 

 

 

다음은 요청할 부분을 담당하는 인터페이스다.

 

RetrofitInterface.java

public interface RetrofitInterface {

    @GET("API_Test.php")
    Call<Data> getData (
            @Query("name") String name,
            @Query("age") String age
    );

}

 

@GET 어노테이션 인수에 url의 뒷 부분(세부 경로)

즉, 파일명을 넣어주었다.

 

그리고 GET 메서드를 사용하였기에 @Query 어노테이션을 사용했다.

해당 어노테이션의 인수는 php 파일에서 GET 으로 받을 때 구분할 수 있는 식별자다.

 

 

 

다음은 데이터 클래스다.

 

Data.java

public class Data {

    @Expose
    @SerializedName("name") String name;

    @Expose
    @SerializedName("age") String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}

 

이름과 나이에 대한 데이터 클래스를 준비했다.

 

@SerializedName 어노테이션은 데이터 응답 후 JSON 자동 파싱할 때의 식별자가 된다.

 

 

 

이제 실행해보자.

 

 

응답이 잘 도착했다.

 

 


 

 

 

이번 포스팅에서는 Retrofit 라이브러리에 대해 알아보았다.

 

앞선 2개의 라이브러리보다 초기 구축 비용이 더 높지만,

그만큼 세분화된 모듈화 덕에 추후 유지·보수가 편리하다고 느낀다.