안드로이드 공부/ Network2 - Retrofit 사용

yellow·2021년 6월 7일
0

안드로이드 공부

목록 보기
28/28

Retrofit

  • square라는 회사에서 REST API 통신을 위해 만든 통신 라이브러리이다.
  • 가장 많이 사용되는 통신 라이브러리 중 하나!

Retrofit의 장점

  • 빠른 성능을 가지고 있고 JSON Parsing을 GSON이 대신 해주기 때문에 데이터 파싱도 편리하다.
  • 서버 도메인 주소가 아닌 말단 주소를 따로 관리해줄 수 있다.
  • 따로 별도의 작업을 하지 않아도 통신하는 부분은 알아서 Thread에서 돌아간다.

📎 Retrofit 사용하기 (GET 요청)

1. Gradle에 의존성 추가

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // JSON 형식으로 온 데이터를 객체로 mapping해주는 Converter

2. permission 추가하기

<uses-permission android:name="android.permission.INTERNET" />

3. JSON 형식에 맞는 모델 클래스 생성하기

class Person(
    var id : Int? = null,
    var name : String? = null,
    var age : Int? = null,
    var intro : String? = null
): Serializable

4. Retrofit 생성하기

// retrofit 생성
val retrofit = Retrofit.Builder()
        .baseUrl("http://mellowcode.org/") // 서버 도메인 주소(변하지 않는 주소)
        .addConverterFactory(GsonConverterFactory.create()) // gson 과정을 자동으로 해줌
        .build()

5. API 말단을 관리해줄 interface 생성하기

  • Retrofit에서는 서버 도메인 주소 뒷부분을 따로 관리해줄 수 있다.
interface RetrofitService {
    @GET("json/students/") // GET 방식으로 baseUrl + "json/students/"에 요청하겠다.
    fun getStudentsList() : Call<ArrayList<Person>> // 요청에 대한 response type은 ArrayList<Person>로 하겠다.
}

파라미터로 상세 주소를 더 받아오기

  • 예시
@Get("json/students/{id}")
fun getStudentsList(
	@Path("id") id : String
)   : Call<ArrayList<Person>>

매개변수로 받은 id값을 url 주소의 {id}로 넘겨준다.

6. service 만들기

  • 과정 4에서 만든 Retrofit과 과정 5에서 만들어준 interface를 연결한다.
val service = retrofit.create(RetrofitService::class.java)

7. 서버에 요청하기

service.getStudentsList().enqueue(object : Callback<ArrayList<Person>>{

    // 통신이 성공했을 때 호출된다.
    override fun onResponse(
        call: Call<ArrayList<Person>>,
        response: Response<ArrayList<Person>>
    ) {
        if(response.isSuccessful){
            // list로 데이터 받아옴
            val personList = response.body()
            
            // status 코드를 받아옴
            val code = response.code()
   
            // error인 상황이지만 code가 200번대인 경우에 에러메세지를 띄우고싶을 때 사용
            val error = response.errorBody()
            
            // 응답의 header정보를 받아옴
            val header = response.headers()
        }
    }

    // 통신이 실패했을 때 호출된다.
    override fun onFailure(call: Call<ArrayList<Person>>, t: Throwable) {
        // 통신이 원활하지 않거나 데이터를 표시할 수 없는 등 통신이 실패한 경우
        
        // 왜 실패했는지 검사하는 코드 예시
        if(call.isCanceled){
        
        }
        if(call.isExecuted){
        
        }
        
        // 통신이 실패했을 때 바로 연결을 끊는 것이 아니라 retry를 하는데, 한번 실패하면 retry하지 않도록
        call.cancel()
    }
})

response.isSuccessful

  • request code가 200번대일 때 true를 return 한다.
  • 대부분의 200번대의 코드가 정상 작동했음을 의미한다.
profile
할 수 있어! :)

0개의 댓글

관련 채용 정보