{"id":9720,"date":"2021-08-25T00:00:09","date_gmt":"2021-08-25T07:00:09","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=9720"},"modified":"2025-06-13T23:34:39","modified_gmt":"2025-06-14T06:34:39","slug":"n1ql-user-defined-functions","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/n1ql-user-defined-functions\/","title":{"rendered":"\uc774\uc81c N1QL\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218 \uc9c0\uc6d0"},"content":{"rendered":"<p><strong>\uc120\uc5b8\uc801 \ucffc\ub9ac \uc5b8\uc5b4\uac00 \ud070 \ubcc0\ud654\ub97c \uac00\uc838\uc654\uc2b5\ub2c8\ub2e4.<\/strong> \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5d4\uc9c4\uc758 \uc138\uacc4\uc5d0\uc11c.<\/p>\n<p>\uadf8\ub9ac\uace0 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/sqlplusplus\/?ref=blog\" target=\"_blank\" rel=\"noopener\">SQL++ \ucffc\ub9ac \uc5b8\uc5b4<\/a> (\uc774\uc804\uc758 N1QL)\uc740 \uc8fc\ub85c \uc120\uc5b8\uc801 \ucffc\ub9ac \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \ucffc\ub9ac\uc5d0 \ubb34\uc5c7\uc744 \uac00\uc838\uc62c\uc9c0 \uc54c\ub824\uc8fc\uba74 N1QL\uc740 \uc774\ub97c \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \ub098\uba38\uc9c0 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc54c\uc544\uc11c \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucffc\ub9ac\ub97c \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc73c\ub85c \uc9c0\uc2dc\ud558\ub294 \uae30\ub2a5\uc740 \uc5ec\ub7ec \uc0c1\ud669\uc5d0\uc11c \uc720\uc6a9\ud569\ub2c8\ub2e4. \uacb0\uad6d, \uc5ec\ub7ec\ubd84\uc740 \uc790\uc2e0\uc758 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc54c\uace0 \uc788\uc9c0\ub9cc N1QL\uc740 \uadf8\ub807\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc785\ub825 <em>\uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218(UDF)<\/em>. UDF\ub97c \uc0ac\uc6a9\ud558\uba74 \ud2b9\uc815 \ucffc\ub9ac\ub97c \ub354 \uc798 \uc81c\uc5b4\ud560 \uc218 \uc788\uace0 \ud2b9\uc815 \uc791\uc5c5\uc774 \uc218\ud589\ub418\ub294 \ubc29\uc2dd\uc744 \ucffc\ub9ac \uc5b8\uc5b4\uc5d0 \uc9c0\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-server-7-0-release\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Couchbase Server 7.0 \ub9b4\ub9ac\uc2a4<\/a> \uc5d0\ub294 N1QL \ucffc\ub9ac \uc5b8\uc5b4\uc5d0 \ub300\ud55c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>N1QL\uc740 \uae30\ubcf8 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0 \uad00\ud574\uc11c\ub294 \ub2e4\uc18c \ubd88\uac00\uc9c0\ub860\uc801\uc785\ub2c8\ub2e4. N1QL\uc740 \uc790\uccb4 \uc808\ucc28 \uc5b8\uc5b4\ub97c \uc9c0\uc815\ud558\ub294 \ub300\uc2e0 <em>\uc5b8\uc5b4 \uad00\ub9ac\uc790<\/em>\uc989, \uc774\ubbf8 \ub2e4\uc591\ud55c \uac8c\uc2a4\ud2b8 \uc5b8\uc5b4\ub97c \uc9c0\uc6d0\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud604\uc7ac \uc9c0\uc6d0\ub418\ub294 \uc5b8\uc5b4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <em>\uc778\ub77c\uc778<\/em>\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc720\ud6a8\ud55c \ubaa8\ub4e0 N1QL \uc2dd(\ud558\uc704 \ucffc\ub9ac \ud3ec\ud568)\uc744 \ucf54\ub529\ud560 \uc218 \uc788\ub294 \ub0b4\ubd80 \uc5b8\uc5b4\uc640 <em>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8<\/em>. \uba3c\uc800 N1QL UDF\uc5d0 \uc9c0\uc6d0\ub418\ub294 \uc774 \ub450 \uac00\uc9c0 \uc5b8\uc5b4\ub97c \ube44\uad50\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>N1QL UDF \uc608\uc81c: \uae30\ubcf8 \uc0ac\uc6a9\ubc95<\/h2>\n<p>\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ucd94\uac00\ud558\ub824\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud568\uc218\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. <em>\uc778\ub77c\uc778<\/em> \uc608\uc81c\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:mysql decode:true\">CREATE FUNCTION add(arg1, arg2) { arg1 + arg2 }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>You can then use your business logic freely wherever an expression is allowed, or directly through the `EXECUTE FUNCTION` statement:<\/p>\n<pre class=\"lang:default decode:true\">select add(1, 2)\r\nEXECUTE FUNCTION add(1, 2)\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ub354 \uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc77c\uc774 \uc5c6\uc73c\uba74 \uadf8\ub0e5 \ubc84\ub9ac\uba74 \ub429\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">DROP FUNCTION add\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h2>N1QL UDF \uc608\uc81c: JavaScript<\/h2>\n<p>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub97c \uc0dd\uc131\ud558\uace0 \uc0ad\uc81c\ud558\ub294 \uac83\uc740 \ub2e4\uc74c \uc139\uc158\uc5d0\uc11c \uc124\uba85\ud560 \uc774\uc720 \ub54c\ubb38\uc5d0 \uc57d\uac04 \ub354 \ubcf5\uc7a1\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\ub294 \uae30\uc220\uc801\uc73c\ub85c <em>\uc678\ubd80<\/em> \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ud568\uc218\uac00 \ub2e4\ub978 \uc5b8\uc5b4\ub85c \uc791\uc131\ub418\uace0 N1QL \ucffc\ub9ac \uc11c\ube44\uc2a4\uc640\ub294 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uc2e4\ud589\ub418\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p>\uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">curl -v -X POST https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math -u Administrator:password -d 'function add(a, b) { let data = a + b; return data; }'\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ub2e4\uc74c\uc73c\ub85c N1QL \ud568\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION javascriptAdd(a, b) LANGUAGE javascript AS \"add\" AT \"math\"\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\uc77c\ub2e8 \uc0dd\uc131\ub418\uba74 \uc778\ub77c\uc778 UDF\uc640 \ub611\uac19\uc774 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\ub97c \ub9cc\ub4e4\uc5b4 \ub193\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ub354 \uc774\uc0c1 \ud544\uc694\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \uc774 \uba85\ub839\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0ad\uc81c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">curl -v -X DELETE https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math -u Administrator:password\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h2>Couchbase 7.0\uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5: \ubc94\uc704 \ubc0f \uceec\ub809\uc158\uc744 \uc704\ud55c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218<\/h2>\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 7.0 \ub9b4\ub9ac\uc2a4\uc758 \uc8fc\uc694 \uae30\ub2a5 \uc911 \ud558\ub098\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ub3c4\uc785\uc785\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/scopes-and-collections-for-modern-multi-tenant-applications-couchbase-7-0\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\ubc94\uc704 \ubc0f \uceec\ub809\uc158<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/json-database\/?ref=blog\" target=\"_blank\" rel=\"noopener\">JSON<\/a> \ubb38\uc11c\uc5d0 \uc800\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uceec\ub809\uc158\uc740 \uc720\uc0ac\ud55c \ubb38\uc11c \uadf8\ub8f9\uc744 \uc704\ud55c \uc800\uc7a5\uc18c \ub2e8\uc704\uc774\uace0, \ubc94\uc704\ub294 \uc5ec\ub7ec \uac1c\uc758 \uceec\ub809\uc158\uc744 \ubcf4\uad00\ud558\ub294 \ub354 \ud070 \uc800\uc7a5\uc18c \ub2e8\uc704\ub85c, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubd84\ud560\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubc94\uc704 \ubc0f \uceec\ub809\uc158 \uc0ac\uc6a9, <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/server\/?ref=blog\" target=\"_blank\" rel=\"noopener\"><br \/>\n\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84<\/a> - \uc774\uc81c \uc2a4\ud0a4\ub9c8, \ud14c\uc774\ube14, \uc5f4 \ub4f1 \uad00\uacc4\ud615 \ubaa8\ub378\uc758 \ubaa8\ub4e0 \uc7a5\uc810\uacfc \ub2e8\uc810\uc744 \ubaa8\ub450 \uac16\ucd98 \ubb38\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p><em>\ube60\ub978 \uc0ac\uc774\ub4dc \uc2a4\ud15d:<\/em> In order to allow backward compatibility, the Query Service now has a `query_context` REST API parameter that indicates which Bucket and Scope should be used to resolve relative keyspace names, for example:<\/p>\n<pre class=\"lang:default decode:true\">cbq&gt; \\set -query_context \"default:travel-sample.scope1\";\r\ncbq&gt; select * from airlines;\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>In the statement above, the `SELECT` statement resolves `airlines` to the Collection named `default:travel-sample.scope1.airlines`.<\/p>\n<p>\uc774\uc81c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub85c \ub3cc\uc544\uac00 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<p>UDF\ub97c \uc0ac\uc6a9\ud55c \ubc94\uc704 \ubc0f \uceec\ub809\uc158\uc758 \ub17c\ub9ac\ub294 \ub3d9\uc77c\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uac1c\ubc1c, \uc0ac\uc804 \ud504\ub85c\ub355\uc158 \ubc0f \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc744 \uc138 \uac1c\uc758 \ub2e4\ub978 \ubc94\uc704\uc5d0\uc11c \ub3d9\uc77c\ud55c \ub85c\uc9c1\uc73c\ub85c \ub3d9\uc77c\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc0ac\ubcf8 \uc138 \uac1c\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ubc18\ub300\ub85c, \uc11c\ub85c \ub2e4\ub978 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \ud544\uc694\ud55c \uacbd\uc6b0(\uc608: \uc11c\ub85c \ub2e4\ub978 \ud560\uc778 \ub610\ub294 \ubc30\uc1a1 \uad6c\uc870\uac00 \uc801\uc6a9\ub418\ub294 \uc628\ub77c\uc778 \uc0c1\uc810 \ub610\ub294 \uc11c\ub85c \ub2e4\ub978 \uacfc\uc138 \uaddc\uce59\uc774 \uc801\uc6a9\ub418\ub294 \ud68c\uacc4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158) \ub3d9\uc77c\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc11c\ub85c \ub2e4\ub978 \ubc30\ud3ec\ub97c Scope\uc5d0 \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uccab \ubc88\uc9f8 \uacbd\uc6b0\uc5d0\ub294 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \ub3d9\uc77c\ud558\uae30 \ub54c\ubb38\uc5d0 \uac1c\ubcc4 \uae30\ub2a5\uc5d0 \ub300\ud55c \uae00\ub85c\ubc8c \uc815\uc758\ub9cc \uc788\uc73c\uba74 \ucda9\ubd84\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub450 \ubc88\uc9f8 \uacbd\uc6b0\ub97c \uc9c0\uc6d0\ud558\ub824\uba74 UDF\ub97c \uc5ec\ub7ec \uc2a4\ucf54\ud504\uc5d0 \ubd84\ud560\ud574\uc57c \ud588\uc2b5\ub2c8\ub2e4. \uac01 \ubc94\uc704\uc5d0\ub294 \uac01\uac01 \ub2e4\ub978 \ub85c\uc9c1\uc744 \uac00\uc9c4 \ub3d9\uc77c\ud55c UDF\uc758 \uc790\uccb4 \uc778\uc2a4\ud134\uc2a4\uac00 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c Couchbase Server 7.0\uc5d0\uc11c\ub294 \ubc94\uc704 \ubc0f \uceec\ub809\uc158\uc73c\ub85c \uc804\ud658\ud558\ub3c4\ub85d \uac15\uc81c\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c UDF\ub97c \uceec\ub809\uc158 \uae30\ub2a5\uc5d0 \ubb36\uc5b4 \ub450\uc9c0 \uc54a\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\ub294 \uc810\ub3c4 \uc8fc\ubaa9\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uae00\ub85c\ubc8c UDF\uc5d0 \ub300\ud55c \ucc38\uace0 \uc0ac\ud56d<\/h3>\n<p>\uae00\ub85c\ubc8c UDF\ub294 \uc2a4\ucf54\ud504\uc5d0 \uc885\uc18d\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c 6.5\uc5d0 \ub3c4\uc785\ub41c UDF\uc640 \uc774\uc804 \ubc84\uc804\uacfc \ud638\ud658\ub429\ub2c8\ub2e4.<\/p>\n<p>\uceec\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0\uc5d0\ub294 \uceec\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ud2b9\ubcc4\ud55c \uc870\uce58\ub97c \ucde8\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<br \/>\n\uae00\ub85c\ubc8c UDF\ub294 \uc544\ub798\uc640 \uac19\uc774 \ub450 \ubd80\ubd84\uc73c\ub85c \uad6c\uc131\ub41c \uc815\uaddc\ud654\ub41c \uc774\ub984\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucc38\uc870\ub429\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION default:bucket1.scope1.func1()  { 0 };\r\nEXECUTE FUNCTION default:bucket1.scope1.func1();\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>\ucffc\ub9ac \ucee8\ud14d\uc2a4\ud2b8 \ub9e4\uac1c \ubcc0\uc218\uc758 \uc911\uc694\uc131<\/h3>\n<p>\"\uc88b\uc544\uc694, \uc774\uc81c \ud5f7\uac08\ub9ac\ub124\uc694.\"\ub77c\uace0 \ub9d0\ud558\ub294 \uac83\uc774 \ub4e4\ub9bd\ub2c8\ub2e4. \"\uc774\uc804 \uc608\uc81c\uc5d0\uc11c \uc5b4\ub5a4 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc168\ub098\uc694? \uc774\ub984\uc774 \uc815\uaddc\ud654\ub418\uc9c0 \uc54a\uc558\uc796\uc544\uc694.\"<\/p>\n<p>The answer lies in the `query_context` REST API parameter setting: if the `query_context` is unset, the N1QL parser resolves the name to <em>\uae00\ub85c\ubc8c<\/em> functions. If the `query_context` is set, the parser uses the `query_context` value to resolve the names to the relevant Scope functions, much like it did with non-qualified keyspace names.<\/p>\n<p>You can seamlessly deploy your application against Scopes or against Buckets just by changing the setting of the `query_context` REST API parameter.<\/p>\n<h3>\ud568\uc218 \ub0b4\ubd80\uc758 \uac1d\uccb4 \ud574\uc0c1\ub3c4<\/h3>\n<p>\uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\uac00 \uc815\uaddc\ud654\ub41c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\ub294 \uacbd\uc6b0, \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc758\ubbf8\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \ubaa8\ud638\ud568\uc774 \uc5c6\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION func { (SELECT * FROM default:bucket1.scope1.collection1) };\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ub2e4\uc74c \uc9c8\ubb38\uc740 \ud568\uc218\ub294 \uadf8 \uc548\uc5d0\uc11c \ucc38\uc870\ub41c \uac1d\uccb4\ub97c \uc5b4\ub5bb\uac8c \ud655\uc778\ud560\uae4c\uc694? \uc608\ub97c \ub4e4\uc5b4<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION func1() { func2() };\r\nCREATE FUNCTION default:func3 { (SELECT * FROM keyspace1) };\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\uc5ec\uae30\uc11c \ud575\uc2ec\uc740 \ucd5c\uc18c \ub180\ub77c\uc6c0\uc758 \uc6d0\uce59\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub294 \uc2e4\ud589 \uc911\uc5d0 \ucffc\ub9ac \ucee8\ud14d\uc2a4\ud2b8\ub97c \uc0dd\uc131\ub41c \uacbd\ub85c\ub85c \uc804\ud658\ud558\uace0 \ud56d\uc0c1 \ud574\ub2f9 \uacbd\ub85c \ub0b4\uc758 \uac1d\uccb4\ub97c \ucc38\uc870\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0c1\ub300 \uacbd\ub85c\ub85c \ud638\ucd9c\ud588\ub294\uc9c0 \uc815\uaddc\ud654\ub41c \uacbd\ub85c\ub85c \ud638\ucd9c\ud588\ub294\uc9c0\ub294 \uc911\uc694\ud558\uc9c0 \uc54a\uc73c\uba70, \ub3d9\uc77c\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \ud638\ucd9c\ub41c \ud568\uc218\ub294 \ud56d\uc0c1 \ub3d9\uc77c\ud55c \uac1d\uccb4\uc5d0\uc11c \uac00\uc838\uc628 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>In the first example above, `func2()` would resolve to a global or a Scope function depending on the `query_context` setting at creation time.<\/p>\n<p>For `func3()`, `keyspace1` would be the Bucket `keyspace1`.<\/p>\n<h3>\uc804\uc5ed \ud568\uc218\uc640 \ubc94\uc704 \ud568\uc218 \ud63c\ud569<\/h3>\n<p>\uceec\ub809\uc158 \uae30\ub2a5\uacfc \ud568\uaed8 \uae00\ub85c\ubc8c UDF\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc744 \ub9c9\ub294 \uac83\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \uc815\uaddc\ud654\ub41c \uc774\ub984\uc744 \uc0ac\uc6a9\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\ucc2c\uac00\uc9c0\ub85c \ub2e4\ub978 \uc2a4\ucf54\ud504\uc5d0\uc11c \ub9cc\ub4e0 \uc2a4\ucf54\ud504 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uc9c1\uc811 \ucc38\uc870\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<h3>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218, \ub2e4\uc2dc \uc0b4\ud3b4\ubcf4\uae30<\/h3>\n<p>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub97c \ubcf8\ubb38\uacfc \ubcc4\ub3c4\uc758 \ud568\uc218 \uc815\uc758 \ub450 \ubd80\ubd84\uc73c\ub85c \ub098\ub220\uc57c \ud558\ub294 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\ud568\uc218 \uc815\uc758\uc640 \ubcc4\ub3c4\ub85c \ubcf8\ubb38\uc744 \ub9cc\ub4e4\uba74 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \ub3d9\uc77c\ud55c \ubcf8\ubb38\uc744 \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec \uc704\uce58\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud568\uc218\uac00 \ub3d9\uc77c\ud55c \ubcf8\ubb38\uc744 \ucc38\uc870\ud560 \uc218 \uc788\uc73c\uba70, \ubcf8\ubb38\uc744 \ud3b8\uc9d1\ud558\uac70\ub098 \uc7ac\uc815\uc758\ud558\uba74 \ud574\ub2f9 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ubaa8\ub4e0 \uad00\ub828 \ud568\uc218 \uc815\uc758\uc5d0 \uc790\ub3d9\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/li>\n<li>\ub9c8\ucc2c\uac00\uc9c0\ub85c \uc774 \ud328\ud134\uc740 \ud568\uc218\ub97c \uc0ad\uc81c\ud558\uac70\ub098 \uc0ad\uc81c\ud560 \ub54c\ub3c4 \uc911\uc694\ud569\ub2c8\ub2e4. \ud568\uc218\uc758 \ud55c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0ad\uc81c\ud574\uc57c \ud560 \ub54c \ub2e4\ub978 \uc778\uc2a4\ud134\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ubcf8\ubb38\uc744 \uadf8\ub300\ub85c \uc720\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 7.0\uc5d0\uc11c N1QL \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \ud301\uacfc \uc694\ub839<\/h2>\n<h3>UDF \uc774\ub984 \uc9c0\uc815<\/h3>\n<p>UDF \uc774\ub984\uc740 \uc2dd\ubcc4\uc790\uc774\uba70 \ubbf8\ub9ac \uc815\uc758\ub41c \ud568\uc218 \uc774\ub984\uacfc \uc77c\uce58\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774\ub984 <em>do<\/em> \uc77c\uce58\ud558\ub294 \uacbd\uc6b0 \ubbf8\ub9ac \uc815\uc758\ub41c \ud568\uc218\uac00 \uc6b0\uc120\ud558\ubbc0\ub85c UDF\uac00 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubbf8\ub9ac \uc815\uc758\ub41c \ud568\uc218 \uc774\ub984\uc744 \uc0ac\uc6a9\ud558\ub824\ub294 \uacbd\uc6b0(\uc5b4\ub5a4 \uc774\uc720\ub85c\ub4e0) \ucc38\uc870\ud560 \ub54c \ud574\ub2f9 \uc774\ub984\uc744 \uc815\uaddc\ud654\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION length(arg) { 0 };\r\nSELECT default:length(type) FROM `travel-sample`;\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>UDF \ub9e4\uac1c\ubcc0\uc218<\/h3>\n<p>N1QL \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub294 \uc138 \uac00\uc9c0 \uc720\ud615\uc758 \ub9e4\uac1c\ubcc0\uc218 \ubaa9\ub85d\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ube48 \ub9e4\uac1c \ubcc0\uc218\n<pre class=\"lang:default decode:true\">CREATE FUNCTION func1() { 0 }\r\n<\/pre>\n<p>\uc774 \ud568\uc218\ub294 \ub9e4\uac1c \ubcc0\uc218\ub97c \ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub9e4\uac1c \ubcc0\uc218\ub97c \uc804\ub2ec\ud558\uba74 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/li>\n<li>\ub2e4\uc591\ud55c \ub9e4\uac1c \ubcc0\uc218\n<pre class=\"lang:default decode:true\">CREATE FUNCTION func1(...) { array_length(args) }\r\n<\/pre>\n<p>Three dots denote a variadic function. It can take any number of parameters of any type. The parameters are contained in an array names `args`.<\/li>\n<li>\uba85\uba85\ub41c \ub9e4\uac1c\ubcc0\uc218\n<pre class=\"lang:default decode:true\">CREATE FUNCTION func1(arg1) { arg1 }\r\n<\/pre>\n<p>\ub9e4\uac1c\ubcc0\uc218\ub294 \uc785\ub825\ub418\uc9c0 \uc54a\uc9c0\ub9cc \uc804\ub2ec\ub41c \uc778\uc218\uc758 \uac1c\uc218\uac00 \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h3>\uacfc\ubd80\ud558 \ubc0f \uc720\ud615 \ucc98\ub9ac\uc5d0 \ub300\ud55c \uba87 \uac00\uc9c0 \ud301<\/h3>\n<p>\uc785\ub825\uc5d0 \ub530\ub77c \ub2e4\ub974\uac8c \uc791\ub3d9\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d9\uc77c\ud55c \ud568\uc218\ub97c \ub2e4\ub978 \ub9e4\uac1c\ubcc0\uc218 \ubaa9\ub85d \ub610\ub294 \ub2e4\ub978 \ub9e4\uac1c\ubcc0\uc218 \uc720\ud615\uc73c\ub85c \uc5ec\ub7ec \ubc88 \uc815\uc758\ud558\ub294 \ud568\uc218 \uc624\ubc84\ub85c\ub529\uc5d0 \uac00\uc7a5 \uac00\uae4c\uc6b4 \uac83\uc740 \uc720\ud615\uc774 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc740 \ub9e4\uac1c\ubcc0\uc218\uc640 \uac00\ubcc0 \ud568\uc218\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub300\uc2e0 \uc774 N1QL \uc804\ub7b5\uc744 \ucd94\ucc9c\ud569\ub2c8\ub2e4: \uc218\uc2e0\ub41c \uc778\uc218\ub97c \ud655\uc778\ud558\uace0 \uadf8\uc5d0 \ub530\ub77c \uc791\ub3d9\ud558\ub294 \ub2e8\uc77c \ud568\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \ubcc0\ub3d9 \ud568\uc218\uc758 \uc608\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION variadic(...) { CASE WHEN array_length(args) != 1 THEN \"wrong args: \" || to_string(array_length(args))  WHEN type(args[0]) = \"string\" THEN args[0] ELSE \"wrong type \" || type(args[0]) || \": \" || to_string(args[0]) END }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\uadf8\ub9ac\uace0 \ube44\ubcc0\uc218 \ud568\uc218\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION twoargs(arg1, arg2) { CASE WHEN type(arg1) != \"string\" THEN \"wrong arg1 \" || type(arg1) || \": \" || to_string(arg1) WHEN type(arg2) != \"string\" THEN \"wrong arg2 \" || type(arg2) || \": \" || to_string(arg2) ELSE arg1 || arg2 END }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>\ub9e4\uac1c\ubcc0\uc218 \uc774\ub984\uacfc \ubb38\uc11c \ud544\ub4dc \ube44\uad50<\/h3>\n<p>\ub2e4\uc74c \ud568\uc218\ub97c \uace0\ub824\ud558\uc138\uc694:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION docsOfType(type) { (SELECT * from `travel-sample` WHERE type=type) }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ud568\uc218\uac00 \ubb38\uc11c \ud544\ub4dc\uc640 \uac19\uc740 \uc774\ub984\uc744 \uac00\uc9c4 \ub9e4\uac1c\ubcc0\uc218\ub97c \uc120\uc5b8\ud55c \uac83\uc744 \ubcf4\uc168\ub098\uc694? \ub458\uc744 \uad6c\ubd84\ud560 \ubc29\ubc95\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc774 \ud568\uc218\ub294 \ubd84\uba85\ud788 \uadf8 \uc758\ub3c4\ub97c \ub2ec\uc131\ud558\uc9c0 \ubabb\ud569\ub2c8\ub2e4.<\/p>\n<p>Here\u2019s how you use parameters names to get around this problem: Parameter names override document fields (either way, the above query returns all documents in the `travel-sample` dataset).<\/p>\n<p>\ubb38\uc11c \ud544\ub4dc\uc5d0 \uc561\uc138\uc2a4\ud558\ub824\uba74 \ub450 \uac00\uc9c0 \uc120\ud0dd\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774 \uc815\uaddc\ud654\ub41c \uc774\ub984\uc73c\ub85c \ubb38\uc11c \ud544\ub4dc\ub97c \ucc38\uc870\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION docsOfType(type) { (SELECT * from `travel-sample` WHERE travel-sample.type=type) }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ub610\ub294 \uc544\ub798\uc640 \uac19\uc774 \ub9e4\uac1c\ubcc0\uc218\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\uc5ec \ubaa8\ud638\uc131\uc744 \uc81c\uac70\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION docsOfType(vType) { (SELECT * from `travel-sample` WHERE type=vType) }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>UDF\ub97c \uc0ac\uc6a9\ud55c \ubc18\ud658 \uac12<\/h3>\n<p>\uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub294 \uc5b4\ub5a4 \uc720\ud615\uc774\ub4e0 \ud558\ub098\uc758 \uac12\ub9cc \ubc18\ud658\ud569\ub2c8\ub2e4. \ub458 \uc774\uc0c1\uc758 \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \ubc30\uc5f4\uc774\ub098 \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>\ud558\uc9c0\ub9cc \ubc18\ud658 \uc720\ud615\uc744 \uc8fc\uc758\ud558\uc138\uc694!<\/strong> Remember that `SELECT` statements executed inside UDFs return arrays, so even if your `SELECT` returns just one document, it is a one-element array. Instead, return the first element of the array.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4 \uc544\ub798\uc758 \uc774 \ud568\uc218\ub294 \uc6d0\ud558\ub294 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION tsample() { (SELECT * FROM `travel-sample` LIMIT 1) }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>\ud558\uc9c0\ub9cc \uc774\uac74 \uadf8\ub807\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION tsample1st() { (SELECT * FROM `travel-sample` LIMIT 1)[0] }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>UDF \ubc18\ud658 \uac12\uc744 \ucffc\ub9ac \ub370\uc774\ud130\ub85c \uc0ac\uc6a9<\/h3>\n<p>\uc2a4\ud399\ud2b8\ub7fc\uc758 \ubc18\ub300\ud3b8\uc5d0 \uc788\ub294 UDF\ub294 \ubc30\uc5f4\uc744 \ubc18\ud658\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ub2e4\uc74c \uc608\uc81c\uc5d0\uc11c\uc640 \uac19\uc774 \ud14c\uc774\ube14 \ud568\uc218 \ub610\ub294 \uceec\ub809\uc158 \ud30c\uc0dd \ud14c\uc774\ube14\uacfc \uac19\uc740 \uac1c\ub150\uc744 \uc0ac\uc6a9\ud558\uc5ec \uad00\uacc4\ud615 \uc5d4\uc9c4\uc5d0\uc11c \ud558\ub294 \uac83\ucc98\ub7fc \ucffc\ub9ac\ud560 \ub370\uc774\ud130\ub97c \ub3d9\uc801\uc73c\ub85c \uc0dd\uc131\ud558\ub294 \ub370 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">SELECT * FROM tsample() sample<\/pre>\n<p>\uc608\uc81c \ud568\uc218\uc5d0\uc11c\ub294 \ubc84\ud0b7\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc120\ud0dd\ud558\uc9c0\ub9cc, \ubc30\uc5f4\uc744 \uad6c\uc131\ud558\ub294 \ubaa8\ub4e0 \uc720\ud6a8\ud55c \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uae30\uc874 \ud568\uc218\ub97c \uc5c5\ub370\uc774\ud2b8\ud574\uc57c \ud558\ub294 \uacbd\uc6b0<\/h3>\n<p>Sometimes you need to redefine a function. The `OR REPLACE` clause of the `CREATE FUNCTION` statement allows you to do just that in a single step:<\/p>\n<pre class=\"lang:default decode:true\">CREATE OR REPLACE FUNCTION tsample1st() { (SELECT * FROM `travel-sample` LIMIT 1)[0] }\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h3>\uc0ac\uc6a9\uc790 \uc561\uc138\uc2a4 \uad8c\ud55c<\/h3>\n<p>UDF \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \ubaa8\ub4e0 N1QL \ubb38\uc740 \uc694\uccad\uc744 \uc81c\ucd9c\ud55c \uc0ac\uc6a9\uc790\uc640 \ub3d9\uc77c\ud55c \uad8c\ud55c\uc73c\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc0ac\uc6a9\uc790\ub294 \uc9c0\uc815\ub41c UDF\uac00 \ucc38\uc870\ud558\ub294 \ubaa8\ub4e0 \uac1c\uccb4\uc5d0 \uc561\uc138\uc2a4\ud558\ub824\uba74 \uc801\uc808\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ubb34\uc5c7\ubcf4\ub2e4\ub3c4 \uc0ac\uc6a9\uc790\ub294 \ud568\uc218\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub0b4\ubd80, \uc678\ubd80, \uc804\uc5ed \ubc0f \ubc94\uc704 \uc218\uc900 \ud568\uc218\uc5d0 \ub300\ud574 \uc11c\ub85c \ub2e4\ub978 \uad8c\ud55c \uc218\uc900\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ud568\uc218\ub97c \ub9cc\ub4e4\uace0 \uc0ad\uc81c\ud558\ub824\uba74 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ud568\uc218 \uad00\ub9ac \uad8c\ud55c\uc774 \ubd80\uc5ec\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4<\/p>\n<pre class=\"lang:default decode:true\">GRANT query_manage_global_functions TO user1;\r\nGRANT query_execute_external_functions ON default:test.scope1 TO user1;\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<h2>\uacb0\ub860<\/h2>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc774 Couchbase 7.0\uc5d0\uc11c N1QL \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc744 \uc5b8\uc81c, \uc5b4\ub5bb\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\ub294\uc9c0 \uc774\ud574\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\uc5c8\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4. \ub2e4\uc74c\uc5d0 \ub300\ud55c \uc124\uba85\uc11c\ub97c \ud655\uc778\ud558\uc138\uc694. <a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/n1ql\/n1ql-language-reference\/userfun.html?ref=blog\" target=\"_blank\" rel=\"noopener\"> \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4<\/a>\ucee8\ud14d\uc2a4\ud2b8 \ucf1c\uc9d0 <a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/n1ql\/n1ql-intro\/sysinfo.html?ref=blog#logical-hierarchy\" target=\"_blank\" rel=\"noopener\">N1QL objects and `query_context`<\/a> \uadf8\ub9ac\uace0 <a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/learn\/security\/roles.html?ref=blog#manage-global-functions\" target=\"_blank\" rel=\"noopener\">UDF\ub97c \uc704\ud55c \ubcf4\uc548 \uc5ed\ud560<\/a>.<\/p>\n<div class=\"wp-block-spacer\" style=\"height: 30px;\" aria-hidden=\"true\"><\/div>\n<div style=\"text-align: center;\"><strong>UDF\ub97c \uc9c1\uc811 \uccb4\ud5d8\ud574\ubcf4\uace0 \uc2f6\uc73c\uc2e0\uac00\uc694?<br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/ko\/downloads\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 7\uc744 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \ubcf4\uc138\uc694.<\/a><\/strong><\/div>\n<div class=\"wp-block-spacer\" style=\"height: 15px;\" aria-hidden=\"true\"><\/div>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Declarative query languages have been a major gear shift in the world of database engines. The SQL++ query language (formerly N1QL) is primarily a declarative query language. You tell the query what to get and N1QL works out the rest [&hellip;]<\/p>","protected":false},"author":1782,"featured_media":11779,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,9327,1812],"tags":[1867,2312,1543,1261,8911],"ppma_author":[8924],"class_list":["post-9720","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-javascript","category-n1ql-query","tag-business-logic","tag-document-database","tag-javascript","tag-json","tag-udf"],"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>N1QL Now Supports User-Defined Functions<\/title>\n<meta name=\"description\" content=\"Discover what\u2019s possible with the introduction of user-defined functions to the N1QL query language in Couchbase 7, including these UDF tips and tricks.\" \/>\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\/n1ql-user-defined-functions\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"N1QL Now Supports User-Defined Functions\" \/>\n<meta property=\"og:description\" content=\"Discover what\u2019s possible with the introduction of user-defined functions to the N1QL query language in Couchbase 7, including these UDF tips and tricks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/n1ql-user-defined-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-25T07:00:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:34:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0-social.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"418\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Marco Greco, Software Architect, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0-social.jpg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marco Greco, Software Architect, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/\"},\"author\":{\"name\":\"Marco Greco, Software Architect, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2b5184a7cdb443ff2897aff0866cd6fd\"},\"headline\":\"N1QL Now Supports User-Defined Functions\",\"datePublished\":\"2021-08-25T07:00:09+00:00\",\"dateModified\":\"2025-06-14T06:34:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/\"},\"wordCount\":1771,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"keywords\":[\"Business Logic\",\"document database\",\"javascript\",\"JSON\",\"User Defined Function (UDF)\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"JavaScript\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/\",\"name\":\"N1QL Now Supports User-Defined Functions\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"datePublished\":\"2021-08-25T07:00:09+00:00\",\"dateModified\":\"2025-06-14T06:34:39+00:00\",\"description\":\"Discover what\u2019s possible with the introduction of user-defined functions to the N1QL query language in Couchbase 7, including these UDF tips and tricks.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"width\":1200,\"height\":628,\"caption\":\"Learn these tips and tricks for creating user-defined functions (UDFs) with the N1QL query language\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"N1QL Now Supports User-Defined Functions\"}]},{\"@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\/2b5184a7cdb443ff2897aff0866cd6fd\",\"name\":\"Marco Greco, Software Architect, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/707c967b795fd71b6330f6d3118cf308\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g\",\"caption\":\"Marco Greco, Software Architect, Couchbase\"},\"description\":\"In a previous life, Marco used to be CTO, radiation physicist, software architect, sysadmin, DBA, trainer and general handyman at Italy's largest radiation theraphy practice. Having switched career and country, he spent more than two decades in various support and development positions in Informix first and IBM later, before finally taking the plunge and joining Couchbase, to help them make gold out of N1QL. He holds several patents and has authored open source projects of his own.\",\"sameAs\":[\"https:\/\/github.com\/marcogrecopriolo\",\"https:\/\/www.linkedin.com\/in\/marco-greco-7665308\/\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/marcocouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\uc774\uc81c N1QL\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218 \uc9c0\uc6d0","description":"\uc774\ub7ec\ud55c UDF \ud301\uacfc \uc694\ub839\uc744 \ud3ec\ud568\ud558\uc5ec Couchbase 7\uc758 N1QL \ucffc\ub9ac \uc5b8\uc5b4\uc5d0 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub97c \ub3c4\uc785\ud558\uba74 \uc5b4\ub5a4 \uac83\uc774 \uac00\ub2a5\ud55c\uc9c0 \uc54c\uc544\ubcf4\uc138\uc694.","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\/n1ql-user-defined-functions\/","og_locale":"ko_KR","og_type":"article","og_title":"N1QL Now Supports User-Defined Functions","og_description":"Discover what\u2019s possible with the introduction of user-defined functions to the N1QL query language in Couchbase 7, including these UDF tips and tricks.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/n1ql-user-defined-functions\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-08-25T07:00:09+00:00","article_modified_time":"2025-06-14T06:34:39+00:00","og_image":[{"width":800,"height":418,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0-social.jpg","type":"image\/jpeg"}],"author":"Marco Greco, Software Architect, Couchbase","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0-social.jpg","twitter_misc":{"Written by":"Marco Greco, Software Architect, Couchbase","Est. reading time":"9\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/"},"author":{"name":"Marco Greco, Software Architect, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2b5184a7cdb443ff2897aff0866cd6fd"},"headline":"N1QL Now Supports User-Defined Functions","datePublished":"2021-08-25T07:00:09+00:00","dateModified":"2025-06-14T06:34:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/"},"wordCount":1771,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","keywords":["Business Logic","document database","javascript","JSON","User Defined Function (UDF)"],"articleSection":["Best Practices and Tutorials","Couchbase Server","JavaScript","SQL++ \/ N1QL Query"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/","url":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/","name":"\uc774\uc81c N1QL\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218 \uc9c0\uc6d0","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","datePublished":"2021-08-25T07:00:09+00:00","dateModified":"2025-06-14T06:34:39+00:00","description":"\uc774\ub7ec\ud55c UDF \ud301\uacfc \uc694\ub839\uc744 \ud3ec\ud568\ud558\uc5ec Couchbase 7\uc758 N1QL \ucffc\ub9ac \uc5b8\uc5b4\uc5d0 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub97c \ub3c4\uc785\ud558\uba74 \uc5b4\ub5a4 \uac83\uc774 \uac00\ub2a5\ud55c\uc9c0 \uc54c\uc544\ubcf4\uc138\uc694.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","width":1200,"height":628,"caption":"Learn these tips and tricks for creating user-defined functions (UDFs) with the N1QL query language"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-user-defined-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"N1QL Now Supports User-Defined Functions"}]},{"@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\/2b5184a7cdb443ff2897aff0866cd6fd","name":"\ub9c8\ub974\ucf54 \uadf8\ub808\ucf54, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ud2b8, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/707c967b795fd71b6330f6d3118cf308","url":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","caption":"Marco Greco, Software Architect, Couchbase"},"description":"In a previous life, Marco used to be CTO, radiation physicist, software architect, sysadmin, DBA, trainer and general handyman at Italy's largest radiation theraphy practice. Having switched career and country, he spent more than two decades in various support and development positions in Informix first and IBM later, before finally taking the plunge and joining Couchbase, to help them make gold out of N1QL. He holds several patents and has authored open source projects of his own.","sameAs":["https:\/\/github.com\/marcogrecopriolo","https:\/\/www.linkedin.com\/in\/marco-greco-7665308\/"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/marcocouchbase-com\/"}]}},"authors":[{"term_id":8924,"user_id":1782,"is_guest":0,"slug":"marcocouchbase-com","display_name":"Marco Greco, Software Architect, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","author_category":"","last_name":"Greco","first_name":"Marco","job_title":"","user_url":"","description":"\uc804\uc0dd\uc5d0 \ub9c8\ub974\ucf54\ub294 \uc774\ud0c8\ub9ac\uc544 \ucd5c\ub300 \ubc29\uc0ac\uc120 \uce58\ub8cc \uae30\uad00\uc5d0\uc11c CTO, \ubc29\uc0ac\uc120 \ubb3c\ub9ac\ud559\uc790, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4\uc790, \uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790, DBA, \ud2b8\ub808\uc774\ub108, \uc77c\ubc18 \uad00\ub9ac\uc790\ub85c \uc77c\ud588\uc2b5\ub2c8\ub2e4.\r\n\r\n\uc9c1\uc5c5\uacfc \uad6d\uac00\ub97c \ubc14\uafbc \uadf8\ub294 \ucc98\uc74c\uc5d0\ub294 Informix\uc5d0\uc11c, \ub098\uc911\uc5d0\ub294 IBM\uc5d0\uc11c 20\ub144 \uc774\uc0c1 \ub2e4\uc591\ud55c \uc9c0\uc6d0 \ubc0f \uac1c\ubc1c \uc9c1\ucc45\uc744 \ub9e1\ub2e4\uac00 \ub9c8\uce68\ub0b4 \uacfc\uac10\ud788 Couchbase\uc5d0 \ud569\ub958\ud558\uc5ec N1QL\uc5d0\uc11c \uae08\uc744 \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc8fc\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n\uadf8\ub294 \uc5ec\ub7ec \uac1c\uc758 \ud2b9\ud5c8\ub97c \ubcf4\uc720\ud558\uace0 \uc788\uc73c\uba70 \uc9c1\uc811 \uc624\ud508 \uc18c\uc2a4 \ud504\ub85c\uc81d\ud2b8\ub97c \uc800\uc220\ud558\uae30\ub3c4 \ud588\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/9720","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\/1782"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=9720"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/9720\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/11779"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=9720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=9720"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=9720"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=9720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}