서버 플러그인
Ktor의 일반적인 요청/응답 파이프라인은 다음과 같습니다.
요청으로 시작하여 특정 핸들러로 라우팅되고, 애플리케이션 로직에 의해 처리된 다음, 최종적으로 응답됩니다.
플러그인으로 기능 추가
많은 애플리케이션은 애플리케이션 로직 범위 외의 공통 기능을 필요로 합니다. 이는 직렬화 및 콘텐츠 인코딩, 압축, 헤더, 쿠키 지원 등일 수 있습니다. 이 모든 것은 Ktor에서 우리가 플러그인이라고 부르는 수단을 통해 제공됩니다.
이전 파이프라인 다이어그램을 보면 플러그인은 요청/응답과 애플리케이션 로직 사이에 위치합니다.
요청이 들어오면:
- 라우팅 메커니즘을 통해 올바른 핸들러로 라우팅됩니다.
- 핸들러에 전달되기 전에 하나 이상의 플러그인을 거칩니다.
- 핸들러(애플리케이션 로직)가 요청을 처리합니다.
- 응답이 클라이언트에 전송되기 전에 하나 이상의 플러그인을 거칩니다.
라우팅은 플러그인입니다
플러그인은 최대한의 유연성을 제공하도록 설계되었으며, 요청/응답 파이프라인의 모든 세그먼트에 존재할 수 있습니다. 사실, 지금까지 routing
이라고 불렀던 것은 플러그인에 지나지 않습니다.
플러그인 의존성 추가
대부분의 플러그인은 특정 의존성을 필요로 합니다. 예를 들어, CORS
플러그인은 빌드 스크립트에 ktor-server-cors
아티팩트를 추가해야 합니다:
플러그인 설치
플러그인은 일반적으로 서버 초기화 단계에서 Plugin
을 매개변수로 받는 install
함수를 사용하여 구성됩니다. 서버를 생성한 방식에 따라 embeddedServer
호출 내에서 플러그인을 설치할 수 있습니다...
import io.ktor.server.application.*
import io.ktor.server.plugins.cors.*
import io.ktor.server.plugins.compression.*
// ...
fun main() {
embeddedServer(Netty, port = 8080) {
install(CORS)
install(Compression)
// ...
}.start(wait = true)
}
... 또는 지정된 모듈에서:
import io.ktor.server.application.*
import io.ktor.server.plugins.cors.*
import io.ktor.server.plugins.compression.*
// ...
fun Application.module() {
install(CORS)
install(Compression)
// ...
}
요청과 응답을 가로채는 것 외에도, 플러그인은 이 단계에서 구성되는 선택적 구성 섹션을 가질 수 있습니다.
예를 들어, 쿠키를 설치할 때 쿠키를 저장할 위치 또는 쿠키 이름과 같은 특정 매개변수를 설정할 수 있습니다.
install(Sessions) {
cookie<MyCookie>("MY_COOKIE")
}
특정 라우트에 플러그인 설치
Ktor에서는 플러그인을 전역적으로 설치할 수 있을 뿐만 아니라 특정 라우트에도 설치할 수 있습니다. 이는 다른 애플리케이션 리소스에 대해 다른 플러그인 구성이 필요한 경우 유용할 수 있습니다. 예를 들어, 아래 예시는 /index
라우트에 지정된 캐싱 헤더를 추가하는 방법을 보여줍니다.
route("/index") {
install(CachingHeaders) {
options { call, content -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 1800)) }
}
get {
call.respondText("Index page")
}
}
동일한 플러그인의 여러 설치에 다음 규칙이 적용됩니다:
- 특정 라우트에 설치된 플러그인의 구성은 해당 전역 구성을 재정의합니다.
- 라우팅은 동일한 라우트에 대한 설치를 병합하며, 마지막 설치가 우선합니다. 예를 들어, 이러한 애플리케이션의 경우...
routing {
route("index") {
install(CachingHeaders) { /* First configuration */ }
get("a") {
// ...
}
}
route("index") {
install(CachingHeaders) { /* Second configuration */ }
get("b") {
// ...
}
}
}
"}
... /index/a
및 /index/b
에 대한 두 호출 모두 두 번째 플러그인 설치에서만 처리됩니다.
기본, 제공 및 사용자 지정 플러그인
기본적으로 Ktor는 어떤 플러그인도 활성화하지 않으므로, 애플리케이션에 필요한 기능을 위해 플러그인을 설치하는 것은 사용자에게 달려 있습니다.
하지만 Ktor는 기본으로 제공되는 다양한 플러그인을 제공합니다. Ktor 플러그인 레지스트리에서 이들의 전체 목록을 확인할 수 있습니다.
또한 자신만의 사용자 지정 플러그인을 생성할 수도 있습니다.