IMCAT.DEV
로그인 가입
Kotlin 중급 네트워크

Kotlin RESTful API 소비

Kotlin RESTful API 소비 — 중급

RESTful API 소비

1. 도입 (왜 배워야 하는가)

RESTful API는 현대 애플리케이션 개발에서 필수적인 요소입니다. 다양한 서비스와 시스템 간의 데이터 교환을 원활하게 하며, 클라이언트와 서버 간의 상호작용을 효율적으로 관리해줍니다. RESTful API를 활용하지 않으면, 데이터 통신이 불가능해지거나 비효율적인 코드를 작성하게 되어 유지보수와 성능에 악영향을 미칠 수 있습니다. 예를 들어, 쇼핑몰 애플리케이션에서 장바구니 정보를 서버와 주고받지 않으면, 사용자가 장바구니에 담은 상품 정보를 잃어버리거나 동기화가 되지 않는 문제가 발생할 수 있습니다.

2. 핵심 개념 설명

  • REST: Representational State Transfer의 약자로, HTTP 프로토콜을 기반으로 하는 아키텍처 스타일입니다. 이는 클라이언트와 서버 간의 상호작용을 구조화하는 방법입니다.
  • API: Application Programming Interface의 약자로, 소프트웨어 간의 상호작용을 정의한 인터페이스입니다.
  • HTTP Methods: 클라이언트가 서버에 요청할 때 사용하는 방법으로, 주로 GET, POST, PUT, DELETE가 있습니다.
  • - GET: 서버에서 데이터를 조회할 때 사용합니다. - POST: 서버에 새로운 데이터를 생성할 때 사용합니다. - PUT: 서버의 기존 데이터를 수정할 때 사용합니다. - DELETE: 서버의 데이터를 삭제할 때 사용합니다.

    HTTP Method설명
    GET데이터 조회
    POST데이터 생성
    PUT데이터 수정
    DELETE데이터 삭제

    3. 기본 코드 예제

    아래는 RESTful API를 소비하는 가장 기본적인 코드 예제입니다. 여기서는 GET 요청을 통해 사용자의 정보를 받아오는 예를 보여줍니다.

    import okhttp3.OkHttpClient
    import okhttp3.Request
    import okhttp3.Response
    
    fun fetchUserData(userId: String): String? {
        val client = OkHttpClient() // OkHttp 클라이언트 생성
    
        val request = Request.Builder()
            .url("https://jsonplaceholder.typicode.com/users/$userId") // API URL 설정
            .build() // 요청 빌드
    
        val response: Response = client.newCall(request).execute() // 요청 실행
    
        return if (response.isSuccessful) {
            response.body?.string() // 응답이 성공적일 경우 본문 반환
        } else {
            null // 실패할 경우 null 반환
        }
    }
    
    // 사용 예
    val userData = fetchUserData("1")
    println(userData) // 사용자 데이터 출력

    실행 결과:

    {
      "id": 1,
      "name": "Leanne Graham",
      "username": "Bret",
      "email": "[email protected]",
      ...
    }

    동작 설명:

  • OkHttpClient를 사용하여 HTTP 요청을 보내기 위한 클라이언트를 생성합니다.
  • Request.Builder()를 통해 요청을 구성하고, API의 URL을 설정합니다.
  • client.newCall(request).execute()를 호출하여 실제 요청을 실행합니다.
  • 응답이 성공적이라면 응답 본문을 문자열로 변환하여 반환합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 추가하기

    장바구니에 상품을 추가할 때 POST 요청을 보냅니다.

    fun addToCart(productId: String, quantity: Int) {
        val client = OkHttpClient()
        val json = """{"productId": "$productId", "quantity": $quantity}""" // JSON 데이터 생성
        val requestBody = json.toRequestBody("application/json".toMediaTypeOrNull()) // 요청 본문 생성
    
        val request = Request.Builder()
            .url("https://example.com/api/cart")
            .post(requestBody) // POST 요청 설정
            .build()
    
        val response: Response = client.newCall(request).execute()
        if (response.isSuccessful) {
            println("장바구니에 추가되었습니다.")
        } else {
            println("장바구니 추가 실패: ${response.code}")
        }
    }

    예제 2: 사용자 정보 업데이트

    사용자의 정보를 수정할 때 PUT 요청을 사용합니다.

    fun updateUser(userId: String, name: String) {
        val client = OkHttpClient()
        val json = """{"name": "$name"}""" // JSON 데이터 생성
        val requestBody = json.toRequestBody("application/json".toMediaTypeOrNull())
    
        val request = Request.Builder()
            .url("https://example.com/api/users/$userId")
            .put(requestBody) // PUT 요청 설정
            .build()
    
        val response: Response = client.newCall(request).execute()
        if (response.isSuccessful) {
            println("사용자 정보가 업데이트되었습니다.")
        } else {
            println("사용자 정보 업데이트 실패: ${response.code}")
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 잘못된 HTTP 메서드 사용

  • 잘못된 코드:
  • val request = Request.Builder()
        .url("https://example.com/api/cart")
        .get() // GET 메서드 사용
        .build()
  • 올바른 코드:
  • val request = Request.Builder()
        .url("https://example.com/api/cart")
        .post(requestBody) // POST 메서드 사용
        .build()

    주의사항: 각 API는 특정 HTTP 메서드를 요구하므로, 잘못된 메서드를 사용하지 않도록 주의해야 합니다.

    실수 2: 응답 본문을 바로 사용하기

  • 잘못된 코드:
  • val responseBody = response.body // null일 수 있음
  • 올바른 코드:
  • val responseBody = response.body?.string() ?: return // null 체크

    주의사항: 응답 본문이 항상 존재하는 것이 아니므로, null 체크를 통해 안전하게 처리해야 합니다.

    6. 정리

  • RESTful API는 현대 애플리케이션에서 필수적인 데이터 통신 방법입니다.
  • HTTP 메서드(GET, POST, PUT, DELETE)를 적절히 사용하여 서버와 상호작용합니다.
  • Kotlin의 OkHttp 라이브러리를 활용하여 간편하게 API를 소비할 수 있습니다.
  • 다음에 학습하면 좋은 주제는 Retrofit이라고 하는 HTTP 클라이언트 라이브러리로, API 소비를 더욱 간편하게 만들어주는 도구입니다.