Java 및 Android 용 type-safe* 한 REST API(POST, GET, PUT, DELETE)를 사용하여 안정적으로 HTTP 통신을 할 수 있게 해주는 라이브러리다.
(OkHttp 상위 호환 버전)
* 여기서 'type-safe'란 말 그대로 타입에 안정적이라는 뜻으로,
[어떠한 경우든 안정적으로 타입을 판별할 수 있어 그 결과를 예측할 수 있는 범위에 있게한다]라고 해석할 수 있다.
비동기 프로그래밍 : 요청후 응답 수락 여부와 상관없이 다음 동작 가능
= 선행된 작업을 막지 않고 시간이 오래 걸릴 작업을 동시에 수행 하여 효율성을 상승시켜준다.
// Retrofit
implementation ("com.squareup.retrofit2:retrofit:2.6.2")
implementation ("com.squareup.retrofit2:converter-gson:2.6.0") retrofit을 사용하려면 gradle을 추가해야 한다.✔ Data class
✔ Http 작업을 정의하는 Interface
✔ Retrofit.Builder를 선언한 Object
2.AndroidManifest에 인터넷 permission 을 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="_">
<uses-permission android:name="android.permission.INTERNET"/> <---- 1번
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SelfStudy_Kotlin"
android:usesCleartextTraffic="true"> <---- 2번
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
1번은 서버와 통신을 하기 위해 인터넷 권한을 얻는 거고
2번은 http로 시작하는 사이트에 접근하기 위해서 적어준다.
(안드로이드는 기본적으로 http 접근을 허용하지 않기 때문.
만약 https를 지원하는 사이트와 통신할 거면 안 적어줘도 된다)
//RetrofitService.kt
class RetrofitService {
companion object {
//통신할 서버 url
private const val baseUrl = "http://12.345.678.910"
//Retrofit 객체 초기화
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(this.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
val test: TestService = retrofit.create(TestService::class.java)
}
}
통신할 서버 url을 'baseUrl'이라는 변수에 넣어주었으며, 이 서버 url은 Retrofit 객체를 만들 때 바로 사용된다.
addConverterFactory(GsonConverterFactory.create())는 위에서 얘기한 Json을 Gson형태로 변환해주는 요소이다.
//TestService.kt
interface TestService {
@Headers("accept: application/json", "content-type: application/json")
@POST("/api/signup")
fun signUp(@Body params: HashMap<String, Any>): Call<SignUpOkResponse>
@GET("/api/signup/check")
fun signUpCheck(
@Query("email") email: String,
@Query("password") password: String,
): Call<SignUpCheckOkResponse>
@Multipart
@POST("/api/file")
fun uploadImage(
@Part file: MultipartBody.Part
): Call<UploadImageOkResponse>
@GET("/api/info/me")
fun myInfo(@Header("access_token") accessToken: String): Call<MyInfoOkResponse>
@GET("/api/info/other")
fun otherUserInfo(
@Header("access_token") accessToken: String,
@Query("user_uid") userUid: Int
): Call<OtherUserInfoOkResponse>
}
위 Interface는 통신 대상이 되는 서버 url과 통신하려는 내용을 담아놓은 꾸러미라고 생각하면 된다. 해당 코드에서 알 수 있듯이 예시로는 POST(@POST Annotation), GET(@GET Annotation)를 사용하고 있다.
가장 일반적으로는 GET 방식을 많이 사용하는데, 만약 서버에서 데이터를 받아올 때 Access-Token이 필요하다면 @Header에 Access-Token을 넣고 필요한 @Query 내용을 적어 보내 원하는 데이터를 받아올 수 있다.
POST의 경우에는 서버에 데이터를 넣어주는데 사용되기 때문에, @Header로 json임을 명시해준 뒤 HashMap으로 Body를 만들어 보낸다.
@GET, @POST 옆 괄호 안에 있는 url은 서버에 의해 정해진 API url로, 서버쪽으로부터 우선적으로 확인해야한다.
만약 서버에 json이 아닌 mp4, jpg등 파일을 보내야 하는 경우 MultipartBody라는 형식으로 만들어준 뒤 서버에 보내야 정상적으로 데이터가 전송될 수 있다.
위 예시는 회원가입(signUP)과 로그인을 위한 확인(signUpCheck), 내 정보 확인(myInfo), 타 유저 정보 확인(otherUserInfo), 이미지 업로드(uploadImage) 내용이다.
각 function 끝에 있는 Call은 서버에 요청 후 되돌아오는 대답을 받아주기 위한 요소로, 바로 밑에 추가로 얘기하겠다.
// SignUpCheckOkResponse.kt
data class SignUpCheckOkResponse(
val uid: Int,
val is_deleted: Int,
val created_time: String,
val updated_time: String,
val signup_type: String,
val social_id: String,
val nickname: String,
val about: String,
val gender: String,
val interests: Int,
val age: Int,
val address: String,
val filename: String,
val access_token: String
): SignUpCheckResponse
// SignUpCheckErrorResponse.kt
data class SignUpCheckErrorResponse(
val code: Int,
val message: String,
val method: String,
val url: String
) : SignUpCheckResponse
참고 자료
https://salix97.tistory.com/204
https://oscarstory.tistory.com/71
https://todaycode.tistory.com/38
https://velog.io/@cmjh951330/restrofit2-method
https://velog.io/@jeongminji4490/Android-Retrofit