꾸준히 안타치기

서버통신 Retrofit2사용법 본문

Android _ 서버연동_채팅/Android - study

서버통신 Retrofit2사용법

글자줍기 2021. 8. 28. 16:46
반응형

https://medium.com/@prakash_pun/retrofit-a-simple-android-tutorial-48437e4e5a23

 

Retrofit— A simple Android tutorial

For this tutorial, we are going to see how to use Retrofit HTTP client in your Android application.

medium.com

https://www.youtube.com/watch?v=p4sYbZsTMDo&list=PLT3-dzFEBix379Q2s31apenJtBPOFSVZZ&index=4 

Rertofit이란?

  • REST API 통신을 위해 구현된 
  • 동일 Squareup사의 OkHttp 라이브러리의 상위 구현체

      : Retrofit은 OkHttp를 네트워크 계층으로 활용하고 그 위에 구축됨
  • AsyncTask 없이 Background Thread 실행 -> Callback을 통해 Main Thread에서 UI 업데이트
  •  

Rertofit의 장점과 단점 / 사용하는 이유

  • 빠른 성능
         Okhttp는 AsyncTask를 사용 (AsyncTask의 3~10배의 성능차이가 난다고 함)
  • 간단한 구현 - 반복된 작업을 라이브러리 넘겨서 처리
        HttpUrlConection의 Connection / Input&OutputStream / URL Encoding 생성 및 할당의 반복작업

        OkHttp의 쿼리스트링, Request / Response 반복 설정 작업    
  • 가독성
        Annotation(애노테이션) 사용으로 코드의 가독성이 뛰어남, 직관적인 설계가 가능
  • 동기/비동기 쉬운 구현
        동기 Synchronous - 동시에 일어난다는 의미로, 요청-응답이 하나의 트랜잭션(작업)에서 발생

                                  요청 후 응답까지 대기한다는 의미

        비동기 Asynchronous - 동시에 일어나지 않는다는 뜻으로, 요청-응답은 별개의 트랜잭션
                                       요청 후 응답이 도착하면 Callback으로 받아서 처리

3가지 구성요소

  • DTO (POJO) - 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
  • Interface - 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
         * CRUD ( Create / Read / Update / Delete ) -> HTTP Method ( POST / GET / PUT / DELETE )
  • Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정

 

레트로핏 사용법

 

 Api클라이언트 작성

package com.example.myapplication.Recipe;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {

    private static final String BASE_URL="http://서버주소/";
    private static Retrofit retrofit;

    public static Retrofit getApiClient() {

        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

인터페이스 작성

package com.example.myapplication.Recipe;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface ApiInterface {

    @FormUrlEncoded
    @POST("save.php")
    Call<Note> saveNote(
            // 서버에서 받을것 
            @Field("title") String title,
            @Field("note") String note,
            @Field("color") String color
    );

}

받아올 데이터 모델 

package com.example.myapplication.Recipe;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Note {
    @Expose
    @SerializedName("userID") private int userID;
    @Expose
    @SerializedName("title") private String title;
    @Expose
    @SerializedName("note") private String note;
    @Expose
    @SerializedName("color") private String color;
    @Expose
    @SerializedName("date") private String date;
    @Expose
    @SerializedName("success") private Boolean success;
    @Expose
    @SerializedName("message") private String message;

    public int getUserID() {
        return userID;
    }

    public void setUserID(int userID) {
        this.userID = userID;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

액티비티

package com.example.myapplication.Recipe;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;

import com.example.myapplication.R;

import org.jetbrains.annotations.NotNull;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class EditActivity extends AppCompatActivity {

    EditText et_title, et_note;
    ProgressDialog progressDialog;

    ApiInterface apiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);

        et_title = findViewById(R.id.title);
        et_note = findViewById(R.id.note);

        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("기다려");

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_editer, menu);
        return true;
    }


    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()) {
            case R.id.save:
                String title = et_title.getText().toString().trim();
                String note = et_note.getText().toString().trim();
                String color = "2222";

                if (title.isEmpty()) {
                    et_title.setError("제목을 작성하세요");
                } else if (note.isEmpty()) {
                    et_note.setError("노트를 작성하세요.");
                } else {
                    saveNote(title, note, color);
                }
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }

    private void saveNote(final String title, final String note, final String color) {

        progressDialog.show();

        apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
        Call<Note> call = apiInterface.saveNote(title, note, color);

        call.enqueue(new Callback<Note>() {
            @Override
            public void onResponse(@NotNull Call<Note> call, @NotNull Response<Note> response) {
                progressDialog.dismiss();

                if (response.isSuccessful() && response.body() != null) {
                    Boolean success = response.body().getSuccess();
                    if (success) {
                        Toast.makeText(EditActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                        finish(); // 메인액티비티로 돌아감
                    }
                } else {
                    assert response.body() != null;
                    Toast.makeText(EditActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                    finish(); // 에러시 그대로있음

                }

            }

            @Override
            public void onFailure(@NonNull Call<Note> call, @NonNull Throwable t) {
                progressDialog.dismiss();
                Toast.makeText(EditActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();

            }
        });

    }
}

https://jaejong.tistory.com/33

 

[안드로이드] Retrofit2 '레트로핏' - 기본 사용법

Retrofit2 - REST API 통신 라이브러리 'Retrofit' - REST통신 라이브러리 기본 개념 & 사용법 통신 라이브러리 중 가장 많이 사용되는 대표적인 라이브러리 ( Squareup 사의 라이브러리) Retrofit 이란? REST API..

jaejong.tistory.com

http://devflow.github.io/retrofit-kr/

 

Retrofit - 한글 문서

A type-safe HTTP client for Android and Java

devflow.github.io

https://www.youtube.com/watch?v=Vh92eSAEu5c&t=1692s 

https://dev-juyoung.github.io/2017/11/10/android-retrofit-basic/

 

Android Retrofit 기본 사용법 · Cro, Developer

개인 App을 만들거나 현업에서 App을 만들다보면, 단순한 화면이동 등의 기능으로는 사용자의 요구사항을 충당하기 힘이 듭니다. 일반적인 App은 서버와 클라이언트가 네트워크 통신을 통해 데이

dev-juyoung.github.io

 

 

레트로핏사용시 겪었던 오류

https://dwenn.tistory.com/45

 

[Android] Retrofit, POST parameters

 Retrofit, POST parameters 1 2 3 4 5 6 @POST("repo/item") Call  getItem(     @Field("id") id ); cs 위와 같이 하면 , @Field parameters can only be used with form encoding. 에러를 발생시킨다 1..

dwenn.tistory.com

https://coding-food-court.tistory.com/177

 

Gson Expose 어노테이션

Android의 Retrofit2를 사용하면, gson을 이용해서, java나 kotlin을 Parsing 합니다. 저는 현재 이직을 한지, 얼마 되지 않았습니다. 그래서, 전임자 개발자 분이 작성해 놓은 소스코드를 수정 하고 있습니

coding-food-court.tistory.com

 

반응형

'Android _ 서버연동_채팅 > Android - study' 카테고리의 다른 글

TCP/IP 채팅예제 / Android / 채팅방법  (0) 2021.09.20
레트로핏 사용법  (0) 2021.08.30
체크박스 유지하기  (0) 2021.08.26
Application class  (0) 2021.08.21
Volley  (0) 2021.08.08
Comments