{"id":14249,"date":"2023-04-04T13:27:26","date_gmt":"2023-04-04T20:27:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=14249"},"modified":"2025-06-13T23:00:08","modified_gmt":"2025-06-14T06:00:08","slug":"updating-sensor-data-exploring-couchbases-multi-model-options","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/updating-sensor-data-exploring-couchbases-multi-model-options\/","title":{"rendered":"\uc13c\uc11c \ub370\uc774\ud130 \uc5c5\ub370\uc774\ud2b8\ud558\uae30: Couchbase\uc758 \ub2e4\uc911 \ubaa8\ub378 \uc635\uc158 \uc0b4\ud3b4\ubcf4\uae30"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc6a9\ub3c4\ub85c \ub110\ub9ac \uc0ac\uc6a9\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/solutions\/iot-data-management\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">IoT \uc0ac\uc6a9 \uc0ac\ub840<\/span><\/a><span style=\"font-weight: 400;\">\uc720\uc5f0\ud55c <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/how-multimodel-databases-can-reduce-data-sprawl\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\ub2e4\uc911 \ubaa8\ub378<\/span><\/a><span style=\"font-weight: 400;\"> \ub370\uc774\ud130 \uad00\ub9ac \uae30\ub2a5.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ucd5c\uadfc \uc800\ub294 \ud06c\ub8e8\uc988 \uc5c5\uacc4\uc758 \ud55c \uace0\uac1d\uacfc \ud568\uaed8 \uc77c\ud558\uace0 \uc788\uc5c8\ub294\ub370, \uc774 \uace0\uac1d\uc740 \uc120\ubc15\uc758 \uc218\uce58\ub97c \uae30\ub85d\ud558\ub294 \uc5ec\ub7ec \uc13c\uc11c\ub85c\ubd80\ud130 \uc790\uc8fc \uc5c5\ub370\uc774\ud2b8\ub97c \uc218\uc2e0\ud558\uace0 \uc800\uc7a5\ud558\uae30 \uc704\ud574 Couchbase\uac00 \ud544\uc694\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud310\ub3c5\uac12\uc774 \uc2dc\uac04 \uc21c\uc11c\uac00 \uc544\ub2cc \ub2e4\ub978 \uc21c\uc11c\ub85c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc5d0 \uc804\uc1a1\ub420 \uac00\ub2a5\uc131\uc774 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc0c8\ub85c\uc6b4 \uc13c\uc11c \uc218\uce58\uac00 \uc774\uc804 \uc218\uce58\ubcf4\ub2e4 \ud0c0\uc784\uc2a4\ud0ec\ud504\uac00 \ub2a6\uc740 \uacbd\uc6b0\uc5d0\ub9cc \uc800\uc7a5\ub420 \uc218 \uc788\ub3c4\ub85d \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c\uc694?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uac01 \uc13c\uc11c\uc5d0\ub294 \ucd5c\uc2e0 \uc13c\uc11c \ud310\ub3c5\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 \uace0\uc720 \ud0a4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc624\uc804 10:43:00\uc758 \ud310\ub3c5\uac12\uc740 \uc624\uc804 10:42:30\uc758 \ud310\ub3c5\uac12\uc744 \ub36e\uc5b4\uc4f8 \uc218 \uc5c6\uc73c\uba70, \ud6c4\uc790\uac00 \ub098\uc911\uc5d0 \uc218\uc2e0\ub418\uc5c8\ub354\ub77c\ub3c4 \ub36e\uc5b4\uc4f8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uba87 \uac00\uc9c0 \uc0d8\ud50c \ud310\ub3c5\uac12\uacfc \uadf8 \ucc98\ub9ac \uc21c\uc11c\uc785\ub2c8\ub2e4(\ud0c0\uc784\uc2a4\ud0ec\ud504\uac00 \ubc18\ub4dc\uc2dc \uc2dc\uac04 \uc21c\uc11c\uac00 \uc544\ub2cc \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694):<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">id: \"C-DI_Nautical_Speed\"\r\n{\r\n\u00a0 \u00a0 \"speed\": 15,\r\n\u00a0 \u00a0 \"unit\": \"knots\",\r\n\u00a0 \u00a0 \"timeStamp\": \"2023-03-10 10:43:00 AM\"\r\n}\r\n\r\nid: \"C-DI_Nautical_Speed\"\r\n{\r\n\u00a0 \u00a0 \"speed\": 15.1,\r\n\u00a0 \u00a0 \"unit\": \"knots\",\r\n\u00a0 \u00a0 \"timeStamp\": \"2023-03-10 11:43:00 AM\"\r\n},\r\n\r\nid: \"C-DI_Nautical_Speed\"\r\n{\r\n\u00a0 \u00a0 \"speed\": 14.9,\r\n\u00a0 \u00a0 \"unit\": \"knots\",\r\n\u00a0 \u00a0 \"timeStamp\": \"2023-03-10 10:42:30 AM\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 Couchbase\uc758 \ub2e4\uc911 \ubaa8\ub378 \uc635\uc158\uc774 \uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\ub97c \ud574\uacb0\ud558\uace0 \uc13c\uc11c \ub370\uc774\ud130 \uc5c5\ub370\uc774\ud2b8\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \ub370 \uc5b4\ub5bb\uac8c \ub3c4\uc6c0\uc774 \ub418\ub294\uc9c0 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uba40\ud2f0 \ubaa8\ub378\uc774\ub780 \ubb34\uc5c7\uc778\uac00\uc694?<\/h2>\n<p><span style=\"font-weight: 400;\">\uba54\ubaa8\ub9ac \uc6b0\uc120 \uce90\uc2f1\uacfc JSON \ub370\uc774\ud130 \uc9c0\uc18d\uc131\uc744 \uacb0\ud569\ud558\uc5ec \ub370\uc774\ud130 \uad00\ub9ac\uc5d0 \ub300\ud55c \uc720\uc5f0\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \uc81c\uacf5\ud558\ub294 Couchbase\ub294 \ucd5c\ucd08\uc758 \ub2e4\uc911 \ubaa8\ub378 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub77c\uace0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Couchbase\ub294 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc778\uc2a4\ud134\uc2a4\uc5d0\uc11c \uc815\ud615, \ubc18\uc815\ud615, \ube44\uc815\ud615 \ub370\uc774\ud130\uc640 \uac19\uc740 \uc5ec\ub7ec \ub370\uc774\ud130 \uc720\ud615\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc2dc\uac04\uc774 \uc9c0\ub0a8\uc5d0 \ub530\ub77c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/sqlplusplus\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">SQL++<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/full-text-search\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\uc804\uccb4 \ud14d\uc2a4\ud2b8 \uac80\uc0c9(FTS)<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/eventing\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\uc774\ubca4\ud2b8<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/analytics\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\ubd84\uc11d<\/span><\/a><span style=\"font-weight: 400;\"> \ub3c4\uad6c: \ub3d9\uc77c\ud55c \ub370\uc774\ud130 \ud480\uc5d0 \uc561\uc138\uc2a4\ud558\uace0, \uc0c9\uc778\ud558\uace0, \uc0c1\ud638 \uc791\uc6a9\ud558\uae30 \uc704\ud55c \uc5ec\ub7ec \ubaa8\ub378. \uc774\ub7ec\ud55c \ub2e4\uc911 \ubaa8\ub378 \uc811\uadfc \ubc29\uc2dd\uc740 Couchbase\ub97c \uae30\uc874 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ubcf4\ub2e4 \ub354 \uc720\uc5f0\ud558\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc9c0\ub9cc, \ub370\uc774\ud130\uc640 \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ud55c \uac00\uc9c0\ubfd0\uc778 \ub808\uac70\uc2dc \uc2dc\uc2a4\ud15c\uc5d0 \ube44\ud574 \uc7a5\ub2e8\uc810\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uc13c\uc11c \ud310\ub3c5\uac12 \uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud55c \ub2e4\uc911 \ubaa8\ub378 \uc635\uc158<\/h2>\n<p><span style=\"font-weight: 400;\">Couchbase\uc758 \ub2e4\uc911 \ubaa8\ub378 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc774 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub300\ud55c \uc13c\uc11c \ud310\ub3c5\uac12\uc744 \uc5c5\ub370\uc774\ud2b8\ud560 \ub54c \uace0\ub824\ud574\uc57c \ud560 \uba87 \uac00\uc9c0 \uc811\uadfc \ubc29\uc2dd\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\ub099\uad00\uc801 \ub610\ub294 \ube44\uad00\uc801 \uc7a0\uae08 \uae30\ub2a5\uc744 \uac16\ucd98 \ud0a4-\uac12 API<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">ACID \ud2b8\ub79c\uc7ad\uc158\uc774 \ud3ec\ud568\ub41c \ud0a4-\uac12 API<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">SQL++ \uc5c5\ub370\uc774\ud2b8 \ubb38<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc628\uc5c5\ub370\uc774\ud2b8 \uae30\ub2a5 \uc774\ubca4\ud2b8<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\uc774\ub7ec\ud55c \ubaa8\ub4e0 \uc635\uc158\uc5d0\ub294 \uc131\ub2a5, \ubcf5\uc7a1\uc131 \ubc0f \uc694\uad6c \uc0ac\ud56d \uce21\uba74\uc5d0\uc11c \uace0\uc720\ud55c \uc7a5\uc810\uacfc \uc7a5\ub2e8\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uac00\uc7a5 \uc801\ud569\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \uc120\ud0dd\ud558\ub294 \uac83\uc740 \uc5c5\ub370\uc774\ud2b8\uc758 \ud06c\uae30\uc640 \ube48\ub3c4, \ub3d9\uc2dc\uc131 \uc218\uc900, \uc804\ubc18\uc801\uc778 \uc131\ub2a5 \uc694\uad6c \uc0ac\ud56d \ub4f1\uc758 \uc694\uc778\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9d1\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uad81\uadf9\uc801\uc73c\ub85c \uac00\uc7a5 \uc88b\uc740 \uc811\uadfc \ubc29\uc2dd\uc740 \uc2e4\uc81c \ub370\uc774\ud130 \ub610\ub294 \uc2e4\uc81c \ub370\uc774\ud130\uc758 \uadfc\uc0ac\uce58\ub97c \uc0ac\uc6a9\ud55c \uc2e4\uc81c \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574\uc11c\ub9cc \uacb0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\uc790\ub294 \uc7a5\ub2e8\uc810\uc744 \uac80\ud1a0\ud558\uace0 \ub2e4\uc591\ud55c \uc635\uc158\uc744 \uc2e4\ud5d8\ud568\uc73c\ub85c\uc368 Couchbase\uc758 \ub2e4\uc911 \ubaa8\ub378 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc13c\uc11c \ud310\ub3c5\uac12\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uac00\uc7a5 \ud6a8\uacfc\uc801\uc778 \ubc29\ubc95\uc744 \ud30c\uc545\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\uc758 \ub300\ubd80\ubd84\uc740 \uc13c\uc11c \ubb38\uc11c\uac00 \uc774\ubbf8 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694(\uc815\uc0c1 \uc0c1\ud0dc\uc5d0\uc11c\ub294 \uac00\uc7a5 \uc77c\ubc18\uc801\uc778 \uc2dc\ub098\ub9ac\uc624\uc785\ub2c8\ub2e4). \uadf8\ub807\uc9c0 \uc54a\uc740 \uacbd\uc6b0, \uc13c\uc11c \ubb38\uc11c\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 <em>\ub300\uccb4<\/em> \ub610\ub294 <em>\uc5c5\ub370\uc774\ud2b8<\/em> \uc791\uc5c5\uc73c\ub85c <em>\uc5c5\uc11c\ud2b8<\/em>\u00a0\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubb38\uc11c\uac00 \uc5c6\ub294 \uacbd\uc6b0 \ubb38\uc11c\uac00 \uc0dd\uc131\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. (\ub610\ub294 \uac01 \uc13c\uc11c\uc5d0 \ub300\ud55c \ubb38\uc11c\ub85c \uceec\ub809\uc158\uc744 '\uc2dc\ub4dc'\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774\uc81c \uac01 \uac00\ub2a5\uc131\uc744 \uc0b4\ud3b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>\ub099\uad00\uc801 \ub610\ub294 \ube44\uad00\uc801 \uc7a0\uae08 \uae30\ub2a5\uc744 \uac16\ucd98 \ud0a4-\uac12 API<\/h2>\n<p><span style=\"font-weight: 400;\">Couchbase\uc758 \ub2e4\uc911 \ubaa8\ub378 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc13c\uc11c \ud310\ub3c5\uac12\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \ud55c \uac00\uc9c0 \ubc29\ubc95\uc740 \ub099\uad00\uc801 \ub610\ub294 \ube44\uad00\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc7a0\uae08 \uba54\ucee4\ub2c8\uc998\uc740 Couchbase\uc5d0 \uc624\ub7ab\ub3d9\uc548 \uc874\uc7ac\ud574 \uc654\uc73c\uba70, \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. <\/span><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/concurrent-document-mutations.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">CAS(\ube44\uad50 \ubc0f \uc2a4\uc651)<\/span><\/a><span style=\"font-weight: 400;\"> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uac1c\ubcc4 \ubb38\uc11c\uc758 \uc870\uac74\ubd80 \uc5c5\ub370\uc774\ud2b8\ub97c \ubcf4\uc7a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CAS \uac12\uc740 \ubb38\uc11c\uac00 \ubcc0\uacbd\ub420 \ub54c\ub9c8\ub2e4 \ubcc0\uacbd\ub418\ub294 \uc784\uc758\uc758 \uc22b\uc790\uc785\ub2c8\ub2e4. \uac1c\ubc1c\uc790\ub294 CAS \uac12\uc744 \uc77c\uce58\uc2dc\ud0b4\uc73c\ub85c\uc368 \ucd5c\uc18c\ud55c\uc758 \uc624\ubc84\ud5e4\ub4dc\ub85c \uc13c\uc11c \ub370\uc774\ud130\ub97c \uc870\uac74\ubd80\ub85c \uc5c5\ub370\uc774\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uc774 \uc13c\uc11c \ub370\uc774\ud130 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub099\uad00\uc801 \uc7a0\uae08\uacfc \ube44\uad00\uc801 \uc7a0\uae08\uc744 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h3>\ub099\uad00\uc801 \uc7a0\uae08<\/h3>\n<p><span style=\"font-weight: 400;\">\ub099\uad00\uc801 \uc7a0\uae08\uc740 Couchbase\uc5d0\uc11c \uc13c\uc11c \ub370\uc774\ud130\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uac04\ub2e8\ud55c \uc811\uadfc \ubc29\uc2dd\uc73c\ub85c, \ub2e8 \uc138 \ub2e8\uacc4\ub9cc \uac70\uce58\uba74 \ub429\ub2c8\ub2e4:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uadf8\ub9ac\uace0 <\/span><b>\uccab \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\"> \ub294 \ubb38\uc11c \uac12\uacfc \ud574\ub2f9 \uba54\ud0c0\ub370\uc774\ud130(CAS \uac12 \ud3ec\ud568)\ub97c \ud3ec\ud568\ud558\ub294 \ud0a4\ub85c \ubb38\uc11c\ub97c \uac80\uc0c9\ud558\ub294 \uc791\uc5c5\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uac80\uc0c9\uc774 \uc644\ub8cc\ub418\uba74 <\/span><b>\ub450 \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\"> \ub294 \ud0c0\uc784\uc2a4\ud0ec\ud504\uac00 \ub4e4\uc5b4\uc624\ub294 \ud0c0\uc784\uc2a4\ud0ec\ud504\ubcf4\ub2e4 \uc624\ub798\ub41c \uac83\uc778\uc9c0 \ud655\uc778\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uadf8\ub807\ub2e4\uba74 <\/span><b>\uc138 \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\"> \ub294 \ubb38\uc11c\ub97c \uc0c8 \uac12\uc73c\ub85c \ubc14\uafb8\uace0 CAS \uac12\uc744 \ud568\uaed8 \uc81c\ucd9c\ud558\ub294 \uc791\uc5c5\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc5ec\uae30\uc11c \"\ub099\uad00\uc801\uc778\" \ubd80\ubd84\uc774 \ub4f1\uc7a5\ud569\ub2c8\ub2e4. CAS \uac12\uc774 \uc77c\uce58\ud558\uba74 \uc791\uc5c5\uc774 \uc131\uacf5\ud55c \uac83\uc774\uace0 \uc13c\uc11c \ub370\uc774\ud130\uac00 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4. \uadf8\ub7ec\ub098 CAS \uac12\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc73c\uba74 \ub9c8\uc9c0\ub9c9 \uc77d\uae30 \uc791\uc5c5 \uc774\ud6c4 \uc13c\uc11c \ub370\uc774\ud130\uac00 (\ub2e4\ub978 \uc2a4\ub808\ub4dc\/\ud504\ub85c\uc138\uc2a4\uc5d0 \uc758\ud574) \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uc774 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \uc635\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. <\/span><b>\uc791\uc5c5\uc744 \ub2e4\uc2dc \uc2dc\ub3c4\ud569\ub2c8\ub2e4.<\/b><span style=\"font-weight: 400;\"> \ub97c \uc124\uc815\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \ud2b9\uc815 \uc13c\uc11c \ubb38\uc11c\uac00 \uc790\uc8fc \uc5c5\ub370\uc774\ud2b8\ub420 \uac83\uc73c\ub85c \uc608\uc0c1\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub099\uad00\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4(\uc7ac\uc2dc\ub3c4\uac00 \ub4dc\ubb3c\uae30 \ub54c\ubb38\uc5d0).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub2e4\uc74c\uc740 \uac04\ub2e8\ud55c \uc7ac\uc2dc\ub3c4 \ub85c\uc9c1\uc744 \uc0ac\uc6a9\ud55c \ub099\uad00\uc801 \uc7a0\uae08\uc758 \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\/\/ get existing sensor reading\r\nvar currentDoc = await _collection.GetAsync(sensorId);\r\nvar currentDocCas = currentDoc.Cas;\r\nvar currentReading = currentDoc.ContentAs&lt;NauticalSpeed&gt;();\r\n\r\n\/\/ check timestamps\r\nif (newSensorReading.TimeStamp &gt; currentReading.TimeStamp)\r\n{\r\n\u00a0 \u00a0 \/\/ incoming reading is newer, update the record\r\n\u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is newer. Updating.\");\r\n\u00a0 \u00a0 var retries = 3;\r\n\u00a0 \u00a0 while (retries &gt; 0)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 try\r\n\u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await _collection.ReplaceAsync(sensorId, newSensorReading, options =&gt; options.Cas(currentDocCas));\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return;\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 catch (CasMismatchException)\r\n\u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Console.WriteLine($\"CAS mismatch. Retries remaining: {retries}\");\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 retries--;\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n\u00a0 \u00a0 Console.WriteLine(\"Retry max exceeded. Sensor reading was not updated.\");\r\n}\r\nelse\r\n{\r\n\u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is not new. Ignoring.\");\r\n\u00a0 \u00a0 \/\/ incoming reading is not newer, so do nothing\r\n\u00a0 \u00a0 \/\/ (or possibly update a log, or whatever else you want to do)\r\n}<\/pre>\n<h3>\ube44\uad00\uc801 \uc7a0\uae08<\/h3>\n<p><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/concurrent-document-mutations.html#pessimistic-locking\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\ube44\uad00\uc801 \uc7a0\uae08<\/span><\/a><span style=\"font-weight: 400;\"> \ub294 \uac19\uc740 \ubb38\uc81c\uc5d0 \uc811\uadfc\ud558\ub294 \ub610 \ub2e4\ub978 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ub099\uad00\uc801 \uc7a0\uae08\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc138 \ub2e8\uacc4\ub85c \uad6c\uc131\ub418\uc9c0\ub9cc \uc57d\uac04\uc758 \ucc28\uc774\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uadf8\ub9ac\uace0 <\/span><b>\uccab \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\"> \ub294 <\/span><i><span style=\"font-weight: 400;\">\uac00\uc838\uc624\uae30 \ubc0f \uc7a0\uae08<\/span><\/i><span style=\"font-weight: 400;\"> \ud0a4\ubcc4\ub85c \ubb38\uc11c\ub97c \uc7a0\uadf8\uace0 CAS \uac12\uc744 \uae30\ub85d\ud569\ub2c8\ub2e4. \ubb38\uc11c\ub97c \ub2e8\uc21c\ud788 \uc77d\ub294 \ub099\uad00\uc801 \uc7a0\uae08\uacfc \ub2ec\ub9ac, \ube44\uad00\uc801 \uc7a0\uae08\uc5d0\uc11c\ub294 \ubb38\uc11c\uac00 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae41\ub2c8\ub2e4. \uc989, \ubb38\uc11c\uac00 \uc7a0\uae08 \ud574\uc81c\ub420 \ub54c\uae4c\uc9c0 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uac00 \ubb38\uc11c\ub97c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uc5d0\uc11c <\/span><b>\ub450 \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\">\ub099\uad00\uc801 \uc7a0\uae08\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ud0c0\uc784\uc2a4\ud0ec\ud504\uac00 \ub4e4\uc5b4\uc624\ub294 \ud0c0\uc784\uc2a4\ud0ec\ud504\ubcf4\ub2e4 \uc624\ub798\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">\uadf8\ub807\ub2e4\uba74 <\/span><b>\uc138 \ubc88\uc9f8 \ub2e8\uacc4<\/b><span style=\"font-weight: 400;\">\ub97c \uc785\ub825\ud558\uba74 \ubb38\uc11c\uac00 \uc0c8 \uac12\uc73c\ub85c \ub300\uccb4\ub418\uace0 CAS \uac12\uacfc \ud568\uaed8 \uc81c\ucd9c\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ube44\uad00\uc801 \uc7a0\uae08\uc758 1\ub2e8\uacc4\uc5d0\uc11c\ub294 \ud0c0\uc784\uc544\uc6c3 \uae30\uac04\ub3c4 \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uc65c \uadf8\ub7f4\uae4c\uc694? \uc624\ub958\ub098 \ucda9\ub3cc\ub85c \uc778\ud574 3\ub2e8\uacc4\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc73c\uba70, \uacb0\uad6d \ubb38\uc11c\uac00 \uc7a0\uae08 \ud574\uc81c\ub418\uc5b4\uc57c \ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc13c\uc11c \ubb38\uc11c\uac00 \ub9ce\uc774 \uc5c5\ub370\uc774\ud2b8\ub420 \uac83\uc73c\ub85c \uc608\uc0c1\ud55c\ub2e4\uba74 \ube44\uad00\uc801\uc73c\ub85c \uc811\uadfc\ud558\ub294 \uac83\uc774 \ub354 \ub098\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc7a0\uae08\uc73c\ub85c \uc778\ud574 \ubb38\uc11c\uac00 \uc7a0\uae08 \ud574\uc81c\ub418\uae30\ub97c \uae30\ub2e4\ub9ac\ub294 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc758 \uc9c0\uc5f0 \uc2dc\uac04\uc774 \ub2e8\ucd95\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ube44\uad00\uc801 \uc7a0\uae08\uc758 \uc608\ub97c \ub4e4\uc5b4 \uc124\uba85\ud558\uc790\uba74 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\/\/ get current sensor data\r\nvar maxLockTime = TimeSpan.FromSeconds(30);\r\nvar currentDoc = await _collection.GetAndLockAsync(sensorId, maxLockTime);\r\nvar currentDocCas = currentDoc.Cas;\r\nvar currentReading = currentDoc.ContentAs&lt;NauticalSpeed&gt;();\r\n\r\n\/\/ check timestamps against new reading\r\nif (newSensorReading.TimeStamp &gt; currentReading.TimeStamp)\r\n{\r\n\u00a0 \u00a0 \/\/ incoming reading is newer, update the record\r\n\u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is newer. Updating.\");\r\n\u00a0 \u00a0 await _collection.ReplaceAsync(sensorId, newSensorReading, options =&gt; options.Cas(currentDocCas));\r\n\u00a0 \u00a0 return;\r\n}\r\nelse\r\n{\r\n\u00a0 \u00a0 await _collection.UnlockAsync(sensorId, currentDocCas);\r\n\u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is not new. Ignoring.\");\r\n\u00a0 \u00a0 \/\/ incoming reading is not newer, so do nothing\r\n\u00a0 \u00a0 \/\/ (or possibly update a log, or whatever else you want to do)\r\n}<\/pre>\n<h3>CAS \uc7a0\uae08 \ud2b8\ub808\uc774\ub4dc \uc624\ud504<\/h3>\n<p><span style=\"font-weight: 400;\">CAS \uc7a0\uae08\uacfc \uad00\ub828\ud574\uc11c\ub294 \uace0\ub824\ud574\uc57c \ud560 \uc7a5\ub2e8\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ub099\uad00\uc801 \uc7a0\uae08\uc740 \ucda9\ub3cc\uc774 \ub4dc\ubb3c \ub54c \uc798 \uc791\ub3d9\ud558\uc9c0\ub9cc \uc7ac\uc2dc\ub3c4 \uac00\ub2a5\uc131\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uc801\uc808\ud55c \uc7ac\uc2dc\ub3c4 \ub85c\uc9c1\uc744 \uad6c\ud604\ud574\uc57c \ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774\ub7ec\ud55c \uc808\ucda9\uc810\uc744 \uc704\ud574 \uace0\uae09 \ub610\ub294 \ud2b9\uc218 \uc7ac\uc2dc\ub3c4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0\uc11c\ub294 \uc7ac\uc2dc\ub3c4 \ud69f\uc218\uac00 \ub9ce\uac70\ub098 \ud310\ub3c5\uac12\uc774 \ub9e4\uc6b0 \uc624\ub798\ub41c \uacbd\uc6b0 \uc218\uc2e0 \uc13c\uc11c \ud310\ub3c5\uac12\uc744 '\ud3ec\uae30'\ud558\uace0 \ud3d0\uae30\ud558\ub294 \uac83\uc774 \ud5c8\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ubc18\uba74 \ube44\uad00\uc801 \uc7a0\uae08\uc740 '\ub354 \uc548\uc804\ud55c' \uc811\uadfc \ubc29\uc2dd\uc774\uc9c0\ub9cc \uc7a0\uae08\uc774 \uc131\ub2a5\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\uc744 \uba85\ud655\ud788 \uc774\ud574\ud574\uc57c \ud569\ub2c8\ub2e4. \uc7a0\uadf8\uba74 \ubb38\uc11c\uac00 \uc7a0\uae08 \ud574\uc81c\ub420 \ub54c\uae4c\uc9c0 \uae30\ub2e4\ub824\uc57c \ud558\ub294 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc758 \ub300\uae30 \uc2dc\uac04\uc774 \ub298\uc5b4\ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uc0b0 \uac70\ub798<\/h2>\n<p><span style=\"font-weight: 400;\">\uc13c\uc11c \uc5c5\ub370\uc774\ud2b8 \ubb38\uc81c\uc5d0 \ub300\ud55c \ub610 \ub2e4\ub978 \uc7a0\uc7ac\uc801 \ud574\uacb0\ucc45\uc740 ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc811\uadfc \ubc29\uc2dd\uc740 \uc774 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0\uc11c \ub2e8\uc77c \ubb38\uc11c\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \ub370\ub294 \uacfc\ub3c4\ud560 \uc218 \uc788\uc9c0\ub9cc \uc5ec\ub7ec \ubb38\uc11c\ub97c \uc6d0\uc790 \ub2e8\uc704\ub85c \uc5c5\ub370\uc774\ud2b8\ud574\uc57c \ud558\ub294 \ub2e4\ub978 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0\uc11c\ub294 \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc13c\uc11c \ub370\uc774\ud130\uc758 \ubb38\uc81c\uc810\uc740 \ube60\ub978 \uc18d\ub3c4\ub85c \ub4e4\uc5b4\uc62c \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ud604\uc7ac \ub370\uc774\ud130\ub97c \ud655\uc778\ud558\uace0 \ub4e4\uc5b4\uc624\ub294 \uc13c\uc11c \ub370\uc774\ud130\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uc0ac\uc774\uc5d0 \ub2e4\ub978 \uc218\uce58\uac00 \ub4e4\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubb38\uc81c\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud574 ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc870\uac74\ubd80\ub85c \uc5c5\ub370\uc774\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc544\ub798 \uc0d8\ud50c \ucf54\ub4dc\ub294 ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc13c\uc11c \ubb38\uc11c\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. \uc774 \ud2b8\ub79c\uc7ad\uc158\uc740 \uc13c\uc11c\ub2f9 \ud55c \ubc88\uc5d0 \ud558\ub098\uc758 \uc5c5\ub370\uc774\ud2b8 \uc791\uc5c5\ub9cc \uc218\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\uc5ec \uc5ec\ub7ec \uac1c\uc758 \uc218\uc2e0 \uc13c\uc11c \ud310\ub3c5\uac12\uc774 \uc11c\ub85c \uac04\uc12d\ud558\ub294 \uac83\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">var transaction = Transactions.Create(_cluster, TransactionConfigBuilder.Create()\r\n\u00a0 \u00a0 .DurabilityLevel(DurabilityLevel.None)); \/\/ set to 'none' because I'm using a single-node dev cluster\r\n\u00a0 \u00a0 \/\/ for more details see: https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/distributed-acid-transactions-from-the-sdk.html\r\n\r\nawait transaction.RunAsync(async (context) =&gt;\r\n{\r\n\u00a0 \u00a0 \/\/ get existing sensor reading\r\n\u00a0 \u00a0 var currentDoc = await context.GetAsync(_collection, sensorId);\r\n\u00a0 \u00a0 var currentReading = currentDoc.ContentAs&lt;NauticalSpeed&gt;();\r\n\r\n\u00a0 \u00a0 \/\/ check timestamps\r\n\u00a0 \u00a0 if (newSensorReading.TimeStamp &gt; currentReading.TimeStamp)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ incoming reading is newer, update the record\r\n\u00a0 \u00a0 \u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is newer. Updating.\");\r\n\u00a0 \u00a0 \u00a0 \u00a0 await context.ReplaceAsync(currentDoc, newSensorReading);\r\n\u00a0 \u00a0 }\r\n\u00a0 \u00a0 else\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 Console.WriteLine(\"Incoming sensor reading is not new. Ignoring.\");\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ incoming reading is not newer, so do nothing\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ (or possibly update a log, or whatever else you want to do)\r\n\u00a0 \u00a0 }\r\n});<\/pre>\n<h2>\uc0b0 \uac70\ub798 \ud2b8\ub808\uc774\ub4dc \uc624\ud504<\/h2>\n<p><span style=\"font-weight: 400;\">\uc131\ub2a5\uc744 \uadf9\ub300\ud654\ud558\ub824\uba74 \uac00\ub2a5\ud55c \ud55c \ud0a4-\uac12 API\ub97c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 Couchbase\uc5d0\uc11c \ubd84\uc0b0 ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc870\uc815\ud558\uae30 \uc704\ud574 (\ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c) \ucd94\uac00\ub85c \ud0a4-\uac12 \uc791\uc5c5\uc774 \uc2e4\ud589\ub418\uae30 \ub54c\ubb38\uc5d0 \uc57d\uac04\uc758 \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Couchbase\uc758 \ub370\uc774\ud130\ub294 \uc790\ub3d9\uc73c\ub85c \ubd84\uc0b0\ub418\ubbc0\ub85c \ub124\ud2b8\uc6cc\ud06c\ub97c \ud1b5\ud574 \uc5ec\ub7ec \uc11c\ubc84\ub85c \uc791\uc5c5\uc774 \uc870\uc815\ub420 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CAS \uc791\uc5c5\ubcf4\ub2e4 ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \uc5bb\uc744 \uc218 \uc788\ub294 \ud55c \uac00\uc9c0 \uc774\uc810\uc740 Couchbase \ud2b8\ub79c\uc7ad\uc158 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 \uc774\ubbf8 \uc815\uad50\ud55c \uc7ac\uc2dc\ub3c4 \ub85c\uc9c1\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uc774\ub294 \uc7ac\uc2dc\ub3c4 \ub85c\uc9c1\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubc29\ubc95\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \uc5ec\ub7ec \uc13c\uc11c \ubb38\uc11c\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uac83\uc774 \ud3ec\ud568\ub41c \uacbd\uc6b0 ACID \ud2b8\ub79c\uc7ad\uc158\uc774 \uad8c\uc7a5\ub429\ub2c8\ub2e4(\uc2e4\uc81c\ub85c\ub294 \ud544\uc218\uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4).<\/span><\/p>\n<h2>SQL++ \uc5c5\ub370\uc774\ud2b8 \uc791\uc5c5<\/h2>\n<p><span style=\"font-weight: 400;\">\uc870\uac74\ubd80 \uc5c5\ub370\uc774\ud2b8\ub97c \uc218\ud589\ud558\ub294 \ub610 \ub2e4\ub978 \uc811\uadfc \ubc29\uc2dd\uc740 SQL++ UPDATE \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub2e4\uc74c\uc740 \uad6c\ud604 \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">var retries = 3;\r\nwhile (retries &gt; 0)\r\n{\r\n\u00a0 \u00a0 try\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 await _cluster.QueryAsync&lt;dynamic&gt;(@\"UPDATE sensordata s\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 USE KEYS $sensorId\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 SET s.speed = $newSpeed, s.unit = $newUnit, s.timeStamp = $newTimeStamp\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 WHERE DATE_DIFF_STR($newTimeStamp, s.timeStamp, 'millisecond') &gt; 0\", options =&gt;\r\n\u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 options.Parameter(\"sensorId\", sensorId);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 options.Parameter(\"newSpeed\", sensorReading.Speed);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 options.Parameter(\"newUnit\", sensorReading.Unit);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 options.Parameter(\"newTimeStamp\", sensorReading.TimeStamp);\r\n\u00a0 \u00a0 \u00a0 \u00a0 });\r\n\u00a0 \u00a0 \u00a0 \u00a0 return;\r\n\u00a0 \u00a0 }\r\n\u00a0 \u00a0 c atch (CasMismatchException)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 Console.WriteLine($\"UPDATE CAS mismatch, tries remaining: {retries}\");\r\n\u00a0 \u00a0 \u00a0 \u00a0 retries--;\r\n\u00a0 \u00a0 }\r\n}\r\nConsole.WriteLine(\"Max retries exceeded, sensor not updated\");<\/pre>\n<p><i><span style=\"font-weight: 400;\">(\ucc38\uace0\ub85c \uc5d0\ud3ec\ud06c \ud0c0\uc784\uc2a4\ud0ec\ud504\ub97c \uc0ac\uc6a9\ud558\uba74 \uc131\ub2a5\uc774 \ud5a5\uc0c1\ub420 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4).<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">\ucf54\ub4dc\uc5d0\uc11c \uc9d0\uc791\ud560 \uc218 \uc788\ub4ef\uc774, SQL++ \ucffc\ub9ac\ub294 \uc55e\uc11c KV API \uc608\uc81c\uc5d0\uc11c\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc2e4\uc81c\ub85c \ub4a4\uc5d0\uc11c CAS\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>SQL++ \ud2b8\ub808\uc774\ub4dc \uc624\ud504<\/h2>\n<p><span style=\"font-weight: 400;\">\uc870\uac74\ubd80 \uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud55c SQL++ \uc811\uadfc \ubc29\uc2dd\uc5d0\ub294 \uba87 \uac00\uc9c0 \ub2e8\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ube44\ub85d <\/span><em><span style=\"font-weight: 400;\">\uc0ac\uc6a9 \ud0a4<\/span><\/em><span style=\"font-weight: 400;\"> \uc808\uc744 \uc0ac\uc6a9\ud558\uba74 \uc778\ub371\uc2a4\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc9c0\ub9cc \ucffc\ub9ac\ub294 \uc5ec\uc804\ud788 \ucffc\ub9ac \uc11c\ube44\uc2a4\uc5d0\uc11c \uad6c\ubb38 \ubd84\uc11d\ud574\uc57c \ud569\ub2c8\ub2e4. <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/services\/query-service.html#query-execution\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\ub9ce\uc740 \ub2e8\uacc4\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/span><\/a><span style=\"font-weight: 400;\">. \ub2e4\ub978 \ucef4\ud3ec\ub10c\ud2b8\uac00 \uc774\ubbf8 \ucffc\ub9ac \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \uacbd\uc6b0 \uc2dc\uc2a4\ud15c\uc5d0 \ucd94\uac00\uc801\uc778 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc804\ubc18\uc801\uc73c\ub85c SQL++ \uc811\uadfc \ubc29\uc2dd\uc740 \ucffc\ub9ac \uad6c\ubb38 \ubd84\uc11d\uc5d0 \ub300\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ucd94\uac00\ub41c\ub2e4\ub294 \uc810\uc5d0\uc11c KV API\uc640 \ub9e4\uc6b0 \uc720\uc0ac\ud558\ubbc0\ub85c, SQL++\ub85c \ud45c\ud604\ub418\ub294 \ubcf5\uc7a1\ud55c \ub85c\uc9c1\uc774 \ud2b9\ubcc4\ud788 \ud544\uc694\ud558\uac70\ub098 KV API\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub294 \uacbd\uc6b0\uac00 \uc544\ub2c8\ub77c\uba74 \ucd5c\uc120\uc758 \uc120\ud0dd\uc774 \uc544\ub2d0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uc774\ubca4\ud2b8<\/h2>\n<p><span style=\"font-weight: 400;\">\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub8e8\uace0\uc790 \ud558\ub294 \uc811\uadfc \ubc29\uc2dd\uc740 \uc774\ubca4\ud2b8 \ud65c\uc6a9\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CouchBase\uc758 \uc774\ubca4\ud2b8\ub294 \ub370\uc774\ud130 \ubcc0\uacbd \uc774\ubca4\ud2b8\uc5d0 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc751\ub2f5\ud558\ub294 JavaScript \ud568\uc218\ub97c \uc791\uc131\ud558\uace0 \uc774\ub97c CouchBase \ud074\ub7ec\uc2a4\ud130\uc5d0 \ubc30\ud3ec\ud558\ub294 \uac83\uc73c\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774 \ud2b9\uc815 \uc0ac\uc6a9 \uc0ac\ub840\uc758 \uacbd\uc6b0, \ucc98\uc74c\uc5d0\ub294 \uc13c\uc11c \ud310\ub3c5\uac12\uc758 \uc704\uce58\ub85c '\uc2a4\ud14c\uc774\uc9d5' \uceec\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc218\uc2e0\ub418\ub294 \uc13c\uc11c \ud310\ub3c5\uac12\uc740 '\uc2a4\ud14c\uc774\uc9d5' \uceec\ub809\uc158\uc5d0 \uae30\ub85d\ub429\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc774\ubca4\ud2b8 <em>\uc628\uc5c5\ub370\uc774\ud2b8<\/em> \ud568\uc218\ub294 \uc0c8\ub85c\uc6b4 \uc13c\uc11c \ud310\ub3c5\uac12\uc5d0 \uc751\ub2f5\ud569\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uadf8\ub9ac\uace0 <em>\uc628\uc5c5\ub370\uc774\ud2b8<\/em> \ud568\uc218\ub294 \"\ud604\uc7ac\" \uceec\ub809\uc158\uc758 \ud574\ub2f9 \ubb38\uc11c\uc5d0 \ub300\ud574 \ud0c0\uc784\uc2a4\ud0ec\ud504\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\ud0c0\uc784\uc2a4\ud0ec\ud504\uac00 \ub354 \ucd5c\uc2e0\uc778 \uacbd\uc6b0 '\ud604\uc7ac' \uceec\ub809\uc158\uc758 \ubb38\uc11c\uac00 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><em><span style=\"font-weight: 400;\">\uc628\uc5c5\ub370\uc774\ud2b8<\/span><\/em><span style=\"font-weight: 400;\"> \ubb38\uc11c\uac00 \uc0dd\uc131\ub418\uba74 \uc2e4\ud589\ub429\ub2c8\ub2e4. <\/span><i><span style=\"font-weight: 400;\">\ub610\ub294<\/span><\/i><span style=\"font-weight: 400;\"> \uc5c5\ub370\uc774\ud2b8\ub418\ubbc0\ub85c \uc774\uc804 \ubb38\uc11c\ub97c \uc2a4\ud14c\uc774\uc9d5 \uc0c1\ud0dc\ub85c \ub450\uc5b4\ub3c4 \uad1c\ucc2e\uc2b5\ub2c8\ub2e4(\uc774\ub807\uac8c \ud558\uba74 \uc774\ubca4\ud2b8 \ucf54\ub4dc\uac00 \uac04\uc18c\ud654\ub429\ub2c8\ub2e4). \ub610\ud55c \uceec\ub809\uc158\uc5d0 TTL\uc744 \uc124\uc815\ud558\uc5ec \ud55c\ub3d9\uc548 \uc13c\uc11c \uc218\uce58\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uc9c0 \uc54a\uc73c\uba74 \uc790\ub3d9\uc73c\ub85c \uc815\ub9ac\ub418\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub2e4\uc74c\uc740 \uc774 \ub514\uc790\uc778\uacfc \ud568\uaed8 \uc791\ub3d9\ud558\ub294 \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n\u00a0 \u00a0 \/\/ Only process documents with a \"timestamp\"\r\n\u00a0 \u00a0 if (doc.timestamp) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Extract timestamp and sensor ID from the staged document\r\n\u00a0 \u00a0 \u00a0 \u00a0 var stagedTimestamp = doc.timestamp;\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ note that this will loop indefinitely\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ but you can also limit it to a certain number of reties if you wish\r\n\u00a0 \u00a0 \u00a0 \u00a0 while(true) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Get the current document for the same sensor ID from the \"destination\" collection\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var currentDoc = dst_col[meta.id];\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ If there is no current document, or the staged timestamp is later than the current timestamp, update the current document\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (!currentDoc || stagedTimestamp &gt; currentDoc.timestamp) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ dst_col is a READ+WRITE ALIAS\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 dst_col[meta.id] = doc;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ the whole document is overwritten, but you can also choose to override certain fields if you wish\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ src_col is a READ ALIAS\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var result = couchbase.get(src_col, meta);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (result.success) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (result.meta.cas == meta.cas) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ the document was unchanged in the stage collection we are done\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 doc = result.doc;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 stagedTimestamp = doc.timestamp;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (result.error.key_not_found) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ this might be okay, assuming 'staging' collection gets cleaned up or has a TTL\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ again, this will depend on what kind of retry logic you have\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 log('failure could not read stage adv. get: id',meta.id,'result',result);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\ud574\ub2f9 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0 \ub300\ud55c \uad6c\uc131\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-14250\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/image_2023-04-04_132102606-674x1024.png\" alt=\"Eventing configuration window in Couchbase\" width=\"674\" height=\"1024\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/image_2023-04-04_132102606-674x1024.png 674w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/image_2023-04-04_132102606-198x300.png 198w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/image_2023-04-04_132102606-768x1167.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/image_2023-04-04_132102606-300x456.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/image_2023-04-04_132102606.png 950w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/p>\n<h2>\uc774\ubca4\ud2b8 \ud2b8\ub808\uc774\ub4dc \uc624\ud504<\/h2>\n<p><span style=\"font-weight: 400;\">\uc774 \ucf54\ub4dc\uc5d0\uc11c \ub099\uad00\uc801\uc778 CAS \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub418\uace0 \uc788\uc74c\uc744 \ub2e4\uc2dc \ud55c \ubc88 \uc8fc\ubaa9\ud558\uc138\uc694. \uc0ac\uc2e4 \uc774 \ucf54\ub4dc\ub294 \uc55e\uc11c KV API\ub97c \uc0ac\uc6a9\ud55c \ucf54\ub4dc\uc758 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ubc84\uc804\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ud55c \uac00\uc9c0 \uc911\uc694\ud55c \ucc28\uc774\uc810\uc740 \uc774 \uae30\ub2a5\uc774 Couchbase \ud074\ub7ec\uc2a4\ud130 \uc790\uccb4\uc5d0\uc11c \uc2e4\ud589\ub41c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774\uac83\uc774 \ubc14\ub85c \uc774\ubca4\ud2b8 \uae30\ub2a5\uc758 \ud575\uc2ec \uc774\uc810\uc785\ub2c8\ub2e4. \uc13c\uc11c \ub370\uc774\ud130\uc758 \ucd9c\ucc98\uac00 \uc5b4\ub514\ub4e0 \uc0c1\uad00\uc5c6\uc774 Couchbase\uc758 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc740 \ub370\uc774\ud130\uac00 \ucc98\ub9ac\ub418\ub3c4\ub85d \ubcf4\uc7a5\ud569\ub2c8\ub2e4. \ub85c\uc9c1\uc744 \ub370\uc774\ud130\uc5d0 \uac00\uae5d\uac8c \uc720\uc9c0\ud569\ub2c8\ub2e4. \ub300\uc2e0 KV API\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub450 \uac1c \uc774\uc0c1\uc774\ub77c\uba74 \ub3d9\uc77c\ud55c \ucf54\ub4dc\ub97c \ub450 \uac1c \uc774\uc0c1 \uad6c\ud604\ud574\uc57c \ud55c\ub2e4\ub294 \ub73b\uc785\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \ub85c\uc9c1\uc744 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \uc5c5\ub370\uc774\ud2b8\ud574\uc57c \ud558\ubbc0\ub85c \ub85c\uc9c1\uc774 \ubcc0\uacbd\ub420 \ub54c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uadf8\ub7ec\ub098 SQL++\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc774\ubca4\ud2b8\uc5d0\ub3c4 \uc57d\uac04\uc758 \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc774 \uacbd\uc6b0\uc5d0\ub294 \uc5ec\ub7ec \uceec\ub809\uc158\uacfc \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uc790\uccb4\uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c Couchbase\uc758 \ucd94\uac00 \ub178\ub4dc\uac00 \ud544\uc694\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ud604\uc7ac Couchbase Server \ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c\ub294 Eventing\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h2>\uc694\uc57d<\/h2>\n<p><span style=\"font-weight: 400;\">Couchbase\ub294 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub9de\ub294 \uc635\uc158\uacfc \uc808\ucda9\uc548\uc744 \uc81c\uacf5\ud558\ub294 \ub2e4\uc911 \ubaa8\ub378 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc785\ub2c8\ub2e4. \uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \uc13c\uc11c \ub370\uc774\ud130 \uc5c5\ub370\uc774\ud2b8\uc758 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub300\ud574 4\uac00\uc9c0 \ub370\uc774\ud130 \uc561\uc138\uc2a4 \ud328\ud134\uacfc \uac01\uac01\uc758 \uc7a5\ub2e8\uc810\uc744 \ub2e4\ub8e8\uc5c8\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">KV API - \uc131\ub2a5\uc774 \ub6f0\uc5b4\ub098\uace0 \uac04\ub2e8\ud558\uc9c0\ub9cc \uc77c\ubd80 \uc7ac\uc2dc\ub3c4 \ub85c\uc9c1\uc774 \ud544\uc694\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">ACID \ud2b8\ub79c\uc7ad\uc158 - \uc548\uc815\uc801\uc774\uc9c0\ub9cc \uc624\ubc84\ud5e4\ub4dc\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">SQL++ - \uce5c\uc219\ud558\uace0 \uc120\uc5b8\uc801\uc774\uc9c0\ub9cc \ucffc\ub9ac \uad6c\ubb38 \ubd84\uc11d \ubc0f \uc2e4\ud589 \uc624\ubc84\ud5e4\ub4dc\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc774\ubca4\ud2b8 \ucc98\ub9ac - \ub370\uc774\ud130\uc5d0 \uac00\uae5d\uace0 \ub85c\uc9c1\uc744 \ud1b5\ud569\ud558\uc9c0\ub9cc \uc774\ubca4\ud2b8 \ucc98\ub9ac \uc11c\ube44\uc2a4 \ubc0f \ucd94\uac00 \uc218\uc9d1\uc5d0 \ub300\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\ubaa8\ub4e0 \ucf54\ub4dc \uc0d8\ud50c\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <\/span><a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/143SensorUpdateMultiModel\/src\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">GitHub\uc5d0\uc11c \uc0ac\uc6a9 \uac00\ub2a5<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub2e4\ub978 \uc811\uadfc \ubc29\uc2dd\uc744 \uc0dd\uac01\ud574 \ubcf4\uc168\ub098\uc694? \uc544\ub798\uc5d0 \ub313\uae00\uc744 \ub0a8\uae30\uac70\ub098 \uacf5\uc720\ud574 \uc8fc\uc138\uc694. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/community\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ub514\uc2a4\ucf54\ub4dc<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Couchbase has become a popular choice for IoT use cases, thanks to its flexible multi-model data management capabilities. Recently, I was working with a customer in the cruise industry that had a unique challenge &#8211; they needed Couchbase to receive [&hellip;]<\/p>","protected":false},"author":71,"featured_media":14251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,2273,1812,2201],"tags":[9499,9803,1337,9247,9600],"ppma_author":[8937],"class_list":["post-14249","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-eventing","category-n1ql-query","category-tools-sdks","tag-acid-transactions","tag-cas-locking","tag-iot","tag-key-value-store","tag-multimodel"],"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>Updating Sensor Data: Exploring Couchbase&#039;s Multi-Model Options<\/title>\n<meta name=\"description\" content=\"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.\" \/>\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\/updating-sensor-data-exploring-couchbases-multi-model-options\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Updating Sensor Data: Exploring Couchbase&#039;s Multi-Model Options\" \/>\n<meta property=\"og:description\" content=\"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/updating-sensor-data-exploring-couchbases-multi-model-options\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-04T20:27:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:00:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Updating Sensor Data: Exploring Couchbase&#8217;s Multi-Model Options\",\"datePublished\":\"2023-04-04T20:27:26+00:00\",\"dateModified\":\"2025-06-14T06:00:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/\"},\"wordCount\":1983,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png\",\"keywords\":[\"ACID transactions\",\"CAS locking\",\"IoT\",\"key-value store\",\"multimodel\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"Eventing\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/\",\"name\":\"Updating Sensor Data: Exploring Couchbase's Multi-Model Options\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png\",\"datePublished\":\"2023-04-04T20:27:26+00:00\",\"dateModified\":\"2025-06-14T06:00:08+00:00\",\"description\":\"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Updating Sensor Data: Exploring Couchbase&#8217;s Multi-Model Options\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Updating Sensor Data: Exploring Couchbase's Multi-Model Options","description":"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.","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\/updating-sensor-data-exploring-couchbases-multi-model-options\/","og_locale":"ko_KR","og_type":"article","og_title":"Updating Sensor Data: Exploring Couchbase's Multi-Model Options","og_description":"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/updating-sensor-data-exploring-couchbases-multi-model-options\/","og_site_name":"The Couchbase Blog","article_published_time":"2023-04-04T20:27:26+00:00","article_modified_time":"2025-06-14T06:00:08+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png","type":"image\/png"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"12\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Updating Sensor Data: Exploring Couchbase&#8217;s Multi-Model Options","datePublished":"2023-04-04T20:27:26+00:00","dateModified":"2025-06-14T06:00:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/"},"wordCount":1983,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png","keywords":["ACID transactions","CAS locking","IoT","key-value store","multimodel"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","Eventing","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/","url":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/","name":"Updating Sensor Data: Exploring Couchbase's Multi-Model Options","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png","datePublished":"2023-04-04T20:27:26+00:00","dateModified":"2025-06-14T06:00:08+00:00","description":"Choosing the best multi-model approach for updating sensor readings depends on the size and frequency of the updates, the level of concurrency, and more.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/04\/couchbase-multi-model-sensor-data.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/updating-sensor-data-exploring-couchbases-multi-model-options\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Updating Sensor Data: Exploring Couchbase&#8217;s Multi-Model Options"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"\ub9e4\ud29c \uadf8\ub85c\ube0c\uc2a4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves\ub294 \ucf54\ub529\uc744 \uc88b\uc544\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. C#, jQuery, PHP \ub4f1 \ubb34\uc5c7\uc774\ub4e0 \ud480 \ub9ac\ud018\uc2a4\ud2b8\ub97c \uc81c\ucd9c\ud560 \uc815\ub3c4\ub85c \ucf54\ub529\uc744 \uc88b\uc544\ud569\ub2c8\ub2e4. 90\ub144\ub300\uc5d0 \ubd80\ubaa8\ub2d8\uc758 \ud53c\uc790 \uac00\uac8c\ub97c \uc704\ud574 QuickBASIC POS \uc571\uc744 \ub9cc\ub4e0 \uc774\ud6c4\ub85c \uc804\ubb38\uc801\uc73c\ub85c \ucf54\ub529\uc744 \ud574\uc654\uc2b5\ub2c8\ub2e4. \ud604\uc7ac Couchbase\uc758 \uc120\uc784 \uc81c\ud488 \ub9c8\ucf00\ud305 \uad00\ub9ac\uc790\ub85c \uc77c\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uac00 \uc2dc\uac04\uc5d0\ub294 \uac00\uc871\uacfc \ud568\uaed8 \ucd95\uad6c \uacbd\uae30\ub97c \uad00\ub78c\ud558\uace0 \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \ucc38\uc5ec\ud558\uba70 \uc2dc\uac04\uc744 \ubcf4\ub0c5\ub2c8\ub2e4. \uadf8\ub294 .NET\uc758 AOP, .NET\uc758 \ud504\ub85c \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4, Pluralsight \uc800\uc790, Microsoft MVP\uc758 \uc800\uc790\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves\ub294 \ucf54\ub529\uc744 \uc88b\uc544\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4.  C#, jQuery, PHP \ub4f1 \ubb34\uc5c7\uc774\ub4e0 \ud480 \ub9ac\ud018\uc2a4\ud2b8\ub97c \uc81c\ucd9c\ud560 \uc815\ub3c4\ub85c \ucf54\ub529\uc744 \uc88b\uc544\ud569\ub2c8\ub2e4.  90\ub144\ub300\uc5d0 \ubd80\ubaa8\ub2d8\uc758 \ud53c\uc790 \uac00\uac8c\ub97c \uc704\ud574 QuickBASIC POS \uc571\uc744 \ub9cc\ub4e0 \uc774\ud6c4\ub85c \uc804\ubb38\uc801\uc73c\ub85c \ucf54\ub529\uc744 \ud574\uc654\uc2b5\ub2c8\ub2e4.  \ud604\uc7ac Couchbase\uc758 \uc120\uc784 \uc81c\ud488 \ub9c8\ucf00\ud305 \uad00\ub9ac\uc790\ub85c \uc77c\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uac00 \uc2dc\uac04\uc5d0\ub294 \uac00\uc871\uacfc \ud568\uaed8 \ucd95\uad6c \uacbd\uae30\ub97c \uad00\ub78c\ud558\uace0 \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \ucc38\uc5ec\ud558\uba70 \uc2dc\uac04\uc744 \ubcf4\ub0c5\ub2c8\ub2e4.  \uadf8\ub294 .NET\uc758 AOP, .NET\uc758 \ud504\ub85c \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4, Pluralsight \uc800\uc790, Microsoft MVP\uc758 \uc800\uc790\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/14249","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=14249"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/14249\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/14251"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=14249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=14249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=14249"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=14249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}