Ktor로 HTTP Client 만들기

2025. 6. 5. 16:10·Kotlin

오늘은 Ktor로 HTTP Client 만드는 방법을 알아보겠습니다.

 

Ktor HTTP Client 만들기

- 의존성 추가하기

// libs.versions.toml
[versions]
ktor = "3.1.3"

[libraries]
ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
ktor-client-cio = { group = "io.ktor", name = "ktor-client-cio", version.ref = "ktor" }
ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" }

core 라이브러리는 Ktor 클라이언트의 핵심 기능을 제공하며, cio는 네트워크 요청을 처리하는 엔진 라이브러리입니다. 엔진 라이브러리는 플랫폼에 따라 사용할 수 있는 엔진이 달라지는데, 해당 표를 참고해 선택하면 됩니다. 안드로이드의 경우 Android, OkHttp, CIO를 사용할 수 있습니다.

 

negotiation과 serialization은 core나 엔진처럼 필수는 아니지만, 선택적으로 추가해 사용할 수 있는 플러그인입니다. 아래에서 자세히 설명하겠습니다.

 

- 클라이언트 생성하기

val client = HttpClient(CIO)

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    
    @Provides
    @Singleton
    fun provideHttpClient(): HttpClient = HttpClient(CIO)
}

기본적인 HTTP 클라이언트 인스턴스를 생성하는 방법입니다. 만약 괄호 안에 엔진을 제공하지 않으면 클라이언트가 자동으로 엔진을 선택합니다. 하지만 Android와 iOS를 동시에 지원하는 등의 멀티 플랫폼 프로젝트에서 유용한 기능이므로, 안드로이드에서 사용 가능한 엔진을 직접 제공하는 것을 추천합니다. 아래는 Hilt를 사용해 의존성 주입을 자동으로 처리하는 예시입니다.

 

- 클라이언트 구성하기

val client = HttpClient {
    engine {
        threadsCount = 4
        pipelining = true
    }

    install(ContentNegotiation) {
        json()
    }

    defaultRequest {
        url("https://api.example.com")
        header("X-Custom-Header", "value")
    }

    expectSuccess = true
    followRedirects = true
}

HttpClient의 람다 블록 내부에서 플러그인 설치와 엔진, 전체 설정 등을 구성할 수 있습니다. 사용 가능한 모든 옵션은 HttpClientConfig 클래스를 통해 확인할 수 있습니다.

 

- 클라이언트 닫기

client.close()를 사용해 클라이언트를 닫을 수 있습니다. 클라이언트를 닫으면 새로운 요청은 불가능하지만, 이미 활성화 중이던 요청은 종료되지 않으며 모든 요청이 완료되어야 닫히게 됩니다.

val status = HttpClient().use { client ->
    // ...
}

단일 요청에 사용할 경우에는 use를 사용해 사용 후 안전하게 클라이언트를 닫을 수 있습니다.

 

- 플러그인 설치하기

여러 가지 플러그인을 설치할 수 있는데, 여기서는 콘텐츠 협상과 직렬화를 예를 들어 설명하겠습니다.

val client = HttpClient(CIO) {
    install(ContentNegotiation) {
        json(
            Json {
                ignoreUnknownKeys = true
                isLenient = true
            }
        )
    }
}

먼저 install(ContentNegotiation)으로 ContentNegotiation을 설치합니다. 그 안의 람다 블록에서는  json()으로 서버와 데이터를 주고받을 때 Content-type에 맞춰 자동으로 직렬화/역직렬화를 처리하는 플러그인을 설치할 수 있습니다. 이때 직렬화 라이브러리는 kotlinx.serialization을 사용합니다.

 

추가로, Json 빌더를 사용해 세부 설정을 할 수 있습니다. 아래 설정을 통해 오류 발생 가능성을 낮출 수 있습니다.

 

- ignoreUnknownKeys는 서버 응답 JSON에 정의되지 않은 필드가 있어도 무시합니다.

 

- isLenient는 JSON 형식이 따옴표 누락 같이 약간 틀린 부분이 있어도 허용합니다.

 

이렇게 해서 HTTP Client 설정이 완료되었습니다. 다음에는 HTTP 요청 방법에 대해 알아보겠습니다.

 

'Kotlin' 카테고리의 다른 글
  • Kotlin LocalDateTime 날짜/시간 형식 지정하기
  • Kotlin Long to LocalDateTime, LocalDateTime to Long 변환하기
  • Kotlin takeIf 알아보기
브애애앳
브애애앳
  • 브애애앳
    디벨로퍼즐
    브애애앳
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • Android (4)
      • Android App (0)
      • Figma (1)
      • Jetpack (2)
      • Jetpack Compose (15)
      • Kotlin (4)
      • Tistory (1)
  • 링크

    • 카카오톡 문의
  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
브애애앳
Ktor로 HTTP Client 만들기
상단으로

티스토리툴바