본문 바로가기
Android Studio

[Android Studio] 안드로이드 네트워크 통신 Retrofit 라이브러리 사용하기

by coding_su 2023. 2. 9.

📝안드로이드 네트워크 통신 레트로핏 라이브러리 사용하기

우선 라이브러리를 사용하기위해 임포트 해준다

build.gradle파일의 dependencies에 아래 코드 입력 (공식 홈페이지에 있는 버전 확인해서 사용하기)

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")

 

레트로핏 라이브러리를 통해서 Body에 Json으로 데이터를 보낼 클래스와 응답받는 클래스를 만들어준다

먼저 클래스를 implements Serializable 해주고
API 명세서를 보고 멤버변수를 만든다(private으로 만들기)
만든 멤버변수의 Getter / Setter도 만들어준다

 

레트로핏 라이브러리를 통해서 Body에 Json으로 데이터를 보낼 클래스

public class User implements Serializable {

    private String email;
    private String password;
    private String nickname;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

 

레트로핏 라이브러리를 통해서 응답받는 클래스

public class UserRes implements Serializable {

    private String result;
    private String access_token;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
}

 

클래스를 만들었다면 api라는 패키지를 하나 생성하고 그 안에 NetworkClient 클래스를 만들어 아래코드처럼 입력해준다

※ Level.BODY 부분은 로그로 확인하고싶은 데이터로 입력해준다(없을시 NONE)

 baseUrl()에 Url을 입력하는 부분은 컨픽파일에서 상수처리해서 사용

public class NetworkClient {

    public static Retrofit retrofit;

    public static Retrofit getRetrofitClient(Context context){
        if (retrofit == null) {
            // 통신로그 확인할때 필요한 코드
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            // 네트워크 연결관련 코드
            OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1, TimeUnit.MINUTES).writeTimeout(1, TimeUnit.MINUTES)
                    .addInterceptor(loggingInterceptor).build();
                    
            // 네트워크로 데이터를 보내고 받는 레트로핏 라이브러리 관련 코드
            retrofit = new Retrofit.Builder().baseUrl(Config.DOMAIN).client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create()).build();
        }
        return retrofit;
    }
}

 

이제 사용할 API인터페이스를 만들어주는데 이름은 처리할 API관련으로 만들어준다

// 유저 관련 API 들을 모아놓은 인터페이스
public interface UserApi {

    // 회원가입 API 함수 작성
    @POST("/user/register")
    Call<UserRes> register(@Body User user);

    // 로그인 API
    @POST("/user/login")
    Call<UserRes> login(@Body User user);

}

 

다 만들었다면 아래 코드처럼 사용해준다

// 회원가입 API를 호출

// 1. 다이얼로그를 화면에 보여준다
showProgress("회원가입 진행중...");

// 2. 서버로 데이터를 보낸다
// 2-1. 레트로핏 변수 생성
Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);
// 2-2. api 패키지에 있는 인터페이스 생성
UserApi api = retrofit.create(UserApi.class);
// 2-3. api 보낼 데이터 만들기 > 클래스의 객체 생성
User user = new User(email, password, nickname);
// 2-4. API 호출
Call<UserRes> call = api.register(user);
// 2.5 서버로부터 받아온 응답을 처리한다
call.enqueue(new Callback<UserRes>() {
    @Override
    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
        // 프로그래스 다이얼로그가 있으면 나타나지않게 해준다
        dismissProgress();

        // 서버에서 보낸 응답이 200 OK일때 처리하는 코드
        if (response.isSuccessful()){
            Log.i("MEMO_APP", response.toString());

            // 서버가 보낸 데이터를 받는 방법
            UserRes res = response.body();

            // 억세스토큰은 api 호출할때마다 헤더에서 사용하므로
            // 회원가입이나 로그인이 끝나면 파일로 꼭 저장해놔야한다
            SharedPreferences sp = getApplication().getSharedPreferences(Config.PREFERENCE_NAME,MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            editor.putString(Config.ACCESS_TOKEN, res.getAccess_token());
            editor.apply();

            // 3. 데이터를 이상없이 처리하면 메인 액티비티를 화면에 나오게 한다
            Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
            startActivity(intent);
            finish();

        } else {
            Log.i("MEMO_APP", response.toString());
        }

    }

    @Override
    public void onFailure(Call<UserRes> call, Throwable t) {
        // 프로그래스 다이얼로그가 있으면 나타나지않게 해준다
        dismissProgress();

    }
});

댓글