본문 바로가기
Developer/Android, Java

[안드로이드] Retrofit 기본 예제 (서버 통신)

by Doony 2019. 3. 21.

이번 포스팅은, 서버와 통신하는 앱이라면 필수적으로 사용할 수도 있는 라이브러리인, Retrofit에 대해 다루고자 한다. 보통 서버와 통신할 때는, 새로운 스레드를 만들어서 휴대폰 UI Thread와 분리하여 정보를 주고 받는다.  

그렇지 않으면, UI와 서버통신이 서로 겹치면서 꼬일 수도 있기 때문으로 알고 있는데... 자세한 이론적인 것은 잘 모르겠고, UI구성하는 것 외 서버와 순수히 데이터를 주고받는 것은 모두 다른 스레드에서 처리하게 된다.

이 때 이것을 일일이 코드로 new Thread()해가며 처리하기엔 너무 복잡하다. Retrofit 라이브러리를 사용하면 자체적으로 알아서 처리해주기 때문에 아주 편리하고, 또 사용이 굉장히 쉽다.

라이브러리 공식페이지에 사용법들이 잘 나와있다. 보면 크게 어렵지 않기 때문에, 처음 시작방법만 익히면 쉽게 구현이 가능하다.


1. Gradle 설정

1
2
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
cs

Gradle.app에 해당 문구를 추가하고, Sync!


2. Retrofit 클래스 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
public class RetrofitConnection {
 
    String URL = "https://www.abc.com/"// 서버 API 
 
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
 
    RetrofitInterface server = retrofit.create(RetrofitInterface.class);
 
}
 
cs

앱을 만들다보면, 하나의 액티비티에서만 서버를 콜할 경우보다는, 여러 액티비티에서 콜할 가능성이 많다. 각 액티비티에서 Retrofit 객체를 일일이 생성해줘도 관계없으나, 코딩의 간결성을 위해 별도의 클래스로 위와 같이 정리하였다.

URL에는 서버에 호출할 기본 주소를 입력해주자. 하단부에는 앞으로 생성할 인터페이스 객체도 미리 생성하였다.


3. Interface 생성

1
2
3
4
5
6
public interface RetrofitInterface {
 
    @GET("something/")
    Call<Get_My_Data> get_data();
 
}
cs

이 부분에는 GET/POST/PUT/DELETE 등 필요한 모든 함수를 선언하는 부분이다. Call <> 사이에는 서버의 Json 형태에 따라 클래스 파일을 만들어서 넣어주면 된다. 


4. 원하는 Activity에서 다음과 같이 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 RetrofitConnection retrofitConnection = new RetrofitConnection();
        Call<Get_My_Data> call =  retrofitConnection.server.get_data();
        call.enqueue(new Callback<Get_My_Data>() {
            @Override
            public void onResponse(Call<Get_My_Data> call, Response<Get_My_Data> response) {
                if (response.isSuccessful()) {
                    // 성공적으로 서버에서 데이터 불러옴. 
                    }
                } else {
                    // 서버와 연결은 되었으나, 오류 발생
                }
            }
 
            @Override
            public void onFailure(Call<Get_My_Data> call, Throwable t) {
                Log.d(TAG, "onFailure: " + t.toString()); //서버와 연결 실패
            }
        });
 
cs

위에서 선언한 클래스를 차례대로 불러주기만 하면 끝. 물론 Retrofit에서 제공하는 기능은 이보다 더 다양하지만, 기본적으로는 이런 방식으로 구현된다고 볼 수 있다.

댓글