Android/Application

Android - JSON 파싱 및 API 연동

임베디드 친구 2024. 11. 23. 13:57
728x90
반응형

Android - JSON 파싱 및 API 연동

안녕하세요, '소프트웨어 공장'에 오신 것을 환영합니다! 오늘은 안드로이드 애플리케이션 개발 시 자주 사용되는 "JSON 파싱 및 API 연동"에 대해 알아보려고 합니다. 네트워크를 통해 데이터를 주고받는 것은 현대 앱 개발에서 빠질 수 없는 부분입니다. 이번 포스팅에서는 간단한 예제와 함께 JSON 데이터를 Kotlin을 통해 어떻게 파싱하고 API와 연동하는지 살펴보겠습니다.

1. JSON 파싱 및 API 연동의 개념

JSON(JavaScript Object Notation)은 서버와 클라이언트 간의 데이터 전송을 위해 널리 사용되는 포맷입니다. API(Application Programming Interface)를 통해 서버로부터 데이터를 가져올 때, 주로 JSON 형식을 사용하여 데이터를 주고받습니다. 이를 통해 복잡한 데이터를 간결하게 처리할 수 있습니다.

안드로이드에서 JSON 데이터를 파싱하고 API 연동을 하려면 다음과 같은 과정이 필요합니다:

  1. API 요청을 수행하여 서버로부터 JSON 응답을 받기.
  2. JSON 데이터를 Kotlin 객체로 파싱하기.
  3. 파싱한 데이터를 UI에 반영하기.

이제 간단한 예제를 통해 이러한 과정을 살펴보겠습니다.

2. 라이브러리 설정

안드로이드에서 API 호출을 쉽게 하기 위해 Retrofit이라는 유명한 라이브러리를 사용하겠습니다. Retrofit은 간편하게 HTTP 통신을 할 수 있는 라이브러리로, JSON 파싱 또한 자동으로 해주기 때문에 편리합니다. 프로젝트의 build.gradle 파일에 아래와 같이 종속성을 추가해줍니다.

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

Retrofit을 사용하기 위해선 retrofit과 JSON 파싱을 위해 converter-gson이 필요합니다.

3. 데이터 모델 생성

이번 예제에서는 간단한 사용자 정보를 가져오는 API를 사용해 보겠습니다. JSON 응답은 다음과 같은 형식이라고 가정하겠습니다.

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com"
}

이 데이터를 저장하기 위한 Kotlin 데이터 클래스를 생성합니다.

data class User(
    val id: Int,
    val name: String,
    val email: String
)

4. Retrofit 인터페이스 정의

Retrofit을 사용하여 API 요청을 정의하려면 인터페이스를 만들어야 합니다. 여기서는 사용자 정보를 가져오는 getUser 메서드를 정의합니다.

import retrofit2.Call
import retrofit2.http.GET

interface ApiService {
    @GET("user")
    fun getUser(): Call<User>
}

위 코드는 /user 엔드포인트로 GET 요청을 보내는 메서드를 정의하고 있습니다. 이 요청은 User 객체를 반환합니다.

5. Retrofit 인스턴스 생성

Retrofit 인스턴스를 생성하여 API 호출을 준비합니다.

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitInstance {
    private const val BASE_URL = "https://api.example.com/"

    val api: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

위 코드는 Retrofit 빌더를 사용하여 BASE_URL을 설정하고, GsonConverterFactory를 추가하여 JSON 데이터를 자동으로 Kotlin 객체로 변환해줍니다.

6. API 호출 및 JSON 파싱

이제 API를 호출하고, 받은 JSON 데이터를 파싱하는 과정을 구현해 보겠습니다. MainActivity에서 버튼을 클릭했을 때 사용자 정보를 가져와 화면에 표시하는 예제를 만들어 보겠습니다.

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {

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

        // API 호출
        fetchUserData()
    }

    private fun fetchUserData() {
        val call = RetrofitInstance.api.getUser()
        call.enqueue(object : Callback<User> {
            override fun onResponse(call: Call<User>, response: Response<User>) {
                if (response.isSuccessful) {
                    val user = response.body()
                    user?.let {
                        Log.d("MainActivity", "User Name: ${it.name}, Email: ${it.email}")
                    }
                } else {
                    Log.e("MainActivity", "Response Error: ${response.code()}")
                }
            }

            override fun onFailure(call: Call<User>, t: Throwable) {
                Log.e("MainActivity", "Network Error: ${t.message}")
            }
        })
    }
}

설명

  • fetchUserData() 메서드는 RetrofitInstance.api.getUser()를 호출하여 사용자 데이터를 가져옵니다.
  • enqueue()를 사용하여 비동기적으로 요청을 수행합니다. 요청이 성공하면 onResponse() 콜백이 호출되고, 실패하면 onFailure() 콜백이 호출됩니다.
  • response.body()를 통해 JSON 데이터를 User 객체로 변환하고, 이를 로그에 출력합니다.

7. 실행 결과

위 코드를 실행하면, API로부터 받은 사용자 정보가 로그에 출력됩니다. 예를 들어, 사용자 이름과 이메일을 로그로 확인할 수 있습니다.

D/MainActivity: User Name: John Doe, Email: john.doe@example.com

이제 간단한 JSON 파싱과 API 연동을 구현했습니다! 여기서 받은 데이터를 UI에 반영하면 사용자 인터페이스에 표시할 수 있습니다.

8. 에러 처리 및 권장 사항

  • 네트워크 에러 처리: onFailure() 콜백에서 네트워크 오류를 처리할 수 있습니다. 사용자에게 네트워크 상태를 알려주거나 재시도를 유도하는 메시지를 보여주는 것이 좋습니다.
  • UI 업데이트: 네트워크 요청은 메인 스레드에서 실행되지 않기 때문에, UI 업데이트가 필요할 경우 runOnUiThread와 같은 방법으로 메인 스레드에서 실행해야 합니다.
  • Retrofit의 코루틴 사용: 더 나은 비동기 처리를 위해 Retrofit은 코루틴을 지원합니다. 코루틴을 사용하면 코드가 더 간결하고 읽기 쉬워집니다. 이는 이후 포스팅에서 다루겠습니다.

9. 마치며

오늘은 간단한 예제를 통해 안드로이드에서 JSON 파싱과 API 연동을 하는 방법을 살펴보았습니다. Retrofit을 이용하면 HTTP 요청과 JSON 파싱을 쉽게 처리할 수 있습니다. 이후에는 Retrofit과 코루틴을 활용한 더 효율적인 네트워크 처리 방법에 대해서도 다뤄보도록 하겠습니다.

반응형