{"id":199,"date":"2025-08-04T18:24:13","date_gmt":"2025-08-04T18:24:13","guid":{"rendered":"https:\/\/ranjeshviswa.com\/?p=199"},"modified":"2025-08-04T18:24:13","modified_gmt":"2025-08-04T18:24:13","slug":"ktor-for-spring-boot-developers","status":"publish","type":"post","link":"https:\/\/ranjeshviswa.com\/?p=199","title":{"rendered":"Ktor for Spring Boot Developers"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Overview<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Ktor is an open source framework\u00a0 built by JetBrains for building asynchronous servers and clients in Kotlin.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ktor offers:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Lightweight, minimal, fast startup<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Kotlin -first and coroutines<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Interoperable with Java<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Tooling support- tight integration with Intellij IDEA<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Fast Growing ecosystem<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Supports Microservices, APIs, serverless<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Cleaner Kotlin DSLs<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">Introduction<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">In this article, we will show you how to create\u00a0 a Ktor based rest application. For this, we will use order management application created using Spring Boot in one of my previous post <\/span><a href=\"https:\/\/medium.com\/ranjeshblogs\/how-to-create-restful-api-with-spring-boot-2-1-fee9f477e8a7\"><span style=\"font-weight: 400;\">https:\/\/medium.com\/ranjeshblogs\/how-to-create-restful-api-with-spring-boot-2-1-fee9f477e8a7<\/span><\/a><\/p>\n<h2><span style=\"font-weight: 400;\">Application Startup<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The following shows entry point of Ktor application and its conceptually similar to Spring Boot <\/span><span style=\"font-weight: 400;\">application\u2019s @SpringBootApplication annotated class and its main method.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">main<\/span><span style=\"font-weight: 400;\">() {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">embeddedServer<\/span><\/i><span style=\"font-weight: 400;\">(Netty, <\/span><span style=\"font-weight: 400;\">port = <\/span><span style=\"font-weight: 400;\">8080<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">module = <\/span><span style=\"font-weight: 400;\">Application::module).start(<\/span><span style=\"font-weight: 400;\">wait = <\/span><span style=\"font-weight: 400;\">true<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span>\r\n<span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">Application.<\/span><span style=\"font-weight: 400;\">module<\/span><span style=\"font-weight: 400;\">() {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">install<\/span><\/i><span style=\"font-weight: 400;\">(<\/span><i><span style=\"font-weight: 400;\">Koin<\/span><\/i><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">modules(<\/span><i><span style=\"font-weight: 400;\">appModule<\/span><\/i><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">DatabaseFactory.init()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">install<\/span><\/i><span style=\"font-weight: 400;\">(<\/span><i><span style=\"font-weight: 400;\">ContentNegotiation<\/span><\/i><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><i><span style=\"font-weight: 400;\">json<\/span><\/i><span style=\"font-weight: 400;\">(<\/span><i><span style=\"font-weight: 400;\">Json <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">prettyPrint <\/span><span style=\"font-weight: 400;\">= <\/span><span style=\"font-weight: 400;\">true<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">isLenient <\/span><span style=\"font-weight: 400;\">= <\/span><span style=\"font-weight: 400;\">true<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">ignoreUnknownKeys <\/span><span style=\"font-weight: 400;\">= <\/span><span style=\"font-weight: 400;\">true<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">routing <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><i><span style=\"font-weight: 400;\">userRoutes<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">orderRoutes<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<span style=\"font-weight: 400;\">}\r\n<\/span><\/pre>\n<h2><span style=\"font-weight: 400;\">Routes<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Routes in Ktor is like Controller in Spring Boot<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">UserRoutes<\/span><\/h3>\n<pre><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">Route.<\/span><span style=\"font-weight: 400;\">userRoutes<\/span><span style=\"font-weight: 400;\">() {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">userService <\/span><span style=\"font-weight: 400;\">by <\/span><i><span style=\"font-weight: 400;\">inject<\/span><\/i><span style=\"font-weight: 400;\">&lt;UserService&gt;()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">route<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">\"\/api\/users\"<\/span><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">get <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(userService.getAllUsers())<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">get<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">\"\/{id}\"<\/span><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">id = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\">parameters<\/span><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">\"id\"<\/span><span style=\"font-weight: 400;\">]?.<\/span><i><span style=\"font-weight: 400;\">toLongOrNull<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(id == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">BadRequest<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"Invalid or missing ID\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">@get<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">user = userService.getUser(<\/span><span style=\"font-weight: 400;\">id<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(user == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">NotFound<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"User not found\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/span><span style=\"font-weight: 400;\">else <\/span><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(<\/span><span style=\"font-weight: 400;\">user<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">post <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">user = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.receive&lt;User&gt;()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">savedUser = userService.createUser(user)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">Created<\/span><span style=\"font-weight: 400;\">, savedUser)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">put<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">\"\/{id}\"<\/span><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">id = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\">parameters<\/span><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">\"id\"<\/span><span style=\"font-weight: 400;\">]?.<\/span><i><span style=\"font-weight: 400;\">toLongOrNull<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(id == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">BadRequest<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"Invalid or missing ID\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">@put<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">user = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.receive&lt;User&gt;()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">updatedUser = userService.updateUser(<\/span><span style=\"font-weight: 400;\">id<\/span><span style=\"font-weight: 400;\">, user)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(updatedUser == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">NotFound<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"User not found\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/span><span style=\"font-weight: 400;\">else <\/span><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(<\/span><span style=\"font-weight: 400;\">updatedUser<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">patch<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">\"\/{id}\"<\/span><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">id = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\">parameters<\/span><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">\"id\"<\/span><span style=\"font-weight: 400;\">]?.<\/span><i><span style=\"font-weight: 400;\">toLongOrNull<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(id == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">BadRequest<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"Invalid ID\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">@patch<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">updates = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.receive&lt;PartialUserUpdate&gt;()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">updated = userService.patchUser(<\/span><span style=\"font-weight: 400;\">id<\/span><span style=\"font-weight: 400;\">, updates)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(updated == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">NotFound<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"User not found\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/span><span style=\"font-weight: 400;\">else <\/span><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(<\/span><span style=\"font-weight: 400;\">updated<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">delete<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">\"\/{id}\"<\/span><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">id = <\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\">parameters<\/span><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">\"id\"<\/span><span style=\"font-weight: 400;\">]?.<\/span><i><span style=\"font-weight: 400;\">toLongOrNull<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(id == <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">BadRequest<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"Invalid or missing ID\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">@delete<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">deleted = userService.deleteUser(<\/span><span style=\"font-weight: 400;\">id<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(deleted) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respondText(<\/span><span style=\"font-weight: 400;\">\"User deleted successfully.\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/span><span style=\"font-weight: 400;\">else <\/span><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><i><span style=\"font-weight: 400;\">call<\/span><\/i><span style=\"font-weight: 400;\">.respond(HttpStatusCode.<\/span><span style=\"font-weight: 400;\">NotFound<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">\"User not found\"<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b> \u00a0\u00a0}<\/b>\r\n<span style=\"font-weight: 400;\">}<\/span><\/pre>\n<h2><span style=\"font-weight: 400;\">Tables<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">Users<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Following is equivalent of Spring @Entity in Ktor:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">object <\/span><span style=\"font-weight: 400;\">Users : LongIdTable(<\/span><span style=\"font-weight: 400;\">\"users\"<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">firstName <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"first_name\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">lastName <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"last_name\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">email <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"email\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">120<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">firstLineOfAddress <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"first_line_of_address\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">secondLineOfAddress <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"second_line_of_address\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">).<\/span><i><span style=\"font-weight: 400;\">nullable<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">town <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"town\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">50<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">postCode <\/span><span style=\"font-weight: 400;\">= varchar(<\/span><span style=\"font-weight: 400;\">\"post_code\"<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">length = <\/span><span style=\"font-weight: 400;\">10<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span><\/pre>\n<h2><span style=\"font-weight: 400;\">DAO<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">UserDAO<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Following is equivalent of Spring Repository layer in Ktor:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">class <\/span><span style=\"font-weight: 400;\">UserDAO {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">getAll<\/span><span style=\"font-weight: 400;\">(): List&lt;User&gt; = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">Users.<\/span><i><span style=\"font-weight: 400;\">selectAll<\/span><\/i><span style=\"font-weight: 400;\">().<\/span><i><span style=\"font-weight: 400;\">map <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">toUser(<\/span><b>it<\/b><span style=\"font-weight: 400;\">) <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">getById<\/span><span style=\"font-weight: 400;\">(id: Long): User? = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">Users.<\/span><i><span style=\"font-weight: 400;\">select <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">Users.<\/span><span style=\"font-weight: 400;\">id <\/span><i><span style=\"font-weight: 400;\">eq <\/span><\/i><span style=\"font-weight: 400;\">id <\/span><b>}<\/b><span style=\"font-weight: 400;\">.<\/span><i><span style=\"font-weight: 400;\">map <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">toUser(<\/span><b>it<\/b><span style=\"font-weight: 400;\">) <\/span><b>}<\/b><span style=\"font-weight: 400;\">.<\/span><i><span style=\"font-weight: 400;\">singleOrNull<\/span><\/i><span style=\"font-weight: 400;\">()<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">delete<\/span><span style=\"font-weight: 400;\">(id: Long): Boolean = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">Users.<\/span><i><span style=\"font-weight: 400;\">deleteWhere <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">Users.<\/span><span style=\"font-weight: 400;\">id <\/span><i><span style=\"font-weight: 400;\">eq <\/span><\/i><span style=\"font-weight: 400;\">id <\/span><b>} <\/b><span style=\"font-weight: 400;\">&gt; <\/span><span style=\"font-weight: 400;\">0<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">update<\/span><span style=\"font-weight: 400;\">(id: Long, user: User): User? = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">updatedRows = Users.<\/span><i><span style=\"font-weight: 400;\">update<\/span><\/i><span style=\"font-weight: 400;\">(<\/span><b>{ <\/b><span style=\"font-weight: 400;\">Users.<\/span><span style=\"font-weight: 400;\">id <\/span><i><span style=\"font-weight: 400;\">eq <\/span><\/i><span style=\"font-weight: 400;\">id <\/span><b>}<\/b><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstName<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">firstName<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">lastName<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">lastName<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">email<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">email<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">town<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">town<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">postCode<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">postCode<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">if <\/span><span style=\"font-weight: 400;\">(updatedRows &gt; <\/span><span style=\"font-weight: 400;\">0<\/span><span style=\"font-weight: 400;\">) getById(id) <\/span><span style=\"font-weight: 400;\">else null<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">add<\/span><span style=\"font-weight: 400;\">(user: User): User = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">val <\/span><span style=\"font-weight: 400;\">id = Users.<\/span><i><span style=\"font-weight: 400;\">insert <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstName<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">firstName<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">lastName<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">lastName<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">email<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">email<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">town<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">town<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">postCode<\/span><span style=\"font-weight: 400;\">] = user.<\/span><span style=\"font-weight: 400;\">postCode<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><b>} <\/b><span style=\"font-weight: 400;\">get Users.<\/span><span style=\"font-weight: 400;\">id<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">user.copy(<\/span><span style=\"font-weight: 400;\">id = <\/span><span style=\"font-weight: 400;\">id.<\/span><span style=\"font-weight: 400;\">value<\/span><span style=\"font-weight: 400;\">)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">fun <\/span><span style=\"font-weight: 400;\">patch<\/span><span style=\"font-weight: 400;\">(id: Long, updates: PartialUserUpdate): User? = <\/span><i><span style=\"font-weight: 400;\">transaction <\/span><\/i><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">Users.<\/span><i><span style=\"font-weight: 400;\">update<\/span><\/i><span style=\"font-weight: 400;\">(<\/span><b>{ <\/b><span style=\"font-weight: 400;\">Users.<\/span><span style=\"font-weight: 400;\">id <\/span><i><span style=\"font-weight: 400;\">eq <\/span><\/i><span style=\"font-weight: 400;\">id <\/span><b>}<\/b><span style=\"font-weight: 400;\">) <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">firstName<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">f <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstName<\/span><span style=\"font-weight: 400;\">] = f <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">lastName<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">l <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">lastName<\/span><span style=\"font-weight: 400;\">] = l <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">email<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">e <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">email<\/span><span style=\"font-weight: 400;\">] = e <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">f <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span><span style=\"font-weight: 400;\">] = f <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">s <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span><span style=\"font-weight: 400;\">] = s <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">town<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">t <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">town<\/span><span style=\"font-weight: 400;\">] = t <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">updates.<\/span><span style=\"font-weight: 400;\">postCode<\/span><span style=\"font-weight: 400;\">?.<\/span><i><span style=\"font-weight: 400;\">let <\/span><\/i><b>{ <\/b><span style=\"font-weight: 400;\">p <\/span><b>-&gt; it<\/b><span style=\"font-weight: 400;\">[<\/span><span style=\"font-weight: 400;\">postCode<\/span><span style=\"font-weight: 400;\">] = p <\/span><b>}<\/b>\r\n<b> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/b>\r\n<b>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">getById(id)<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><b>}<\/b>\r\n\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">private fun <\/span><span style=\"font-weight: 400;\">toUser<\/span><span style=\"font-weight: 400;\">(row: ResultRow) = User(<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">id = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">id<\/span><span style=\"font-weight: 400;\">].<\/span><span style=\"font-weight: 400;\">value<\/span><span style=\"font-weight: 400;\">,<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">firstName = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">firstName<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">lastName = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">lastName<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">email = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">email<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">firstLineOfAddress = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">firstLineOfAddress<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">secondLineOfAddress = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">secondLineOfAddress<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">town = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">town<\/span><span style=\"font-weight: 400;\">],<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">postCode = <\/span><span style=\"font-weight: 400;\">row[Users.<\/span><span style=\"font-weight: 400;\">postCode<\/span><span style=\"font-weight: 400;\">]<\/span>\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0)<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span><\/pre>\n<h2><span style=\"font-weight: 400;\">Dependency Injection<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Ktor&#8217;s way of defining singletons are<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">val <\/span><i><span style=\"font-weight: 400;\">appModule <\/span><\/i><span style=\"font-weight: 400;\">= <\/span><span style=\"font-weight: 400;\">module <\/span><b>{<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">single <\/span><b>{ <\/b><span style=\"font-weight: 400;\">UserDAO() <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">single <\/span><b>{ <\/b><span style=\"font-weight: 400;\">OrderDAO() <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">single&lt;UserService&gt; <\/span><b>{ <\/b><span style=\"font-weight: 400;\">UserServiceImpl(get()) <\/span><b>}<\/b>\r\n<b>\u00a0\u00a0\u00a0<\/b><span style=\"font-weight: 400;\">single&lt;OrderService&gt; <\/span><b>{ <\/b><span style=\"font-weight: 400;\">OrderServiceImpl(get()) <\/span><b>}<\/b>\r\n<b>}<\/b><\/pre>\n<h2><span style=\"font-weight: 400;\">Ktor vs Spring Boot Comparison Summary<\/span><\/h2>\n<table>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Feature<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Spring Boot<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Ktor\u00a0<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Use Case<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Enterprise app, APIs, monoliths, microservices<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Lightweight APIs, microservices, Kotlin-first apps<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">EcoSystem<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Mature, large ecosystem<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Smaller but growing<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Server startup<\/span><\/td>\n<td><span style=\"font-weight: 400;\">SpringApplication.run(&#8230;)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">embeddedServer(Netty, &#8230;)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Dependency Injection<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Annotations (@Service, @Autowired,@Bean)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">install(Koin) { modules(&#8230;) }<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Serialization\/JSON setup<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Auto-configured with Jackson<\/span><\/td>\n<td><span style=\"font-weight: 400;\">install(ContentNegotiation) { json(&#8230;) }<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Database and ORM<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Auto via Spring Data JPA\/Hibernate\u00a0 @Bean configs.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CrudRepositorry, JpaRepository, Query<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Exposed, Manual via Database.connect(&#8230;)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Exposed DAO pattern<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Routing<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Controllers using @RequestController, @RequestMapping<\/span><\/td>\n<td><span style=\"font-weight: 400;\">routing {\u00a0 get(&#8230;) } DSL<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Security<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Spring Security<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Ktor Auth plugin(basic, JWT, OAuth2 etc)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Testing<\/span><\/td>\n<td><span style=\"font-weight: 400;\">@SpringBootTest, @MockMvc,@WebTestClientJUnit, Mockito, AssertJ<\/span><\/td>\n<td><span style=\"font-weight: 400;\">testApplication { \u2026 }<\/span><\/p>\n<p><span style=\"font-weight: 400;\">JUnit, Kotest, MockK<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span style=\"font-weight: 400;\">Code location<\/span><\/h2>\n<p>https:\/\/github.com\/ranjesh1\/ktor-rest-order\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview Ktor is an open source framework\u00a0 built by JetBrains for building asynchronous servers and clients in Kotlin. Ktor offers: Lightweight, minimal, fast startup Kotlin -first and coroutines Interoperable with Java Tooling support- tight integration with Intellij IDEA Fast Growing ecosystem Supports Microservices, APIs, serverless Cleaner Kotlin DSLs Introduction In this article, we will show &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ranjeshviswa.com\/?p=199\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Ktor for Spring Boot Developers&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":204,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,26,13,28,8,4],"tags":[],"_links":{"self":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/199"}],"collection":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=199"}],"version-history":[{"count":6,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions"}],"predecessor-version":[{"id":206,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions\/206"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/media\/204"}],"wp:attachment":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}