[kotlin] Ktor 클라이언트 라이브러리의 GraphQL 연동

최근에 많은 웹 서비스가 GraphQL을 사용하고 있습니다. 이에따라 Kotlin 기반의 Ktor 웹 프레임워크를 사용하여 GraphQL API와 통합하기 위한 방법을 살펴보겠습니다.

1. Ktor 클라이언트 라이브러리 추가

먼저, Kotlin 프로젝트에 Ktor 클라이언트 라이브러리를 추가해야 합니다. build.gradle.kts 파일에 다음 의존성을 추가합니다.

dependencies {
    implementation("io.ktor:ktor-client-core:$ktorVersion")
    implementation("io.ktor:ktor-client-json:$ktorVersion")
    implementation("io.ktor:ktor-client-logging:$ktorVersion")
    implementation("io.ktor:ktor-client-logging-jvm:$ktorVersion")
}

위의 코드에서 $ktorVersion은 사용하고 있는 Ktor 버전에 맞게 변경되어야 합니다.

2. GraphQL 요청 작성

다음으로 GraphQL 요청을 작성하는 방법을 알아보겠습니다. kotlinx.serialization을 사용하여 GraphQL 요청과 응답을 직렬화하고 역직렬화할 수 있습니다.

아래는 간단한 GraphQL 쿼리를 작성하는 방법입니다.

import io.ktor.client.HttpClient
import io.ktor.client.request.post
import io.ktor.client.request.url
import io.ktor.http.ContentType
import io.ktor.http.content.TextContent
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

@OptIn(ExperimentalSerializationApi::class)
suspend fun makeGraphQLRequest(client: HttpClient, query: String, variables: Map<String, @Serializable Any>? = null): String {
    val body = Json.encodeToString(mapOf("query" to query, "variables" to variables))
    
    val response = client.post<String> {
        url("https://your-graphql-api-url.com")
        body = TextContent(body, ContentType.Application.Json)
    }

    return response
}

위의 코드에서 makeGraphQLRequest 함수는 Ktor 클라이언트를 사용하여 GraphQL 요청을 보내는 예제입니다.

3. GraphQL 응답 처리

마지막으로, GraphQL 응답을 처리하는 방법을 알아보겠습니다. Kotlin의 kotlinx.serialization을 사용하여 응답을 파싱할 수 있습니다.

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

data class GraphQLResponse<T>(
    val data: T? = null,
    val errors: List<GraphQLError>? = null
)

data class GraphQLError(
    val message: String
)

@OptIn(ExperimentalSerializationApi::class)
inline fun <reified T> parseGraphQLResponse(response: String): T? {
    val parsedResponse: GraphQLResponse<T> = Json.decodeFromString(response)
    
    if (parsedResponse.errors != null) {
        parsedResponse.errors.forEach {
            // handle errors
            println("GraphQL error: ${it.message}")
        }
    }
    
    return parsedResponse.data
}

위의 코드에서 parseGraphQLResponse 함수는 GraphQL 응답을 처리하고, 에러를 관리하는 방법을 보여줍니다.

결론

Kotlin 기반의 Ktor 클라이언트를 사용하여 GraphQL API와 통합하는 방법에 대해 알아보았습니다. GraphQL 요청을 보내고 응답을 처리하는 방법을 알면, 더욱 유연하고 효율적인 웹 애플리케이션을 개발할 수 있게 될 것입니다.