Android Studio

[Android Studio] 안드로이드 Retrofit 라이브러리 사용하기

건휘맨 2024. 6. 13. 16:04

Retrofit은 Android 및 Java에서 REST API 호출을 쉽게 할 수 있도록 도와주는 HTTP 클라이언트 라이브러리

 

라이브러리를 사용하기위해 임포트

공식 홈페이지에 있는 버전 확인, build.gradle파일의 dependencies에 아래 코드 입력 

implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")

 

 

Body에 Json으로 데이터를 보낼 클래스

public class User {

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

    public User(){

    }

    public User(String email, String password){
        this.email = email;
        this.password = password;
    }

    public User(String email, String password, String nickname) {
        this.email = email;
        this.password = password;
        this.nickname = 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 {

    private String result;
    private String accessToken;

    public String getResult() {
        return result;
    }

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

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
}

 

api 패키지에 NetworkClient.java 파일 생성하고 작성해준다.

 

( NetworkClient.java 파일을 생성하는 이유는 Retrofit 인스턴스를 중앙에서 관리하여 코드의 재사용성을 높이고

설정의 일관성을 유지하며, 의존성 주입 및 테스트 용이성을 향상시키기 위함 )

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()
            		// Url을 입력하는 부분은 컨픽파일에서 상수처리
                    .baseUrl(Config.DOMAIN)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;

    }
}

 


api 패키지에 인터페이스를 만들고 api 호출


POST 요청을 사용하여 user/register 경로로 API를 호출

파라미터 User user는 요청 본문에 포함될 데이터

@Body 어노테이션을 사용하여 User 객체를 JSON 형식으로 변환해 요청 본문에 포함시킨다.

함수의 리턴 타입 Call<UserRes>는 API 호출의 응답을 나타냅니다. 이 경우, 응답 데이터가 UserRes 객체로 변환

public interface UserApi {

    // 회원가입 API
    // 함수명을 작성해주고 보낼 데이터는 파라미터에 작성, 받을 데이터는 리턴타입에 작성
    @POST("user/register")
    Call<UserRes> register(@Body User user);

 

호출하여 사용하면 끝!

// 회원가입 API 를 호출한다.

// 0. 다이얼로그를 보여준다.
showProgress();

// 1. 레트로핏 변수 생성 : api 패키지에 NetworkClient.java 파일이 있어야 한다.
Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);

// 2. api 패키지에 인터페이스를 클래스 객체로 생성 : api 패키지에 인터페이스가 있어야 한다.
UserApi api = retrofit.create(UserApi.class);

// 3. 보낼 데이터를 준비
User user = new User(email, password, nickname);

// 4. api 를 만든다.
Call<UserRes> call= api.register(user);

// 5. 회원가입 api 를 호출한다.
call.enqueue(new Callback<UserRes>() {
    @Override
    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
        Log.i("MEMO REGISTER", ""+response.code());

        // 다이얼로그를 먼저 없앤다.
        dismissProgess();

        // 200 OK 일 때
        if(response.isSuccessful()){

            UserRes userRes = response.body();
            Log.i("MEMO REGISTER", userRes.getAccessToken());

            // 서버로부터 받은 토큰을 저장해야 한다.
            SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            editor.putString("token", userRes.getAccessToken());
            editor.commit();

            // 회원가입 액티비티는 종료를 해야 메인액티비티를 띄운다.
            Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
            return;

        }else if (response.code() == 500){
            Snackbar.make(btnRegister,
                    "이미 회원가입 한 이메일입니다. 로그인하세요!",
                    Snackbar.LENGTH_SHORT).show();
            return;
        }else{
            Snackbar.make(btnRegister,
                    "서버에 문제가 있습니다. 잠시 후 다시 시도해주세요!",
                    Snackbar.LENGTH_SHORT).show();
            return;
        }
    }

    @Override
    public void onFailure(Call<UserRes> call, Throwable throwable) {
        // 다이얼로그를 먼저 없앤다.
        dismissProgess();
    }
});