개발 정보 공유/Kotlin

안드로이드 앱 네트워킹, 정복 가즈아! 🚀 (feat. 예제 코드 )

언제나 예외처리...ㅡ.ㅡ) b 2024. 12. 31. 09:27
반응형

안녕!! 👋 오늘은 안드로이드 앱 개발에서 네트워킹에 대해 알아보려고 해. 요즘 앱들은 인터넷 연결 없이 사용 가능한 경우가 거의 없잖아? 서버에서 데이터를 가져오고, 또 보내고... 이런 네트워킹이 정말 중요해졌어.

그래서 오늘은 안드로이드에서 네트워킹을 어떻게 하는지, 어떤 라이브러리들을 주로 사용하는지, 그리고 주의해야 할 점은 무엇인지 꼼꼼하게 알아볼 거야. 지루한 이론만 늘어놓는 게 아니라, 이해하기 쉬운 예제 코드 이미지도 팍팍 넣어서 설명해 줄 테니까, 재미있게 읽어봐 🤩!

목차

  1. 네트워킹, 왜 중요할까?
  2. 안드로이드 네트워킹, 이것만은 알고 가자!
    • 2.1. HttpURLConnection: 기본 of 기본, 직접 컨트롤하는 API
      • 2.1.1. HttpURLConnection 장단점
      • 2.1.2. HttpURLConnection 사용 예제 (GET)
    • 2.2. Retrofit: 요즘 대세, 간편하고 강력한 라이브러리
      • 2.2.1. Retrofit 장단점
      • 2.2.2. Retrofit 설정
      • 2.2.3. Retrofit 사용 예제 (GET)
    • 2.3. Volley: 구글 공식 라이브러리, 믿고 쓰는 안정감
      • 2.3.1. Volley 장단점
      • 2.3.2. Volley 설정
      • 2.3.3. Volley 사용 예제 (GET)
  3. JSON 파싱, Gson & Jackson으로 쉽게 하자!
    • 3.1 Gson
      • 3.1.1 Gson 설정
      • 3.1.2 Gson 사용 예제
    • 3.2 Jackson
      • 3.2.1 Jackson 설정
      • 3.2.2 Jackson 사용 예제
  4. 비동기 처리, Coroutine으로 똑똑하게!
  5. 네트워킹, 이것만은 주의하자!
  6. 마무리하며: 네트워킹 마스터를 향해!

1. 네트워킹, 왜 중요할까?

요즘 세상에 인터넷 연결 안 되는 앱은 거의 없잖아? 대부분의 앱이 서버와 데이터를 주고받으면서 동작해. 예를 들어,

  • 소셜 미디어 앱: 새로운 게시물을 불러오고, 댓글을 남기고, 친구들과 메시지를 주고받는 모든 과정이 네트워킹을 통해 이루어져.
  • 쇼핑 앱: 상품 목록을 보여주고, 장바구니에 담고, 결제하는 과정도 모두 서버와의 통신이 필요해.
  • 날씨 앱: 현재 날씨 정보를 실시간으로 가져오려면 서버와 연결되어야 해.

이처럼 네트워킹은 앱의 핵심 기능을 담당하기 때문에, 안정적이고 효율적인 네트워킹 구현은 매우 중요해.

2. 안드로이드 네트워킹, 이것만은 알고 가자!

안드로이드에서 네트워킹을 하기 위한 방법은 여러 가지가 있어. 그중에서 가장 대표적인 HttpURLConnection, Retrofit, Volley를 알아보자!

2.1. HttpURLConnection: 기본 of 기본, 직접 컨트롤하는 API

HttpURLConnection은 안드로이드 SDK에 포함된 기본적인 네트워킹 API야. HTTP/HTTPS 요청을 보내고 응답을 받을 수 있는 기능을 제공해. 가장 기본적인 API이기 때문에, 다른 라이브러리들에 비해 직접 처리해야 할 부분이 많아.

2.1.1. HttpURLConnection 장단점
  • 장점:
    • 안드로이드 SDK에 포함되어 있어서 별도의 라이브러리를 추가할 필요가 없어.
    • 저수준 API이기 때문에, 세밀한 제어가 가능해.
  • 단점:
    • 코드가 복잡하고, 가독성이 떨어져.
    • 비동기 처리를 직접 구현해야 해.
    • JSON 파싱 기능이 없어 (외부 라이브러리 필요)
2.1.2. HttpURLConnection 사용 예제 (GET)

 

Kotlin
 
fun httpGetRequest(urlString: String): String {
    val url = URL(urlString)
    val connection = url.openConnection() as HttpURLConnection
    connection.requestMethod = "GET"

    // Input/Output Stream 관련 코드는 생략     return response.toString()
}

 

(이미지: HttpURLConnection을 사용하여 네트워크 요청을 보내는 다이어그램)

 

코드 스니펫
 
graph TD
    A[Android App] -->|HttpURLConnection| B(Network)
    B -->|Response| A

 

 

반응형

 

2.2. Retrofit: 요즘 대세, 간편하고 강력한 라이브러리

Retrofit은 Square에서 만든 HTTP 클라이언트 라이브러리야. HttpURLConnection에 비해 훨씬 간편하고 가독성 높은 코드로 네트워킹을 구현할 수 있어. REST API와 궁합이 아주 좋아!

2.2.1. Retrofit 장단점
  • 장점:
    • 코드가 간결하고 가독성이 좋아.
    • 인터페이스 기반으로 API를 정의할 수 있어.
    • Converter를 사용해서 JSON, XML 등 다양한 형식의 응답을 쉽게 처리할 수 있어. (Gson, Jackson 등과 연동 쉬움)
    • RxJava, Coroutine과 쉽게 통합할 수 있어.
  • 단점:
    • 외부 라이브러리이기 때문에, 프로젝트에 추가해야 해.
    • 러닝 커브가 살짝 있어.
2.2.2. Retrofit 설정

build.gradle (Module :app) 에 다음 의존성을 추가해야 해.

 

Gradle
 
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson 사용 시 }

 

(이미지: build.gradle 파일에 Retrofit 의존성을 추가하는 스크린샷)

2.2.3. Retrofit 사용 예제 (GET)

1. API 인터페이스 정의:

 

Kotlin
 
interface ApiService {
    @GET("posts/{id}")     fun getPost(@Path("id") postId: Int): Call<Post>
}

 

2. Retrofit 인스턴스 생성:

 

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

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

 

13. API 호출:

 

Kotlin
 
val call = apiService.getPost(1)
call.enqueue(object : Callback<Post> {
    override fun onResponse(call: Call<Post>, response: Response<Post>) {
        if (response.isSuccessful) {
            val post = response.body()
            // ...         }
    }

    override fun onFailure(call: Call<Post>, t: Throwable) {
        // ...     }
})

 

(이미지: Retrofit을 사용하여 API를 호출하고 응답을 받는 다이어그램)

 

코드 스니펫
 
graph TD
    A[Android App] -->|Retrofit| B(Network)
    B -->|JSON Response| A
    A -->|Gson| C{Data Object}

 

2.3. Volley: 구글 공식 라이브러리, 믿고 쓰는 안정감

Volley는 구글에서 만든 네트워킹 라이브러리야. 비동기 처리 캐싱 기능을 기본적으로 제공하기 때문에, 네트워크 요청을 효율적으로 처리할 수 있어.

2.3.1. Volley 장단점
  • 장점:
    • 자동으로 비동기 처리를 해줘.
    • 요청 우선순위를 지정할 수 있어.
    • 강력한 캐싱 기능을 제공해.
    • 구글에서 만들어서, 안정성이 높아.
  • 단점:
    • Retrofit에 비해 코드가 약간 더 복잡해.
    • REST API와의 연동은 Retrofit이 더 편리해.
2.3.2. Volley 설정

build.gradle (Module :app) 에 다음 의존성을 추가해야 해.

 

Gradle
 
dependencies {
    implementation 'com.android.volley:volley:1.2.1' }

 

(이미지: build.gradle 파일에 Volley 의존성을 추가하는 스크린샷)

2.3.3. Volley 사용 예제 (GET)

 

Kotlin
 
val queue = Volley.newRequestQueue(this)
val url = "https://jsonplaceholder.typicode.com/posts/1"

val stringRequest = StringRequest(Request.Method.GET, url,
    { response ->
        // 응답 처리         Log.d("Response", response)
    },
    { error ->
        // 에러 처리         Log.e("Error", error.toString())
    })

queue.add(stringRequest)

 

(이미지: Volley를 사용하여 네트워크 요청을 보내고 응답을 받는 다이어그램)

 

코드 스니펫
 
graph TD
    A[Android App] -->|Volley| B(Network)
    B -->|Response| A

 

3. JSON 파싱, Gson & Jackson으로 쉽게 하자!

서버에서 데이터를 주고받을 때 가장 많이 사용되는 형식이 JSON이야. 안드로이드에서 JSON 데이터를 다루려면 파싱(Parsing) 라이브러리가 필요해. Gson Jackson이 가장 많이 사용되는 JSON 파싱 라이브러리야.

3.1 Gson

Gson은 구글에서 만든 JSON 파싱 라이브러리야. JSON 문자열을 자바 객체로, 자바 객체를 JSON 문자열로 쉽게 변환할 수 있어.

3.1.1 Gson 설정

Retrofit을 쓴다면 앞서 설정한 converter-gson에 포함되어 별도로 추가할 필요는 없어.

3.1.2 Gson 사용 예제

1. 데이터 클래스 정의:

 

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

 

2. JSON 문자열을 Post 객체로 변환:

 

Kotlin
 
val jsonString = """
{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
""" val gson = Gson()
val post = gson.fromJson(jsonString, Post::class.java)

 

3. Post 객체를 JSON 문자열로 변환:

 

Kotlin
 
val post = Post(1, 1, "title", "body")
val jsonString = gson.toJson(post)

 

3.2 Jackson

Jackson은 또 다른 인기 있는 JSON 파싱 라이브러리야. Gson과 비슷한 기능을 제공하지만, 더 많은 기능과 유연성을 제공해.

3.2.1 Jackson 설정

build.gradle (Module :app) 에 다음 의존성을 추가해야 해.

 

Gradle
 
dependencies {
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.4'
}

 

23.2.2 Jackson 사용 예제

1. 데이터 클래스 정의 (Gson과 동일):

 

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

 

2. JSON 문자열을 Post 객체로 변환:

 

Kotlin
 
val jsonString = """
{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
""" val mapper = jacksonObjectMapper() // 코틀린 모듈 포함 val post = mapper.readValue(jsonString, Post::class.java)

 

3. Post 객체를 JSON 문자열로 변환:

 

Kotlin
 
val post = Post(1, 1, "title", "body")
val jsonString = mapper.writeValueAsString(post)

 

4. 비동기 처리, Coroutine으로 똑똑하게!

네트워크 요청은 시간이 오래 걸릴 수 있기 때문에, 반드시 비동기적으로 처리해야 해. 그렇지 않으면 메인 스레드(UI 스레드)가 멈춰서 앱이 멈춘 것처럼 보일 수 있어. (ANR - Application Not Responding)

Coroutine은 코틀린에서 비동기 처리를 하기 위한 가장 좋은 방법이야. Coroutine을 사용하면 비동기 코드를 마치 동기 코드처럼 간편하게 작성할 수 있어.

Retrofit Coroutine과 함께 사용하면 다음과 같이 네트워크 요청을 처리할 수 있어.

 

Kotlin
 
interface ApiService {
    @GET("posts/{id}")     suspend fun getPost(@Path("id") postId: Int): Post
}

// ... viewModelScope.launch { // ViewModelScope 사용 예제, 별도의 코루틴 스코프 사용도 가능     try {
        val post = apiService.getPost(1)
        // ...     } catch (e: Exception) {
        // ...     }
}

 

5. 네트워킹, 이것만은 주의하자!

  • INTERNET 권한: AndroidManifest.xml 파일에 INTERNET 권한을 추가해야 해.
    XML
     
    <manifest ...>     <uses-permission android:name="android.permission.INTERNET" />     ...
    </manifest> 
  • 메인 스레드에서 네트워크 요청 금지: 네트워크 요청은 반드시 백그라운드 스레드에서 해야 해. Coroutine을 사용하면 이 문제를 쉽게 해결할 수 있어.
  • 예외 처리: 네트워크 연결 실패, 서버 오류 등 예외 상황에 대비하여 적절한 예외 처리를 해야 해.
  • 보안: HTTPS를 사용하여 데이터를 안전하게 전송하고, 필요한 경우 인증 및 권한 부여를 구현해야 해.
  • 데이터 사용량: 사용자의 데이터 사용량을 고려하여, 불필요한 네트워크 요청을 줄이고, 데이터를 효율적으로 사용해야 해.

6. 마무리하며: 네트워킹 마스터를 향해!

오늘은 안드로이드 앱에서 네트워킹을 어떻게 하는지, 어떤 라이브러리들이 있는지, 그리고 주의해야 할 점은 무엇인지 알아봤어. HttpURLConnection, Retrofit, Volley 같은 HTTP 클라이언트 라이브러리들과 Gson, Jackson 같은 JSON 파싱 라이브러리, 그리고 Coroutine을 사용한 비동기 처리까지! 이제 이 내용들을 잘 활용해서 서버와 자유롭게 데이터를 주고받는 멋진 앱을 만들어 보자고!

이 글이 네트워킹을 처음 접하는 친구들에게 조금이나마 도움이 되었으면 좋겠고, 앞으로 더 멋진 앱을 만드는 데 밑거름이 되기를 바라! 💪

 

 

반응형