안녕!! 👋 오늘은 안드로이드 앱 개발에서 네트워킹에 대해 알아보려고 해. 요즘 앱들은 인터넷 연결 없이 사용 가능한 경우가 거의 없잖아? 서버에서 데이터를 가져오고, 또 보내고... 이런 네트워킹이 정말 중요해졌어.
그래서 오늘은 안드로이드에서 네트워킹을 어떻게 하는지, 어떤 라이브러리들을 주로 사용하는지, 그리고 주의해야 할 점은 무엇인지 꼼꼼하게 알아볼 거야. 지루한 이론만 늘어놓는 게 아니라, 이해하기 쉬운 예제 코드와 이미지도 팍팍 넣어서 설명해 줄 테니까, 재미있게 읽어봐 🤩!
목차
- 네트워킹, 왜 중요할까?
- 안드로이드 네트워킹, 이것만은 알고 가자!
- 2.1.
HttpURLConnection
: 기본 of 기본, 직접 컨트롤하는 API- 2.1.1.
HttpURLConnection
장단점 - 2.1.2.
HttpURLConnection
사용 예제 (GET)
- 2.1.1.
- 2.2.
Retrofit
: 요즘 대세, 간편하고 강력한 라이브러리- 2.2.1.
Retrofit
장단점 - 2.2.2.
Retrofit
설정 - 2.2.3.
Retrofit
사용 예제 (GET)
- 2.2.1.
- 2.3.
Volley
: 구글 공식 라이브러리, 믿고 쓰는 안정감- 2.3.1.
Volley
장단점 - 2.3.2.
Volley
설정 - 2.3.3.
Volley
사용 예제 (GET)
- 2.3.1.
- 2.1.
- JSON 파싱, Gson & Jackson으로 쉽게 하자!
- 3.1
Gson
- 3.1.1
Gson
설정 - 3.1.2
Gson
사용 예제
- 3.1.1
- 3.2
Jackson
- 3.2.1
Jackson
설정 - 3.2.2
Jackson
사용 예제
- 3.2.1
- 3.1
- 비동기 처리, Coroutine으로 똑똑하게!
- 네트워킹, 이것만은 주의하자!
- 마무리하며: 네트워킹 마스터를 향해!
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)
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) 에 다음 의존성을 추가해야 해.
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 인터페이스 정의:
interface ApiService {
@GET("posts/{id}") fun getPost(@Path("id") postId: Int): Call<Post>
}
2. Retrofit
인스턴스 생성:
val retrofit = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
13. API 호출:
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) 에 다음 의존성을 추가해야 해.
dependencies {
implementation 'com.android.volley:volley:1.2.1' }
(이미지: build.gradle
파일에 Volley
의존성을 추가하는 스크린샷)
2.3.3. Volley
사용 예제 (GET)
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. 데이터 클래스 정의:
data class Post(
val userId: Int,
val id: Int,
val title: String,
val body: String
)
2. JSON 문자열을 Post
객체로 변환:
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 문자열로 변환:
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) 에 다음 의존성을 추가해야 해.
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과 동일):
data class Post(
val userId: Int,
val id: Int,
val title: String,
val body: String
)
2. JSON 문자열을 Post
객체로 변환:
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 문자열로 변환:
val post = Post(1, 1, "title", "body")
val jsonString = mapper.writeValueAsString(post)
4. 비동기 처리, Coroutine으로 똑똑하게!
네트워크 요청은 시간이 오래 걸릴 수 있기 때문에, 반드시 비동기적으로 처리해야 해. 그렇지 않으면 메인 스레드(UI 스레드)가 멈춰서 앱이 멈춘 것처럼 보일 수 있어. (ANR - Application Not Responding)
Coroutine
은 코틀린에서 비동기 처리를 하기 위한 가장 좋은 방법이야. Coroutine
을 사용하면 비동기 코드를 마치 동기 코드처럼 간편하게 작성할 수 있어.
Retrofit
을 Coroutine
과 함께 사용하면 다음과 같이 네트워크 요청을 처리할 수 있어.
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
을 사용한 비동기 처리까지! 이제 이 내용들을 잘 활용해서 서버와 자유롭게 데이터를 주고받는 멋진 앱을 만들어 보자고!
이 글이 네트워킹을 처음 접하는 친구들에게 조금이나마 도움이 되었으면 좋겠고, 앞으로 더 멋진 앱을 만드는 데 밑거름이 되기를 바라! 💪
'개발 정보 공유 > Kotlin' 카테고리의 다른 글
안드로이드 백그라운드 작업 & 비동기 처리: 앱 성능 향상의 핵심 열쇠 🔑 (1) | 2025.01.02 |
---|---|
안드로이드 앱에서 데이터 처리 및 저장, 정복해 보자! (3) | 2024.12.30 |
UI 디자인 및 사용자 상호작용: 사용자 경험을 극대화하는 핵심 요소 (2) | 2024.12.29 |
Android Kotlin 개발, 첫걸음부터 탄탄하게! (개발 환경 구축 및 기본 개념) (5) | 2024.12.27 |