본문 바로가기
안드로이드 Kotlin

Kotlin으로 외부 API 사용하기

by 철없는민물장어 2024. 2. 23.
728x90

코틀린으로 API 요청을 어떻게 하는지 알아보기 위해서 https://jsonplaceholder.typicode.com 의 API를 예시로 테스트해보기로 했다. http://jsonplaceholder.typicode.com/todos/1 의 내용을 가져와 텍스트박스에 넣어볼것이다.

1. 인터넷 권한 설정

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

API를 사용하기 위해 인터넷 권한이 필요하다. AndroidMenifest.xml 파일에 위 코드를 추가한다.

 

2. build.gradle 파일에 Gson변환기, Retrofit을 추가하기

dependencies {
    // Retrofit 라이브러리
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    // Retrofit Gson 변환기
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}


Gson은 Google에서 개발한 JSON 직렬화/역직렬화 라이브러리이다. JSON 형식의 데이터를 Java나 Kotlin 객체로 변환하거나, 반대로 객체를 JSON 형식의 문자열로 변환하는 기능을 제공한다. 이를 통해 수신한 JSON 데이터를 파싱하여 앱에서 사용할 수 있다.

Retrofit은 HTTP 클라이언트 라이브러리로, 안드로이드 앱에서 RESTful 웹 서비스와 통신하기 위한 도구이다. Retrofit은 간단한 인터페이스 정의를 통해 웹 서비스의 엔드포인트와 요청 방법을 정의하고, 이를 기반으로 네트워크 요청을 처리한다. 또한 Gson과의 연동을 지원하여 네트워크 응답을 자동으로 파싱하여 객체로 변환할 수 있다.

 

3. API를 호출할 인터페이스 정의하기

package com.example.practice1

import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path

interface ApiService {
    // API 요청을 정의하는 메서드
    @GET("todos/{id}")
    fun getTodo(@Path("id") id: Int): Call<Todo>

}

여기서는 todos/{id} 로 GET요청하는것을 작성했다.

4. 데이터 모델 작성하기

package com.example.practice1

data class Todo(
    val userId: Int,
    val id: Int,
    val title: String,
    val completed: Boolean
)

 API요청하고 받을 데이터의 형태를 정의한다. 여기서는 Todo클래스를 작성했다.

 

4. MainActivity 작성

package com.example.practice1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tv: TextView = findViewById<TextView>(R.id.textView) //텍스트박스
        
        val retrofit = Retrofit.Builder()
            .baseUrl("https://jsonplaceholder.typicode.com/") // API의 base URL. 슬래시로 끝나야함
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        // ApiService 인터페이스를 사용하여 실제 네트워크 요청을 수행하는 객체 생성
        val apiService = retrofit.create(ApiService::class.java)

        // 네트워크 요청을 비동기적으로 실행하고 응답을 처리하는 코드
        apiService.getTodo(1).enqueue(object : Callback<Todo> {
            override fun onResponse(call: Call<Todo>, response: Response<Todo>) {
                if (response.isSuccessful) {
                    val todo = response.body()
                    if (todo != null) {
                        // 응답 데이터 처리
                        println("UserId: ${todo.userId}")
                        println("Id: ${todo.id}")
                        println("Title: ${todo.title}")
                        println("Completed: ${todo.completed}")
                        // UI 업데이트
            			runOnUiThread {
                			tv.text = "${todo.title}"
            			}
                    } else {
                        println("Response body is null")
                    }
                } else {
                    println("Failed to get response")
                }
            }

            override fun onFailure(call: Call<Todo>, t: Throwable) {
                println("Error occurred: ${t.message}")
            }
        })
    }

}

GET요청 후 받은 데이터를 로그에 출력하고, todo.title을 텍스트박스에 출력하는 코드이다.

이를 실행시켜보면...

텍스트박스의 크기가 작아 내용이 조금 잘렸지만 정상적으로 데이터를 받아온것을 볼 수 있다.

728x90

댓글