{"id":5267,"date":"2018-06-11T03:01:59","date_gmt":"2018-06-11T10:01:59","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5267"},"modified":"2023-07-20T14:48:34","modified_gmt":"2023-07-20T21:48:34","slug":"kotlin-spring-boot-spring-data","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/kotlin-spring-boot-spring-data\/","title":{"rendered":"\ucf54\ud2c0\ub9b0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc0f \uc2a4\ud504\ub9c1 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud55c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4"},"content":{"rendered":"<p>\uc791\ub144\uc5d0 \uc800\ub294 Kotlin\uc744 \ubc30\uc6b0\uae30 \uc2dc\uc791\ud558\uba74\uc11c Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubcc0\ud658\ud558\ub294 \uac83\uc774 \uc5bc\ub9c8\ub098 \uc26c\uc6b4\uc9c0 \ub180\ub790\uc2b5\ub2c8\ub2e4. IntelliJ\uc640 \uba87 \uac00\uc9c0 \ub2e4\ub978 IDE\ub294 \uc790\ub3d9 \ubcc0\ud658\uc744 \uc704\ud55c \ud6cc\ub96d\ud55c \ub3c4\uad6c\ub97c \uc81c\uacf5\ud558\uba70, \uba87 \uac00\uc9c0 \uc870\uc815\ub9cc \ud558\uba74 \ud6e8\uc52c \uac04\uacb0\ud558\uace0 \uc624\ub958\uac00 \uc801\uc740 \ucf54\ub4dc\ub97c \uc644\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5268\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-1024x252.png\" alt=\"\" width=\"721\" height=\"177\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-1024x252.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-300x74.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-768x189.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM.png 1120w\" sizes=\"auto, (max-width: 721px) 100vw, 721px\" \/><\/p>\n<p>\uadf8\ub798\uc11c \uc81c\uac00 \uac00\uc7a5 \uc88b\uc544\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc870\ud569\uc744 \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uc0d8\ud50c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4: Kotlin\uc785\ub2c8\ub2e4, <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-spring-boot-spring-data\/\">\uc2a4\ud504\ub9c1 \ubd80\ud2b8, \uc2a4\ud504\ub9c1 \ub370\uc774\ud130, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a>:<\/p>\n<h2><strong>\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544 \uc11c\ube44\uc2a4 \ub9cc\ub4e4\uae30 <\/strong><\/h2>\n<p>\uc5ec\uae30\uc5d0\uc11c \uc804\uccb4 \ud504\ub85c\uc81d\ud2b8\ub97c \ubcf5\uc81c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<p><a href=\"https:\/\/github.com\/couchbaselabs\/try-cb-kotlin\">https:\/\/github.com\/couchbaselabs\/try-cb-kotlin<\/a><\/p>\n<p>\uba54\uc778 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4dc\ub294 \uac83\ubd80\ud130 \uc2dc\uc791\ud558\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@SpringBootApplication\r\nopen class KotlinDemoApplication\r\n\r\nfun main(args: Array&lt;String&gt;) {\r\n    SpringApplication.run(KotlinDemoApplication::class.java, *args)\r\n}<\/pre>\n<p><strong>\u00a0\ucc38\uace0:<\/strong> \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc544\uc57c \ud569\ub2c8\ub2e4. <strong>\uc5f4\uae30<\/strong> \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'KotlinDemoApplication' may not be final. Remove the final modifier to continue.\r\nOffending resource: com.couchbase.KotlinDemoApplication\r\n\tat org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]\r\n\tat org.springframework.context.annotation.ConfigurationClass.validate(ConfigurationClass.java:214) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 \uc0ac\uc6a9\uc790 \uc5d4\ud2f0\ud2f0\ub85c, \ub2e4\uc74c\uacfc \ub9e4\uc6b0 \uc720\uc0ac\ud569\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/couchbaselabs\/kubernetes-starter-kit\/blob\/master\/src\/main\/java\/com\/cb\/springdata\/sample\/entities\/User.java\">\uc790\ubc14<\/a>:<\/p>\n<pre class=\"lang:default decode:true\">@Document\r\nclass User(): BasicEntity() {\r\n\r\n    constructor(id: String,\r\n                name: String,\r\n                address: Address,\r\n                preferences: List&lt;Preference&gt;,\r\n                securityRoles: List&lt;String&gt;): this(){\r\n\r\n        this.id = id;\r\n        this.name = name;\r\n        this.address = address;\r\n        this.preferences = preferences;\r\n        this.securityRoles = securityRoles;\r\n    }\r\n\r\n    @Id\r\n    var id: String? = null\r\n\r\n    @NotNull\r\n    var name: String? = null\r\n\r\n    @Field\r\n    var address: Address? = null\r\n\r\n    @Field\r\n    var preferences: List&lt;Preference&gt; = emptyList()\r\n\r\n    @Field\r\n    var securityRoles: List&lt;String&gt; = emptyList()\r\n}<\/pre>\n<ul>\n<li><strong>@Document:\u00a0<\/strong>\uc5d4\ud2f0\ud2f0\ub97c \uc815\uc758\ud558\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \uc5b4\ub178\ud14c\uc774\uc158\uc740 \ub2e4\uc74c\uacfc \uc720\uc0ac\ud569\ub2c8\ub2e4.\u00a0<strong><em>\uc5d4\ud2f0\ud2f0<\/em><\/strong>\u00a0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub294 \uc790\ub3d9\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \ud504\ub85c\ud37c\ud2f0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.\u00a0<strong><em>_class<\/em><\/strong>\u00a0\ub97c \ubb38\uc11c\uc5d0 \ucd94\uac00\ud558\uc5ec \ubb38\uc11c \uc720\ud615\uc73c\ub85c \uc0ac\uc6a9\ud558\uc138\uc694.<\/li>\n<li><strong>@Id:\u00a0<\/strong>\ubb38\uc11c\uc758 \ud575\uc2ec<\/li>\n<li><strong>@Field:<\/strong>\u00a0JPA\uc758 \uc8fc\uc11d\uacfc \uc720\uc0ac\ud55c Couchbase\uc758 \uc8fc\uc11d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\u00a0<strong><em>\uce7c\ub7fc<\/em><\/strong>. \uc774 \uae30\ub2a5\uc740 \ud544\uc218\ub294 \uc544\ub2c8\uc9c0\ub9cc \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>Couchbase\uc5d0\uc11c \uc5b4\ud2b8\ub9ac\ubdf0\ud2b8 \ub9e4\ud551\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud569\ub2c8\ub2e4. JSON\uc758 \ud574\ub2f9 \uad6c\uc870\uc5d0 \uc9c1\uc811 \ub9e4\ud551\ub429\ub2c8\ub2e4:<\/p>\n<ul>\n<li><strong>\uac04\ub2e8\ud55c \uc18d\uc131:<\/strong> JSON\uc73c\ub85c \uac04\ub2e8\ud558\uac8c \ub9e4\ud551\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/li>\n<\/ul>\n<pre class=\"lang:js decode:true\">{\r\n \"id\": \"user::1\",\r\n \"name\": \"Denis Rosa\"\r\n}<\/pre>\n<ul>\n<li><strong>\ubc30\uc5f4: <\/strong>\uc608\uc0c1\ud560 \uc218 \uc788\ub4ef\uc774 \ub2e4\uc74c\uacfc \uac19\uc740 \ubc30\uc5f4\uc740 <strong>\ubcf4\uc548 \uc5ed\ud560<\/strong> \uc740 JSON \ubc30\uc5f4\ub85c \ubcc0\ud658\ub429\ub2c8\ub2e4:<strong>\u00a0<\/strong><\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">{\r\n \"securityRoles\": [\"admin\", \"user\"]\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li><strong>\uc911\ucca9\ub41c \uc5d4\ud2f0\ud2f0:<\/strong> \ub9e4\ud551\uc744 \uc2eb\uc5b4\ud558\uc2dc\ub098\uc694? <strong>@ManyToOne<\/strong> \uad00\uacc4\uc5d0 \ub300\ud574 \uace0\ubbfc\ud558\uc2dc\ub098\uc694? \uc800\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4. \ubb38\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc73c\ubbc0\ub85c \ub354 \uc774\uc0c1 \uc774\ub7ec\ud55c \uad00\uacc4\ub97c \uc791\uc131\ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70 \uc911\ucca9\ub41c \uc5d4\ud2f0\ud2f0\ub3c4 JSON\uc73c\ub85c \uc9c1\uc811 \ubcc0\ud658\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">{  \r\n   \"id\":\"user::1\",\r\n   \"name\":\"Denis Rosa\",\r\n   \"address\":{  \r\n      \"streetName\":\"A Street Somewhere\",\r\n      \"houseNumber\":\"42\",\r\n      \"postalCode\":\"81234\",\r\n      \"city\":\"Munich\",\r\n      \"country\":\"DE\"\r\n   },\r\n   \"preferences\":[  \r\n      {  \r\n         \"name\":\"lang\",\r\n         \"value\":\"EN\"\r\n      }\r\n   ],\r\n   \"securityRoles\":[  \r\n      \"admin\",\r\n      \"user\"\r\n   ]\r\n}<\/pre>\n<h2><strong>\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac<\/strong><\/h2>\n<p>\uc774\uc81c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uac00 \uc5b4\ub5a4 \ubaa8\uc2b5\uc77c\uc9c0 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@N1qlPrimaryIndexed\r\n@ViewIndexed(designDoc = \"user\")\r\ninterface UserRepository : CouchbasePagingAndSortingRepository&lt;User, String&gt; {\r\n\r\n    fun findByName(name: String): List&lt;User&gt;\r\n\r\n    @Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and ANY preference IN \" + \" preferences SATISFIES preference.name = $1 END\")\r\n    fun findUsersByPreferenceName(name: String): List&lt;User&gt;\r\n\r\n    @Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and meta().id = $1 and ARRAY_CONTAINS(securityRoles, $2)\")\r\n    fun hasRole(userId: String, role: String): User\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li><strong>@N1qlPrimaryIndexed<\/strong>: \uc774\u00a0<a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/current\/api\/index.html?org\/springframework\/data\/couchbase\/core\/query\/N1qlPrimaryIndexed.html\">\uc8fc\uc11d\u00a0<\/a>\ub294 \ud604\uc7ac \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc640 \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc5d0 N1QL \uae30\ubcf8 \uc778\ub371\uc2a4\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>@ViewIndexed: \u00a0<\/strong>\uc774\u00a0<a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/current\/api\/index.html?org\/springframework\/data\/couchbase\/core\/query\/ViewIndexed.html\">\uc8fc\uc11d\u00a0<\/a>\ub97c \uc0ac\uc6a9\ud558\uba74 \ub514\uc790\uc778 \ubb38\uc11c\uc758 \uc774\ub984\uacfc \ubcf4\uae30 \uc774\ub984\uc740 \ubb3c\ub860 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub9f5\uacfc \ucd95\uc18c \uae30\ub2a5\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc544\ub798\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774 \ub2e4\uc74c\uacfc \uac19\uc774 \ubaa8\ub4e0\u00a0<a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/current\/reference\/html\/#couchbase.repository.querying\">Spring \ub370\uc774\ud130 \ud0a4\uc6cc\ub4dc<\/a>\u00a0\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\u00a0<strong><em>FindBy<\/em><\/strong>,\u00a0<strong><em>\uc0ac\uc774<\/em><\/strong>,\u00a0<strong><em>IsGreaterThan<\/em><\/strong>,\u00a0 <strong><em>\uc88b\uc544\uc694<\/em><\/strong>, <strong><em>\uc874\uc7ac<\/em><\/strong>\ub4f1<\/p>\n<pre class=\"lang:default decode:true\">    fun findByName(name: String): List&lt;User&gt;<\/pre>\n<p>\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uac00 \ud655\uc7a5 \uc911\uc785\ub2c8\ub2e4.\u00a0<strong><em>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ud398\uc774\uc9d5 \ubc0f \uc815\ub82c \uc800\uc7a5\uc18c<\/em><\/strong>\ub97c \ucd94\uac00\ud558\uc5ec \ucffc\ub9ac\uc758 \ud398\uc774\uc9c0 \ub9e4\uae40\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\u00a0<strong><em>\ud398\uc774\uc9c0 \uac00\ub2a5<\/em><\/strong>\u00a0\ub9e4\uac1c\ubcc0\uc218\ub97c \ucd94\uac00\ud558\uc138\uc694. \ub354 \uac15\ub825\ud55c \ucffc\ub9ac\ub97c \uc791\uc131\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 N1QL\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">    @Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and ANY preference IN \" + \" preferences SATISFIES preference.name = $1 END\")\r\n    fun findUsersByPreferenceName(name: String): List&lt;User&gt;\r\n\r\n    @Query(\"#{#n1ql.selectEntity} where #{#n1ql.filter} and meta().id = $1 and ARRAY_CONTAINS(securityRoles, $2)\")\r\n    fun hasRole(userId: String, role: String): User<\/pre>\n<p>\uc704\uc758 \ucffc\ub9ac\uc5d0\ub294 \ub354 \uc791\uac8c \ub9cc\ub4e4\uae30 \uc704\ud574 \uba87 \uac00\uc9c0 \uad6c\ubb38 \uc124\ud0d5\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li><strong>#(#n1ql.bucket):\u00a0<\/strong><span style=\"font-style: inherit\">\uc774 \uad6c\ubb38\uc744 \uc0ac\uc6a9\ud558\uba74 \ucffc\ub9ac\uc5d0\uc11c \ubc84\ud0b7 \uc774\ub984\uc744 \ud558\ub4dc\ucf54\ub529\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.<\/span><\/li>\n<li><strong>#{#n1ql.selectEntity}:\u00a0<\/strong>\uad6c\ubb38-\uc124\ud0d5\uc5d0\u00a0<strong><em>SELECT * FROM #(#n1ql.bucket)<\/em><\/strong><strong>:<\/strong><\/li>\n<li><strong style=\"font-style: inherit\">#{#n1ql.filter}:\u00a0<\/strong><span style=\"font-style: inherit\">\uad6c\ubb38-\uc124\ud0d5\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubb38\uc11c\ub97c \uc720\ud615\ubcc4\ub85c \ud544\ud130\ub9c1\ud558\ub294 \uac83\uc740 \uc5c4\ubc00\ud788 \ub9d0\ud558\uba74\u00a0<\/span><strong style=\"font-style: inherit\"><em>class = 'myPackage.MyClassName'<\/em><\/strong><em><span style=\"font-style: inherit\">\u00a0(<\/span><strong style=\"font-style: inherit\"><span style=\"font-style: inherit\">_class<\/span><\/strong><\/em>\u00a0\ub294 \uc2a4\ud504\ub9c1 \ub370\uc774\ud130\uc5d0\uc11c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub85c \uc791\uc5c5\ud560 \ub54c \ubb38\uc11c\uc5d0 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ub418\uc5b4 \uc720\ud615\uc744 \uc815\uc758\ud558\ub294 \uc5b4\ud2b8\ub9ac\ubdf0\ud2b8\uc785\ub2c8\ub2e4.)<\/li>\n<li><strong>#{#n1ql.fields}\u00a0<\/strong>\ub294 \uc5d4\ud2f0\ud2f0\ub97c \uc7ac\uad6c\uc131\ud558\ub294 \ub370 \ud544\uc694\ud55c \ud544\ub4dc \ubaa9\ub85d(\uc608: SELECT \uc808\uc758 \uacbd\uc6b0)\uc73c\ub85c \ub300\uccb4\ub429\ub2c8\ub2e4.<\/li>\n<li><strong>#{#n1ql.delete}\u00a0<\/strong><span style=\"font-style: inherit\">\ub294 \ub2e4\uc74c\uc5d0\uc11c \uc0ad\uc81c \ubb38\uc73c\ub85c \ub300\uccb4\ub429\ub2c8\ub2e4.<\/span><\/li>\n<li><strong>#{#n1ql.\ubc18\ud658}\u00a0<\/strong><span style=\"font-style: inherit\">\ub294 \uc5d4\ud2f0\ud2f0 \uc7ac\uad6c\uc131\uc5d0 \ud544\uc694\ud55c \ubc18\ud658 \uc808\ub85c \ub300\uccb4\ub429\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<h2><strong>\uc11c\ube44\uc2a4<\/strong><\/h2>\n<p>\uc800\ud76c \uc11c\ube44\uc2a4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc694\uccad\uc744 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub85c \uc804\ub2ec\ud558\uc9c0\ub9cc, \uc784\uc2dc \ucffc\ub9ac\ub97c \uc791\uc131\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc5ec\uae30\ub85c \uc624\uc138\uc694:<\/p>\n<pre class=\"lang:default decode:true\">@Service\r\nclass UserService {\r\n\r\n    @Autowired\r\n    lateinit var userRepository: UserRepository;\r\n\r\n    fun findByName(name: String): List&lt;User&gt; = userRepository.findByName(name)\r\n\r\n    fun findById(userId: String) = userRepository.findOne(userId)\r\n\r\n    fun save(@Valid user: User) = userRepository.save(user)\r\n\r\n    fun findUsersByPreferenceName(name: String): List&lt;User&gt; = userRepository.findUsersByPreferenceName(name)\r\n\r\n    fun hasRole(userId: String, role: String): Boolean {\r\n        return userRepository.hasRole(userId, role) != null\r\n    }\r\n\r\n    \/**\r\n     * Example of ad hoc queries\r\n     *\/\r\n    fun findUserByAddress(streetName: String = \"\", number: String = \"\", postalCode: String = \"\",\r\n                          city: String = \"\", country: String = \"\"): List&lt;User&gt; {\r\n\r\n        var query = \"SELECT meta(b).id as id, b.* FROM \" + getBucketName() + \" b WHERE  b._class = '\" + User::class.java.getName() + \"' \"\r\n\r\n        if (!streetName.isNullOrBlank()) query += \" and b.address.streetName = '$streetName' \"\r\n\r\n        if (!number.isNullOrBlank()) query += \" and b.address.houseNumber = '$number' \"\r\n\r\n        if (!postalCode.isNullOrBlank()) query += \" and b.address.postalCode = '$postalCode' \"\r\n\r\n        if (!city.isNullOrBlank()) query += \" and b.address.city = '$city' \"\r\n\r\n        if (!country.isNullOrBlank()) query += \" and b.address.country = '$country' \"\r\n\r\n        val params = N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS).adhoc(true)\r\n        val paramQuery = N1qlQuery.parameterized(query, JsonObject.create(), params)\r\n        return userRepository.getCouchbaseOperations().findByN1QLProjection(paramQuery, User::class.java)\r\n    }\r\n\r\n    fun getBucketName() = userRepository.getCouchbaseOperations().getCouchbaseBucket().bucketManager().info().name()\r\n}<\/pre>\n<h2><strong>\ucee8\ud2b8\ub864\ub7ec<\/strong><\/h2>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ud734\uc2dd\uc744 \ud1b5\ud574 \uc11c\ube44\uc2a4\ub97c \ud14c\uc2a4\ud2b8\ud560 \ucee8\ud2b8\ub864\ub7ec\ub3c4 \ucd94\uac00\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@RestController\r\n@RequestMapping(\"\/api\/user\")\r\nclass UserController {\r\n\r\n    @Autowired\r\n    lateinit var userService: UserService\r\n\r\n    @GetMapping(value = \"\/{id}\")\r\n    fun findById(@PathParam(\"id\") id: String) = userService.findById(id)\r\n\r\n\r\n    @GetMapping(value = \"\/preference\")\r\n    fun findPreference(@RequestParam(\"name\") name: String): List&lt;User&gt; {\r\n        return userService.findUsersByPreferenceName(name)\r\n    }\r\n\r\n    @GetMapping(value = \"\/find\")\r\n    fun findUserByName(@RequestParam(\"name\") name: String): List&lt;User&gt; {\r\n        return userService.findByName(name)\r\n    }\r\n\r\n    @PostMapping(value = \"\/save\")\r\n    fun findUserByName(@RequestBody user: User) = userService.save(user)\r\n\r\n    @GetMapping(value = \"\/findByAddress\")\r\n    fun findByAddress(@RequestParam(\"streetName\", defaultValue = \"\") streetName: String,\r\n                      @RequestParam(\"number\", defaultValue = \"\") number: String,\r\n                      @RequestParam(\"postalCode\", defaultValue = \"\") postalCode: String,\r\n                      @RequestParam(\"city\", defaultValue = \"\") city: String,\r\n                      @RequestParam(\"country\", defaultValue = \"\") country: String): List&lt;User&gt; {\r\n        return userService.findUserByAddress(streetName, number, postalCode, city, country);\r\n    }\r\n\r\n}<\/pre>\n<h2><strong>Kotlin\uc73c\ub85c \ud1b5\ud569 \ud14c\uc2a4\ud2b8 \uc791\uc131<\/strong><\/h2>\n<p>\ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc62c\ubc14\ub974\uac8c \uc2e4\ud589\ud558\ub824\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uc790\uaca9 \uc99d\uba85\uc744 \ub2e4\uc74c\uc5d0\uc11c \uad6c\uc131\ud558\ub294 \uac83\uc744 \uc78a\uc9c0 \ub9c8\uc138\uc694. <strong>application.properties<\/strong> file:<\/p>\n<pre class=\"lang:default decode:true\">spring.couchbase.bootstrap-hosts=localhost\r\nspring.couchbase.bucket.name=test\r\nspring.couchbase.bucket.password=somePassword\r\nspring.data.couchbase.auto-index=true<\/pre>\n<p>\uc5ec\uae30\uc5d0\uc11c \ud14c\uc2a4\ud2b8\uac00 \uc5b4\ub5bb\uac8c \uc9c4\ud589\ub418\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@Test\r\n    fun testComposedAddress() {\r\n        val address1 = Address(\"street1\", \"1\", \"0000\", \"santo andre\", \"br\")\r\n        val address2 = Address(\"street1\", \"2\", \"0000\", \"santo andre\", \"br\")\r\n        val address3 = Address(\"street2\", \"12\", \"1111\", \"munich\", \"de\")\r\n\r\n        userService.save(User(USER_1, \"user1\", address1, emptyList(), emptyList()))\r\n        userService.save(User(\"user::2\", \"user2\", address2, emptyList(), emptyList()))\r\n        userService.save(User(\"user::3\", \"user3\", address3, emptyList(), emptyList()))\r\n\r\n        var users = userService.findUserByAddress(streetName = \"street1\")\r\n        assertThat(users, hasSize&lt;Any&gt;(2))\r\n\r\n        users = userService.findUserByAddress(streetName = \"street1\", number=  \"1\")\r\n        assertThat(users, hasSize&lt;Any&gt;(1))\r\n\r\n        users = userService.findUserByAddress(country = \"de\")\r\n        assertThat(users, hasSize&lt;Any&gt;(1))\r\n    }<\/pre>\n<h3><strong>Kotlin \ubc0f Maven \uc885\uc18d\uc131<\/strong><\/h3>\n<p>Kotlin\uc740 \ube60\ub974\uac8c \ubc1c\uc804\ud558\uace0 \uc788\uc73c\ubbc0\ub85c \uac01 \uc885\uc18d \uc694\uc18c\uc758 \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:xhtml decode:true\">    &lt;dependencies&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-stdlib-jdk8&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.2.41&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-reflect&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.2.41&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;com.fasterxml.jackson.module&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;jackson-module-kotlin&lt;\/artifactId&gt;\r\n            &lt;version&gt;2.9.5&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-data-couchbase&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-data-rest&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\r\n            &lt;scope&gt;test&lt;\/scope&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.hamcrest&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;hamcrest-library&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.3&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.data&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-data-couchbase&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-stdlib-jdk8&lt;\/artifactId&gt;\r\n            &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-test&lt;\/artifactId&gt;\r\n            &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n            &lt;scope&gt;test&lt;\/scope&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-maven-allopen&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.2.41&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;<\/pre>\n<p>\uc804\uccb4 \ub0b4\uc6a9\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>pom.xml<\/strong> <a href=\"https:\/\/github.com\/couchbaselabs\/try-cb-kotlin\/blob\/master\/pom.xml\">\uc5ec\uae30<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Last year I started learning Kotlin and I was surprised at how easy it was to convert a Java application. IntelliJ and a few other IDEs offer nice tools for automatic conversion, and with a few adjustments you can end [&hellip;]<\/p>","protected":false},"author":8754,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815],"tags":[],"ppma_author":[9059],"class_list":["post-5267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase with Kotlin, Spring Boot and Spring Data<\/title>\n<meta name=\"description\" content=\"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/kotlin-spring-boot-spring-data\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase with Kotlin, Spring Boot and Spring Data\" \/>\n<meta property=\"og:description\" content=\"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/kotlin-spring-boot-spring-data\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-11T10:01:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-20T21:48:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-1024x252.png\" \/>\n<meta name=\"author\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@deniswsrosa\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/\"},\"author\":{\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\"},\"headline\":\"Couchbase with Kotlin, Spring Boot and Spring Data\",\"datePublished\":\"2018-06-11T10:01:59+00:00\",\"dateModified\":\"2023-07-20T21:48:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/\"},\"wordCount\":602,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/\",\"name\":\"Couchbase with Kotlin, Spring Boot and Spring Data\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-06-11T10:01:59+00:00\",\"dateModified\":\"2023-07-20T21:48:34+00:00\",\"description\":\"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase with Kotlin, Spring Boot and Spring Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\",\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"caption\":\"Denis Rosa, Developer Advocate, Couchbase\"},\"description\":\"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.\",\"sameAs\":[\"https:\/\/x.com\/deniswsrosa\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/denis-rosa\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\ucf54\ud2c0\ub9b0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc0f \uc2a4\ud504\ub9c1 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud55c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","description":"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/kotlin-spring-boot-spring-data\/","og_locale":"ko_KR","og_type":"article","og_title":"Couchbase with Kotlin, Spring Boot and Spring Data","og_description":"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/kotlin-spring-boot-spring-data\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-06-11T10:01:59+00:00","article_modified_time":"2023-07-20T21:48:34+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-04-at-10.34.39-PM-1024x252.png","type":"","width":"","height":""}],"author":"Denis Rosa, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@deniswsrosa","twitter_misc":{"Written by":"Denis Rosa, Developer Advocate, Couchbase","Est. reading time":"3\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/"},"author":{"name":"Denis Rosa, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257"},"headline":"Couchbase with Kotlin, Spring Boot and Spring Data","datePublished":"2018-06-11T10:01:59+00:00","dateModified":"2023-07-20T21:48:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/"},"wordCount":602,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Application Design","Best Practices and Tutorials"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/","url":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/","name":"\ucf54\ud2c0\ub9b0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubc0f \uc2a4\ud504\ub9c1 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud55c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-06-11T10:01:59+00:00","dateModified":"2023-07-20T21:48:34+00:00","description":"See how easy it is to convert a Java application. Check out how to create a sample application using: Kotlin, Spring Boot, Spring Data, and Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/kotlin-spring-boot-spring-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase with Kotlin, Spring Boot and Spring Data"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257","name":"\ub370\ub2c8\uc2a4 \ub85c\uc0ac, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6","url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","caption":"Denis Rosa, Developer Advocate, Couchbase"},"description":"\ub370\ub2c8\uc2a4 \ub85c\uc0ac\ub294 \ub3c5\uc77c \ubb8c\ud5e8\uc5d0 \uac70\uc8fc\ud558\uace0 \uc788\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\ub85c\uc11c \ud0c4\ud0c4\ud55c \uacbd\ub825\uc744 \uc313\uc558\uc73c\uba70 Java, Python, Scala, Javascript\ub97c \uc720\ucc3d\ud558\uac8c \uad6c\uc0ac\ud569\ub2c8\ub2e4. Denis\ub294 \uac80\uc0c9, \ube45 \ub370\uc774\ud130, AI, \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ubc0f \uac1c\ubc1c\uc790\uac00 \uc544\ub984\ub2f5\uace0 \ube60\ub974\uace0 \uc548\uc815\uc801\uc774\uba70 \ud655\uc7a5 \uac00\ub2a5\ud55c \uc571\uc744 \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \ubaa8\ub4e0 \uac83\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\ub294 \uac83\uc744 \uc88b\uc544\ud569\ub2c8\ub2e4.","sameAs":["https:\/\/x.com\/deniswsrosa"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/denis-rosa\/"}]}},"authors":[{"term_id":9059,"user_id":8754,"is_guest":0,"slug":"denis-rosa","display_name":"Denis Rosa, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","author_category":"","last_name":"Rosa, Developer Advocate, Couchbase","first_name":"Denis","job_title":"","user_url":"","description":"\ub370\ub2c8\uc2a4 \ub85c\uc0ac\ub294 \ub3c5\uc77c \ubb8c\ud5e8\uc5d0 \uac70\uc8fc\ud558\uace0 \uc788\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\ub85c\uc11c \ud0c4\ud0c4\ud55c \uacbd\ub825\uc744 \uc313\uc558\uc73c\uba70 Java, Python, Scala, Javascript\ub97c \uc720\ucc3d\ud558\uac8c \uad6c\uc0ac\ud569\ub2c8\ub2e4. Denis\ub294 \uac80\uc0c9, \ube45 \ub370\uc774\ud130, AI, \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ubc0f \uac1c\ubc1c\uc790\uac00 \uc544\ub984\ub2f5\uace0 \ube60\ub974\uace0 \uc548\uc815\uc801\uc774\uba70 \ud655\uc7a5 \uac00\ub2a5\ud55c \uc571\uc744 \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \ubaa8\ub4e0 \uac83\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\ub294 \uac83\uc744 \uc88b\uc544\ud569\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/8754"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=5267"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5267\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=5267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=5267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=5267"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=5267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}