코틀린 안드로이드 앱개발 강좌, HTTP 통신하기

안녕하세요! 이번 포스트에서는 코틀린을 사용하여 안드로이드 앱에서 HTTP 통신을 구현하는 방법에 대해 자세히 알아보겠습니다. 현대의 애플리케이션은 외부 서버와의 연동을 통해 실시간 데이터를 전송하고 수신해야 하는 경우가 많습니다. 따라서, 여러분은 HTTP 통신을 배우는 것이 필수적입니다. 이번 강좌는 다음과 같은 내용을 포함합니다.

  • HTTP 통신의 기본 개념 이해
  • Kotlin과 Android에서 HTTP 요청을 보내는 방법
  • Retrofit과 OkHttp를 이용한 API 호출
  • JSON 데이터 파싱
  • 안전한 네트워크 호출을 위한 Best Practices

1. HTTP 통신의 기본 개념 이해

HTTP(HyperText Transfer Protocol)는 웹에서 클라이언트와 서버 간의 통신을 위한 프로토콜입니다. 기본적으로 클라이언트는 데이터를 요청하고, 서버는 데이터를 응답합니다. 이 과정에서 사용되는 HTTP 메서드에는 GET, POST, PUT, DELETE 등이 있습니다.

2. Kotlin과 Android에서 HTTP 요청을 보내는 방법

안드로이드에서 HTTP 통신을 하기 위해서는 여러 가지 라이브러리를 사용할 수 있습니다. 대표적으로 HttpURLConnection, OkHttp, Retrofit 등이 있으며, 여기서는 Retrofit을 사용하여 API를 호출하는 방법을 중점적으로 설명하겠습니다.

2.1 Retrofit 라이브러리 설정

Retrofit은 Square에서 만든 타입 세이프한 HTTP 클라이언트로, RESTful API 통신을 쉽게 해줍니다. 아래와 같은 방법으로 프로젝트에 Retrofit을 추가할 수 있습니다.

build.gradle (Module: app)
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

2.2 API 인터페이스 정의하기

Retrofit을 사용하기 위해서는 먼저 API 통신을 위한 인터페이스를 정의해야 합니다.

interface ApiService {
    @GET("posts")
    suspend fun getPosts(): List
}

2.3 Retrofit 인스턴스 생성하기

이제 Retrofit 인스턴스를 생성하여 API 서비스를 사용할 수 있습니다.

val retrofit = Retrofit.Builder()
    .baseUrl("https://jsonplaceholder.typicode.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

2.4 Coroutine을 활용한 비동기 API 호출

안드로이드에서는 Coroutine을 사용하여 비동기 작업을 수행할 수 있습니다. 아래는 API를 호출하는 예제입니다.

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

        fetchPosts()
    }

    private fun fetchPosts() {
        CoroutineScope(Dispatchers.IO).launch {
            try {
                val posts = apiService.getPosts()
                withContext(Dispatchers.Main) {
                    // UI 업데이트
                    println(posts)
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

3. JSON 데이터 파싱

Retrofit은 JSON 데이터를 자동으로 객체로 변환해줍니다. 그러므로, 다음과 같이 데이터 클래스를 정의해 주어야 합니다.

data class Post(
    val userId: Int,
    val id: Int,
    val title: String,
    val body: String
)

4. 안전한 네트워크 호출을 위한 Best Practices

HTTP 통신을 구현하는 동안 고려해야 할 몇 가지 모범 사례가 있습니다.

  • 사용자 인터페이스(UI)에 영향을 주지 않도록 비동기 처리를 하는 것이 좋습니다.
  • 네트워크 요청에 대한 예외 처리를 반드시 구현해야 합니다.
  • API 호출 시 RxJava나 Coroutine을 사용하여 효율적인 비동기 프로그래밍을 하도록 합니다.
  • HTTPS 프로토콜을 사용하여 데이터의 안전성을 높입니다.

5. 예제 프로젝트

이제 모든 내용을 종합하여 간단한 예제 프로젝트를 만들어 보겠습니다. 이 프로젝트에서는 JSONPlaceholder API를 통해 게시글 목록을 가져오고, 화면에 표시하는 기능을 구현하겠습니다.

5.1 프로젝트 구조

  • Data: API 통신과 데이터 모델
  • View: UI 구성
  • ViewModel: 데이터와 UI의 상호작용

5.2 활동 만들기

먼저 간단한 UI를 정의합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/responseTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

5.3 ViewModel 구성하기

class MainViewModel : ViewModel() {
    private val _posts = MutableLiveData>()
    val posts: LiveData> get() = _posts

    fun fetchPosts() {
        viewModelScope.launch {
            val response = apiService.getPosts()
            _posts.value = response
        }
    }
}

5.4 액티비티에 ViewModel 연결하기

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel

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

        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        viewModel.fetchPosts()

        viewModel.posts.observe(this, Observer {
            val texts = StringBuilder()
            it.forEach { post -> 
                texts.append(post.title).append("\n")
            }
            findViewById(R.id.responseTextView).text = texts.toString()
        })
    }
}

결론

이번 글에서는 Kotlin과 Retrofit을 사용하여 안드로이드 앱에서 HTTP 통신을 구현하는 방법을 자세히 설명했습니다. HTTP 통신은 현대 애플리케이션의 핵심 기능 중 하나로, 이를 통해 사용자에게 보다 나은 경험을 제공할 수 있습니다. 더 나아가 Network, ViewModel, LiveData 등을 결합하여 보다 효율적이고 유지보수하기 쉬운 코드를 만들 수 있습니다. 여러분이 이 강좌를 통해 HTTP 통신의 기초를 탄탄히 다지기를 바랍니다.

다음 강좌에서는 더 심화된 주제인 API 인증, 데이터베이스 연동 등을 다룰 예정입니다. 항상 지속적으로 학습하고 성장하시길 바랍니다!