본문 바로가기
Android

[Android] 안드로이드 네트워크 통신의 기본: Retrofit과 OkHttp

by LoseyKim 2024. 12. 10.

안드로이드 앱 개발에서는 서버와 데이터를 주고받는 작업은 필수적이에요. 서버에서 데이터를 가져와 화면에 표시하거나, 사용자가 입력한 데이터를 서버로 전송하는 과정이 바로 네트워크 통신이에요. 이런 작업을 간단하고 효율적으로 처리할 수 있도록 도와주는 도구가 RetrofitOkHttp입니다. 이번 글에서는 이 두 도구의 특징과 설정 방법, 그리고 데이터를 가져오고 보내는 예제를 자세히 설명할게요.


1. Retrofit과 OkHttp란 무엇인가요?

Retrofit이란?

Retrofit은 서버와 데이터를 주고받는 작업을 쉽게 만들어주는 도구예요. 특히 RESTful API와 잘 맞아, API의 주소와 필요한 데이터를 간단히 정의하면 요청과 응답을 손쉽게 처리할 수 있어요.

 

Retrofit의 주요 특징

  • 간단한 요청 처리: API 요청을 정의하는 인터페이스만 작성하면 복잡한 코드를 작성하지 않아도 돼요.
  • 자동 데이터 변환: 서버에서 받은 JSON 데이터를 자동으로 Kotlin 객체로 변환해 줘요(Gson 등 라이브러리 활용).
  • OkHttp와 결합 가능: 요청 로그를 확인하거나 네트워크 성능을 최적화하는 작업도 쉽게 추가할 수 있어요.

OkHttp란?

OkHttp는 네트워크 요청(데이터 가져오기/보내기)을 처리하는 저수준 라이브러리예요. Retrofit은 OkHttp를 내부적으로 사용해 요청을 보내고 응답을 받아요.

 

OkHttp의 주요 특징

  • 요청/응답 로그 확인: 네트워크 요청과 응답 데이터를 로그로 출력해 디버깅을 도와줘요.
  • 효율적인 네트워크 관리: 커넥션 풀을 통해 네트워크 연결을 효율적으로 관리해 앱 성능을 높여줘요.
  • 최신 기술 지원: 최신 HTTP/2 프로토콜과 WebSocket 같은 기술도 사용할 수 있어요.

2. Retrofit과 OkHttp 설정하기

1) 인터넷 권한 추가

Retrofit과 OkHttp를 사용하려면 앱이 인터넷에 접근할 수 있어야 해요. 이를 위해 앱의 설정 파일인 AndroidManifest.xml에 인터넷 권한을 추가해야 해요. 인터넷 권한이 없으면 네트워크 요청이 실패하고 앱이 정상적으로 동작하지 않아요.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <!-- 앱이 인터넷에 접근할 수 있도록 설정 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyApp">
        <!-- 기타 설정 -->
    </application>
</manifest>

 

2) Gradle 의존성 추가

Retrofit과 OkHttp를 사용하려면 프로젝트에서 이 라이브러리들을 사용할 수 있도록 의존성을 추가해야 해요. build.gradle 파일에 아래 코드를 넣고 Sync를 실행하세요.

implementation "com.squareup.retrofit2:retrofit:2.11.0"
implementation "com.squareup.retrofit2:converter-gson:2.11.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"

 

3) Retrofit 인스턴스 생성

R Retrofit 인스턴스를 생성하여 네트워크 요청을 처리할 준비를 해요. OkHttpClient를 추가하면 요청과 응답 로그를 기록할 수 있어요.

object RetrofitInstance {
    private val client = OkHttpClient.Builder()
        .addInterceptor(HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        })
        .build()

    private val retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com/") // API 기본 URL
        .addConverterFactory(GsonConverterFactory.create()) // JSON 데이터를 객체로 변환
        .client(client)
        .build()

    fun <T> create(service: Class<T>): T = retrofit.create(service)
}

 

4) API 요청 정의

Retrofit에서는 API 요청을 인터페이스로 정의해요. 각 요청은 URL의 엔드포인트와 HTTP 메서드(GET, POST 등)로 구성돼요.

interface ApiService {
    @GET("posts") // GET 요청
    suspend fun getPosts(): List<Post>

    @POST("posts") // POST 요청
    suspend fun createPost(@Body post: Post): Response<Post>
}

3. JSON 응답 처리하기

서버에서 데이터를 가져오면 JSON 형식으로 전달돼요.

 

JSON 응답 예시

[
  {
    "id": 1,
    "title": "Retrofit 배우기",
    "body": "JSON 데이터를 처리하는 방법을 배워봅니다.",
    "userId": 101
  },
  {
    "id": 2,
    "title": "OkHttp 활용하기",
    "body": "요청과 응답 로그를 확인하는 방법을 알아봅니다.",
    "userId": 102
  }
]

 

데이터 클래스 정의

이 JSON 데이터를 Kotlin 객체로 변환하려면 데이터 클래스를 정의해야 해요. JSON 키 이름과 클래스 변수 이름이 같아야 변환이 제대로 돼요.

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

4. 데이터를 가져오기 (GET 요청)

Retrofit과 OkHttp를 사용해 서버에서 데이터를 가져오는 코드는 다음과 같아요.

@Composable
fun PostListScreen() {
    val api = RetrofitInstance.create(ApiService::class.java)
    val posts = remember { mutableStateOf<List<Post>>(emptyList()) }

    LaunchedEffect(Unit) {
        try {
            posts.value = api.getPosts() // 서버에서 데이터를 가져옵니다
        } catch (e: Exception) {
            Log.e("PostListScreen", "데이터 가져오기 실패", e)
        }
    }

    LazyColumn {
        items(posts.value) { post ->
            Text("제목: ${post.title}")
            Text("내용: ${post.body}")
        }
    }
}

5. 데이터를 보내기 (POST 요청)

서버에 데이터를 보낼 때 JSON 형식을 사용해야 해요. 아래 데이터를 전송한다고 가정해볼게요.

{
  "title": "Compose 배우기",
  "body": "네트워크 요청을 처리하는 방법을 알아봅니다.",
  "userId": 201
}

 

데이터 클래스

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

 

POST 요청 코드

@Composable
fun CreatePostScreen() {
    val api = RetrofitInstance.create(ApiService::class.java)
    val newPost = NewPost(
        title = "Compose 배우기",
        body = "네트워크 요청을 처리하는 방법을 알아봅니다.",
        userId = 201
    )

    Button(onClick = {
        LaunchedEffect(Unit) {
            try {
                val response = api.createPost(newPost) // 데이터를 서버에 보냅니다
                if (response.isSuccessful) {
                    Log.d("CreatePostScreen", "게시글 생성 성공: ${response.body()}")
                }
            } catch (e: Exception) {
                Log.e("CreatePostScreen", "게시글 생성 실패", e)
            }
        }
    }) {
        Text("게시글 생성하기")
    }
}

참고자료

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

 

 

Overview - OkHttp

OkHttp HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth. OkHttp is an HTTP client that’s efficient by default: HTTP/2 support allows all requests to

square.github.io