์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์คํธ๋ฆผ๋ฆฟ
- ์๋ฐ๊ณต๋ถ
- Android
- MySQL
- Streamlit๊ธฐ์ด
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ
- ํ์ด์ฌ๊ณต๋ถ
- ์๋๋ก์ด๋ ์คํ๋์ค
- Streamlit๊ธฐ๋ณธ
- ํ๋ค์ค๊ณต๋ถ
- ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์๋ฐ๊ธฐ์ด
- db
- ์น๋์๋ณด๋ ์ ์
- ์๋ฐ์ด๋ณด
- RESTful API
- ํ์ด์ฌ
- JavaScript
- Pandas
- ์๋ฐํ๋ก๊ทธ๋๋ฐ
- Matplotlib ๊ธฐ์ด
- ์๋ฐ์คํฌ๋ฆฝํธ
- java
- serverless
- ํ๋ค์ค
- streamlit
- ์๋ฐ
- ์คํธ๋ฆผ๋ฆฟ ๊ธฐ๋ณธ
- ์น๋์๋ณด๋ ๊ธฐ์ด
- Today
- Total
ruriruriya
[Android] ์๋๋ก์ด๋ - Retrofit2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํ ์ค์ ๋ฐฉ๋ฒ ๋ณธ๋ฌธ
[Android] ์๋๋ก์ด๋ - Retrofit2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํ ์ค์ ๋ฐฉ๋ฒ
๋ฃจ๋ฆฌ์ผใ 2024. 1. 4. 14:11
Retrofit์ ์๋๋ก์ด๋ ์ฑ์์ ๋คํธ์ํฌ ํต์ ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Square์ฌ์์ ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ์๋๋ก์ด๋ ์ฑ์์ RESTful API์์ ํต์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Retrofit์ ์ฃผ์ ๊ธฐ๋ฅ
- API Interface ์ ์: Retrofit์ ์ฌ์ฉํ๋ฉด REST API์ ์ํธ์์ฉํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ์ ์๋ค. ์ด ์ธํฐํ์ด์ค์์ API ์๋ํฌ์ธํธ, HTTP ์์ฒญ ๋ฉ์๋, ์์ฒญ ์ ํ์ํ ๋งค๊ฐ๋ณ์ ๋ฑ์ ๋ช ์ํ ์ ์๋ค.
- HTTP ํด๋ผ์ด์ธํธ ์ค์ : Retrofit์ OkHttp์ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ด, HTTP ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ณ ์ค์ ํ๋ ๋ฐ ๋์์ ์ค๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ค์ , ํ์์์ ๋ฑ์ ๊ด๋ฆฌํ ์ ์๋ค.
- Annotation ๊ธฐ๋ฐ์ ์์ฒญ ์ฒ๋ฆฌ: Retrofit์ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก HTTP ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฐ ๋ฉ์๋์ @GET, @POST, @PUT, @DELETE ๋ฑ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ข ๋ฅ์ ์์ฒญ URL์ ๋ช ์ํ ์ ์๋ค.
- ๊ฐ์ฒด ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ: JSON ๋๋ XML๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ์์ ์๋๋ก์ด๋ ์ฑ์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ๊ณผ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ Gson๊ณผ ๊ฐ์ ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋๋ค.
- ๋น๋๊ธฐ์ ์๋ต ์ฒ๋ฆฌ: Retrofit์ HTTP ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ ์ ์ํํ ์ ์๋๋ก ๋์์ค๋ค. ์ฝ๋ฐฑ, RxJava ๋ฑ์ ํ์ฉํ์ฌ ์๋ต์ ๋ฐ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค.
1. api ํจํค์ง-NetworkClient.class ์์ฑ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํ ๋ณ์๋ฅผ ๋ง๋ค๊ณ
getRetrofitClient ํจ์๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
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) // 1๋ถ๋์ ์์
์ ํ๊ธฐ ์ํด ์ฐ๊ฒฐ (์ฌ์ง ์ ์ก ๋ฑ)
.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;
}
}
2. api ํจํค์ง - UserApi.class ์์ฑ
- UserApi.class๋ฅผ ์์ฑํ ๋ค Interface๋ก ๋ณ๊ฒฝํ๋ค.
- register ํ์๊ฐ์
api์์ ์ฌ์ฉ์์๊ฒ ์
๋ ฅ๋ฐ์ ๋ด์ฉ์ User user๋ก ๋ฐ์์ค๊ณ (์ด ๋, User ํด๋์ค ์์ฑ)
์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๋๋๋ฉด UserRes๋ก ์๋ต์ ์ ๋ฌํ๋ค.(์ด ๋, UserRes ํด๋์ค ์์ฑ)
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface UserApi {
// ํ์๊ฐ์
Api
@POST("/user/register")
Call<UserRes> register(@Body User user);
}
3. model ํจํค์ง - User.class ์์ฑ
์์ฑ์๊น์ง ๋ฏธ๋ฆฌ ์์ฑํด์ค๋ค.
public class User {
public String email;
public String password;
public String nickname;
public User(){
}
public User(String email, String password, String nickname) {
this.email = email;
this.password = password;
this.nickname = nickname;
}
}
4. model ํจํค์ง - UserRes.class ์์ฑ
์๋ต ๋ฐ์ ๋ณ์๋ค์ ๋ง๋ค์ด์ค๋ค.
public class UserRes {
// ์๋ต...!
public String result;
public String access_token;
}
5. ํด๋น Activity ์ค์
๋ณธ์ธ์ ํ์๊ฐ์ ์ ์ํ Activity๋ฅผ ์ฌ์ฉํ๋ค.
- retrofit ์ฌ์ฉ์ ์ํ ๋ณ์๋ฅผ ์์ฑํ๋ค.
- api ํจํค์ง์ ์๋, Interface๋ฅผ ์์ฑํ๋ค.
- ๋ณด๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ ์ฒ๋ฆฌํด์ ๋ง๋ ๋ค.
- api ํธ์ถํ๋ค.
- ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = editEmail.getText().toString().trim();
String password = editPassword.getText().toString().trim();
String nickname = editNickname.getText().toString().trim();
// ๋คํธ์ํฌ ํ์๊ฐ์
API๋ฅผ ํธ์ถํ๋ค. โ
โ
โ
โ
โ
// 1. retrofit ๋ณ์ ์์ฑ
Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);
// 2. api ํจํค์ง์ ์๋, Interface ์์ฑ
UserApi api = retrofit.create(UserApi.class);
// 3. ๋ณด๋ผ ๋ฐ์ดํฐ ๋ง๋ ๋ค. => ๋ฌถ์ ์ฒ๋ฆฌ : ํด๋์ค์ ๊ฐ์ฒด ์์ฑ.
User user = new User(email, password, nickname);
// 4. api ํธ์ถ
Call<UserRes> call = api.register(user);
// 5. ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ฝ๋ ์์ฑ.
call.enqueue(new Callback<UserRes>() {
@Override
public void onResponse(Call<UserRes> call, Response<UserRes> response) {
// ์๋ฒ์์ ๋ณด๋ธ ์๋ต์ด 200 OK์ผ ๋ ์ฒ๋ฆฌํ๋ ์ฝ๋
if(response.isSuccessful()){
UserRes userRes = response.body();
SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME,MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token",userRes.access_token);
editor.apply();
// ์ด์ ์์ผ๋ฏ๋ก ๋ฉ์ธ ์กํฐ๋นํฐ๋ฅผ ์คํํ๋ค.
Intent intent = new Intent(RegisterActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
}
@Override
public void onFailure(Call<UserRes> call, Throwable t) {
// ์ ์ ํํ
๋คํธ์ํฌ ํต์ ์คํจํ๋ค๊ณ ์๋ ค์ค๋ค.
Toast.makeText(RegisterActivity.this,"๋คํธ์ํฌ ํต์ ์คํจ.",Toast.LENGTH_SHORT).show();
}
});
}
});