์ถ์ฒ
ChatGPT
Retrofit2๋ Android ์ ํ๋ฆฌ์ผ์ด์ ์์ RESTful API์ ํต์ ํ๊ธฐ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. Retrofit2๋ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ก API ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , JSON, XML ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ํ์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Android ๊ฐ๋ฐ์๋ค์ด ๋์ฑ ์ฝ๊ฒ ์๋ฒ์ ํต์ ํ ์ ์๋๋ก ๋์์ค๋ค.
Retrofit2 ๊ธฐ๋ณธ ๊ฐ๋
Retrofit2 ํน์ง
1. ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ์ ์ธ์ HTTP ํด๋ผ์ด์ธํธ
- Retrofit์ API ์์ฒญ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ์ฌ, ์ธํฐํ์ด์ค ๋ฉ์๋์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด HTTP ๋ฉ์๋๋ฅผ ์ ์ธ์ ์ผ๋ก ์์ฑํ ์ ์๋ค.
2. ์๋ ๋ฐ์ดํฐ ํ์ฑ
- Retrofit์ Gson, Moshi ๋ฑ๊ณผ ๊ฐ์ JSON ํ์์ ํตํฉ๋์ด, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์๋ฐ/์ฝํ๋ฆฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
3. ๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ํธ์ถ ์ง์
- Retrofit์ ๋คํธ์ํฌ ์์ฒญ์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ UI ์ฐ๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋คํธ์ํฌ ์์ ์ ์ํํ ์ ์๋ค.
4. ํ๋ฌ๊ทธ๋ธ ์ํคํ ์ฒ
- Interceptors, Converters, CallAdapters์ ๊ฐ์ ๋ค์ํ ๊ธฐ๋ฅ์ ํ๋ฌ๊ทธ์ธ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ์ฌ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค.
5. RxJava์์ ํตํฉ
- Retrofit์ RxJava์ ์ฝ๊ฒ ํตํฉ๋์ด, ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ ๋คํธ์ํฌ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
Retrofit์ ์ฃผ์ ๊ตฌ์ฑ ์์
- Base URL: ๋ชจ๋ HTTP ์์ฒญ์ ๊ธฐ๋ณธ์ด ๋๋ URL.
- Converter: JSON๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ญํ . ๊ธฐ๋ณธ์ ์ผ๋ก Gson์ ์ฌ์ฉํ์ง๋ง, ํ์์ ๋ฐ๋ผ Moshi๋ ๋ค๋ฅธ ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Call: API ์์ฒญ์ ์ถ์ํํ ์ธํฐํ์ด์ค๋ก, Call ๊ฐ์ฒด๋ฅผ ํตํด ๋คํธ์ํฌ ์์ฒญ์ ์ํํ๋ค.
- Annotations: HTTP ๋ฉ์๋์ ์๋ํฌ์ธํธ, ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฑ์ ์ธํฐํ์ด์ค ๋ฉ์๋์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ง์ ํ๋ค.
- Retrofit ๊ฐ์ฒด: Retrofit ์ค์ ์ ๊ด๋ฆฌํ๋ฉฐ, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋น์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Retrofit2 ์ค์น
Retrofit2๋ฅผ Android ํ๋ก์ ํธ์ ์ค์นํ๋ ค๋ฉด 'build.gradle'ํ์ผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅด ์ถ๊ฐํด์ผ ํ๋ค.
Gradle ์ค์
1. ํ๋ก์ ํธ์ 'build.gradle'ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ข ์์ฑ์ ์ถ๊ฐํ๋ค.
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson ์ปจ๋ฒํฐ
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' // ๋ก๊ทธ ์ธํฐ์
ํฐ (์ ํ ์ฌํญ)
}
2. ํ๋ก์ ํธ๋ฅผ ์ฑํฌํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ ์ฉํ๋ค.
Retrofit2 ์ฌ์ฉ๋ฒ
1.Retrofit ์ค์
Retrofit์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ Retrofit ๊ฐ์ฒด๋ฅผ ์ค์ ํด์ผ ํ๋ค. ์ด ๊ฐ์ฒด๋ HTTP ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ฑํ๊ณ , API ์๋น์ค ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private static final String BASE_URL = "https://api.example.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create()) // Gson ์ปจ๋ฒํฐ ์ค์
.build();
}
return retrofit;
}
}
2. API ์ธํฐํ์ด์ค ์ ์
Retrofit์ API ์์ฒญ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ๋ค. ๊ฐ API ์๋ํฌ์ธํธ์ ๋ํด ์ธํฐํ์ด์ค ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ , ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด HTTP ๋ฉ์๋ ๋ฐ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
public interface ApiService {
// GET ์์ฒญ: ์ฌ์ฉ์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
@GET("users")
Call<List<User>> getUsers();
// GET ์์ฒญ: ํน์ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
@GET("users/{id}")
Call<User> getUserById(@Path("id") int userId);
}
์ฝํ๋ฆฐ ์์
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Headers
import retrofit2.http.Path
interface ApiService {
// ๋์ ์ผ๋ก Authorization ํค๋ ์ถ๊ฐ
@GET("users/{id}")
fun getUserById(@Path("id") userId: Int, @Header("Authorization") token: String): Call<User>
// ๊ณ ์ ๋ ํค๋ ์ถ๊ฐ
@Headers("Content-Type: application/json")
@GET("users/{id}")
fun getUserByIdWithHeaders(@Path("id") userId: Int): Call<User>
}
3. ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ์
์๋ฒ๋ก๋ถํฐ ๋ฐ๋ JSON ๋ฐ์ดํฐ๋ฅผ ๋งคํํ ํด๋์ค๋ฅผ ์ ์ํ๋ค. Gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ฐ ๊ฐ์ฒด(์ฝํ๋ฆฐ์ ๋ฐ์ดํฐ ํด๋์ค)๋ก ๋ณํํ๋ค.
public class User {
private int id;
private String name;
private String email;
// Getter ๋ฐ Setter ๋ฉ์๋
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
์ฝํ๋ฆฐ ์์
data class User(
val id: Int,
val name: String,
val email: String
)
4. ๋คํธ์ํฌ ์์ฒญ ์คํ
Retrofi ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด API ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ํด๋น ๊ฐ์ฒด๋ฅผ ํตํด ๋คํธ์ํฌ ์์ฒญ์ ์ํํ๋ค.
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Retrofit ๊ฐ์ฒด ์์ฑ ๋ฐ API ์๋น์ค ์ด๊ธฐํ
Retrofit retrofit = ApiClient.getClient();
ApiService apiService = retrofit.create(ApiService.class);
// ์ฌ์ฉ์ ๋ชฉ๋ก ์์ฒญ
Call<List<User>> call = apiService.getUsers();
// ๋น๋๊ธฐ ์์ฒญ ์คํ
call.enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (response.isSuccessful()) {
// ์์ฒญ ์ฑ๊ณต
List<User> users = response.body();
// ์ฌ์ฉ์ ๋ชฉ๋ก ์ฒ๋ฆฌ
for (User user : users) {
Log.d("MainActivity", "User ID: " + user.getId());
Log.d("MainActivity", "User Name: " + user.getName());
Log.d("MainActivity", "User Email: " + user.getEmail());
}
} else {
// ์์ฒญ ์คํจ (์ํ ์ฝ๋)
Log.e("MainActivity", "Request Failed. Code: " + response.code());
}
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {
// ๋คํธ์ํฌ ์ค๋ฅ
Log.e("MainActivity", "Network Error: " + t.getMessage());
}
});
}
}
์ฝํ๋ฆฐ ์์
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
fun main() {
val apiService = ApiClient.getClient().create(ApiService::class.java)
// ๋์ ํค๋๋ฅผ ์ฌ์ฉํ๋ ์์
val call: Call<User> = apiService.getUserById(1, "Bearer YOUR_TOKEN_HERE")
call.enqueue(object : Callback<User> {
override fun onResponse(call: Call<User>, response: Response<User>) {
if (response.isSuccessful) {
val user = response.body()
// ์ฌ์ฉ์ ์ ๋ณด ์ฒ๋ฆฌ
println("User: $user")
} else {
println("Request failed with code: ${response.code()}")
}
}
override fun onFailure(call: Call<User>, t: Throwable) {
// ์ค๋ฅ ์ฒ๋ฆฌ
println("Request failed with error: ${t.message}")
}
})
}
์ค๋ช
- enqueue(object : Callback<User>): Retrofit2์ ๋น๋๊ธฐ ํธ์ถ์ ์ํํ๋ฉฐ, ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฝ๋ฐฑ์ ์ ๊ณตํ๋ค.
Retrofit2์ ์ฃผ์ ๊ธฐ๋ฅ
1. HTTP ์์ฒญ ๋ฉ์๋
Retrofit2๋ ๋ค์ํ HTTP ์์ฒญ ๋ฉ์๋๋ฅผ ์ง์ํ๋ฉฐ, ๊ฐ ๋ฉ์๋๋ฅผ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ์ธํ๋ค.
- @GET: GET ์์ฒญ์ ์ํํ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ๋๋ค.
- @POST: POST ์์ฒญ์ ์ํํ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
- @PUT: PUT ์์ฒญ์ ์ํํ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋ ์ฌ์ฉ๋๋ค.
- @DELETE: DELETE ์์ฒญ์ ์ํํ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ ์ฌ์ฉ๋๋ค.
- @PATCH: PATCH ์์ฒญ์ ์ํํ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ๋ ์ฌ์ฉ๋๋ค.
์์ : ๋ค์ํ HTTP ๋ฉ์๋
public interface ApiService {
// POST ์์ฒญ: ์ ์ฌ์ฉ์ ์์ฑ
@POST("users")
Call<User> createUser(@Body User user);
// PUT ์์ฒญ: ์ฌ์ฉ์ ์ ๋ณด ์
๋ฐ์ดํธ
@PUT("users/{id}")
Call<User> updateUser(@Path("id") int userId, @Body User user);
// DELETE ์์ฒญ: ์ฌ์ฉ์ ์ญ์
@DELETE("users/{id}")
Call<Void> deleteUser(@Path("id") int userId);
}
2. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ
- ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ: URL ๊ฒฝ๋ก์ ์ผ๋ถ๋ก ์ฌ์ฉ๋๋ ๋ณ์์ด๋ค. @Path ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ: URL ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ก ์ ๋ฌ๋๋ ๋ณ์์ด๋ค. @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
์์ : ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
public interface ApiService {
// ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
@GET("users/{id}")
Call<User> getUserById(@Path("id") int userId);
// ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
@GET("users")
Call<List<User>> getUsersByAge(@Query("age") int age);
}
3. ์์ฒญ ๋ณธ๋ฌธ Request Body
POST, PUT ์์ฒญ์์ JSON ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํด '@Body' ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์์ฒญ ๋ณธ๋ฌธ์ ์ ์ํ ์ ์๋ค.
์์ : ์์ฒญ ๋ณธ๋ฌธ
public interface ApiService {
// POST ์์ฒญ: ์ ์ฌ์ฉ์ ์์ฑ
@POST("users")
Call<User> createUser(@Body User user);
}
4. ํค๋ Headers
API ์์ฒญ ์ ํน์ ํค๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ, '@Header' ๋๋ '@Headers' ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด HTTP ํค๋๋ฅผ ์ค์ ํ ์ ์๋ค.
์์ : ํค๋ ์ค์
public interface ApiService {
// ๋จ์ผ ํค๋ ์ค์
@GET("users")
Call<List<User>> getUsers(@Header("Authorization") String token);
// ๋ณต์ ํค๋ ์ค์
@Headers({
"Accept: application/json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users")
Call<List<User>> getUsersWithHeaders();
}
5. Interceptors
Interceptros๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ ๋ฐ ์๋ต์ ์์ ํ๊ฑฐ๋ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ธ์ฆ ํ ํฐ์ ์๋์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋, ๋๋ฒ๊น ์ ๋คํธ์ํฌ ์์ฒญ/์๋ต์ ๋ก๊น ํ ์ ์๋ค.
์์ : Interceptor ์ฌ์ฉ
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiClient {
private static final String BASE_URL = "https://api.example.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
// Interceptor ์ค์
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Authorization", "Bearer YOUR_TOKEN_HERE")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
})
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // ๋ก๊ทธ ์ถ๋ ฅ
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
Retrofit2์ RxJava ํตํฉ
Retrofit2๋ RxJava์ ํตํฉ๋์ด ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋น๋๊ธฐ ์์ฒญ์ ๋์ฑ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
Gradle ์ค์
RxJava์ ํจ๊ป ์ฌ์ฉํ ์ ์๋๋ก ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
dependencies {
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
}
RxJava๋ฅผ ํ์ฉํ Retrofit ์์
import io.reactivex.Observable;
import retrofit2.http.GET;
public interface ApiService {
// RxJava Observable๋ก ์ฌ์ฉ์ ๋ชฉ๋ก ์์ฒญ
@GET("users")
Observable<List<User>> getUsers();
}
// Retrofit ๊ฐ์ฒด ์์ฑ ์ RxJava Adapter ์ถ๊ฐ
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // RxJava ์ด๋ํฐ ์ถ๊ฐ
.build();
ApiService apiService = retrofit.create(ApiService.class);
// RxJava Observable ๊ตฌ๋
๋ฐ ์ฒ๋ฆฌ
apiService.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(users -> {
// ์ฌ์ฉ์ ๋ชฉ๋ก ์ฒ๋ฆฌ
}, throwable -> {
// ์ค๋ฅ ์ฒ๋ฆฌ
});
๊ฒฐ๋ก
Retrofit2๋ Android ๊ฐ๋ฐ์์ RESTful API์์ ํต์ ์ ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. Retrofit์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ์ ์ธ, ๋ฐ์ดํฐ ๋ณํ, ๋น๋๊ธฐ ์์ฒญ ์ง์ ๋ฑ์ ๊ธฐ๋ฅ์ RESTful API ํตํฉ์ ๋จ์ํํ๊ณ , ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ฌ์ค๋ค.
Retrofit2๋ฅผ ํตํด ์๋ฒ์์ ํต์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , RxJava์์ ํตํฉ์ ํตํด ๋ณต์กํ ๋น๋๊ธฐ ์์ ์ ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋์ฑ ๋น ๋ฅด๊ณ ์์ ์ ์ธ Android ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋ค.
๊ด๋ จ ๊ธ
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DI] DI์์ ์์ฑ์ ์ฃผ์ ๊ณผ setter ์ฃผ์ ์ค ๋ ์ ํธ๋๋ ๋ฐฉ์ (0) | 2024.07.29 |
---|---|
[์ฉ์ด][Android] BTS (1) | 2024.07.29 |
[Retrofit2] Retrofit2์์ API ํธ์ถ ์ ๊ณตํต ํค๋ ๊ฐ ์ถ๊ฐ ๋ฐฉ๋ฒ (0) | 2024.07.29 |
[Retrofit2] Retrofit2์์ ํ์์์ ๋ฐ ๋ฆฌํธ๋ผ์ด ์ค์ (0) | 2024.07.29 |
[RESTful API]RESTful API๋ (0) | 2024.07.29 |