{"id":11147,"date":"2021-05-27T08:01:06","date_gmt":"2021-05-27T15:01:06","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=11147"},"modified":"2025-06-13T19:40:16","modified_gmt":"2025-06-14T02:40:16","slug":"sql-nosql-comparison-aspnet-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/sql-nosql-comparison-aspnet-application\/","title":{"rendered":"SQL\uacfc NoSQL \ube44\uad50: ASP.NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158"},"content":{"rendered":"<div class=\"paragraph\">\n<p>\uc774 SQL\uacfc NoSQL \ube44\uad50\ub294 SQL Server \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c Couchbase\ub85c \ubcc0\ud658\ud55c \ud6c4 \ub2e4\uc74c \ub2e8\uacc4\uc785\ub2c8\ub2e4. In <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/sql-to-nosql-automated-migration\/\">\uc774\uc804 \uac8c\uc2dc\ubb3c<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec SQL Server\uc5d0\uc11c Couchbase\ub85c AdventureWorks\ub97c \ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 SQL Server\ub97c \uc0ac\uc6a9\ud558\ub294 ASP.NET Core \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ub3d9\uc77c\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 Couchbase\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \ub530\ub77c \ud574\ubcf4\uace0 \uc2f6\uc73c\uc2dc\ub2e4\uba74 <a href=\"https:\/\/github.com\/mgroves\/SqlServerToCouchbase\">SqlServerToCouchbase \ud504\ub85c\uc81d\ud2b8<\/a> \uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774\uc804 \uac8c\uc2dc\ubb3c\uacfc \ub2ec\ub9ac \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \"\uc790\ub3d9\" \ubcc0\ud658\uc744 \uc2dc\ub3c4\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub300\uc2e0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc218\uc900\uc5d0\uc11c SQL\uacfc NoSQL\uc744 \ube44\uad50\ud558\ub294 \uac83\uc73c\ub85c \uc0dd\uac01\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_asp_net_sql_server_applications\">ASP.NET SQL Server \uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uc544\uc8fc \uac04\ub2e8\ud55c ASP.NET Core REST API \uc2a4\ud0c0\uc77c\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc800\ub294 \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud588\uc9c0\ub9cc Dapper, ADO.NET, NHibernate \ub4f1\uc744 \uc0ac\uc6a9\ud558\uc2dc\ub294 \ubd84\ub4e4\ub3c4 \uc27d\uac8c \ub530\ub77c\ud560 \uc218 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uac01 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 JSON\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ub610\ud55c \ud504\ub85c\uc81d\ud2b8\uc5d0 Swashbuckle\uc744 \ucd94\uac00\ud558\uc5ec \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c OpenAPI\ub97c \ud1b5\ud574 \ubc14\ub85c \uc694\uccad\uc744 \ubc1c\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_asp_net_couchbase_server_application\">ASP.NET \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubc84\uc804\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \ub3d9\uc77c\ud55c SQL Server AdventureWorks \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc800\ub294 <a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/hello-world\/start-using-sdk.html\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 .NET SDK<\/a> \uadf8\ub9ac\uace0 <a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/distributed-acid-transactions-from-the-sdk.html\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uac70\ub798<\/a> \ub77c\uc774\ube0c\ub7ec\ub9ac. (\ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Linq2Couchbase<\/a> \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c \ub300\uccb4\uc758 \ud55c \uc720\ud615\uc73c\ub85c).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \ub3d9\uc77c\ud558\uba70 SQL\uacfc NoSQL \ube44\uad50(\ubc0f \ub300\uc870)\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 JSON\uc744 \ubc18\ud658\ud558\uace0 Swashbuckle\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uac01 \uc0d8\ud50c\uc5d0\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \ud558\ub098\uc529 \uc788\uc2b5\ub2c8\ub2e4. \ucee8\ud2b8\ub864\ub7ec\uc758 \uac01 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc0b4\ud3b4\ubcf4\uace0 SQL\uacfc NoSQL \ube44\uad50\ub97c \uc218\ud589\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_sql_and_nosql_comparison_get_by_id\">SQL\uacfc NoSQL \ube44\uad50: ID\ub85c \uac00\uc838\uc624\uae30<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uba3c\uc800 <code>GetPersonByIdAsync<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc785\ub2c8\ub2e4. \uac1c\uc778 ID\uac00 \uc8fc\uc5b4\uc9c0\uba74 \uc774 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \uc8fc\uc5b4\uc9c4 ID\uc5d0 \ub300\ud55c \uac1c\uc778 \ub370\uc774\ud130\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_sql_server\">SQL Server<\/h3>\n<div class=\"paragraph\">\n<p>\ub2e4\uc74c\uc740 \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\ub294 SQL Server \uc608\uc81c\uc785\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/person\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdAsync(int personId)\r\n{\r\n    var person = await _context.Persons\r\n        .SingleOrDefaultAsync(p =&gt; p.BusinessEntityID == personId);\r\n\r\n    return Ok(person);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774 \uba54\uc11c\ub4dc\uc758 \ub2e4\ub978 \ubc84\uc804\ub3c4 \uc791\uc131\ud588\uc2b5\ub2c8\ub2e4. <code>GetPersonByIdRawAsync<\/code> \ub294 \"\uc6d0\uc2dc\" SQL \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc774 \ucffc\ub9ac\ub294 \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c(\uc704)\uac00 \uad81\uadf9\uc801\uc73c\ub85c \uc0dd\uc131\ud558\ub294 \ucffc\ub9ac\uc640 \ub9e4\uc6b0 \uc720\uc0ac\ud558\uba70, Dapper \uc811\uadfc \ubc29\uc2dd\uacfc\ub3c4 \uc720\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/personRaw\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdRawAsync(int personId)\r\n{\r\n    var person = await _context.Persons\r\n        .FromSqlRaw(@\"SELECT * FROM Person.Person WHERE BusinessEntityID = {0}\", personId)\r\n        .SingleOrDefaultAsync();\r\n\r\n    return Ok(person);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc5b4\ub290 \ucabd\uc774\ub4e0 SQL \ucffc\ub9ac\uac00 \uc2e4\ud589\ub418\uace0 \uc788\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>N1QL\uc744 \uc0ac\uc6a9\ud558\uba74 \ub9e4\uc6b0 \uc720\uc0ac\ud55c \ubc29\uc2dd\uc73c\ub85c Couchbase\uc758 \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 <code>GetPersonByIdRawAsync<\/code> \ub97c \uc0ac\uc6a9\ud558\uc138\uc694:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/personRaw\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdRawAsync(int personId)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var cluster = bucket.Cluster;\r\n    var personResult = await cluster.QueryAsync&lt;Person&gt;(@\"\r\n        SELECT p.* FROM AdventureWorks2016.Person.Person p WHERE p.BusinessEntityID = $personId\",\r\n        new QueryOptions().Parameter(\"personId\", personId));\r\n    return Ok(await personResult.Rows.SingleOrDefaultAsync());\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>(\"\ubc84\ud0b7\"\uc5d0\uc11c \"\ud074\ub7ec\uc2a4\ud130\"\ub85c \uc774\ub3d9\ud558\ub294 \ucd94\uac00 \ub2e8\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ub2e8\uacc4\ub97c \uac74\ub108\ub6f8 \uc218\ub3c4 \uc788\uc9c0\ub9cc \uc800\ub294 \ucee8\ud2b8\ub864\ub7ec\uc758 \ub2e4\ub978 \uacf3\uc5d0\uc11c \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uadf8\ub300\ub85c \ub450\uc5c8\uc2b5\ub2c8\ub2e4.)<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uadf8\ub7ec\ub098 N1QL \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ub371\uc2f1, \ucffc\ub9ac \uad6c\ubb38 \ubd84\uc11d \ub4f1 \uc57d\uac04\uc758 \ucd94\uac00 \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. Couchbase\ub97c \uc0ac\uc6a9\ud558\uba74 \uc774\ubbf8 \uac1c\uc778 ID\ub97c \uc54c\uace0 \uc788\ub294 \uacbd\uc6b0 N1QL \ucffc\ub9ac\ub97c \uac74\ub108\ub6f0\uace0 \uc9c1\uc811 \ud0a4\/\uac12(K\/V) \uc870\ud68c\ub97c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_get_by_id_with_k_v\">K\/V\ub85c \uc2e0\ubd84\uc99d \ud655\uc778<\/h3>\n<div class=\"paragraph\">\n<p>\ud0a4\ub294 \uc774\ubbf8 \uc54c\uace0 \uc788\uc73c\ubbc0\ub85c \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4. SQL\uc744 \uc0ac\uc6a9\ud558\ub294 \ub300\uc2e0 \ud0a4\/\uac12 \uc870\ud68c\ub97c \ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc800\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uba54\uc11c\ub4dc\uc5d0\uc11c \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud588\uc2b5\ub2c8\ub2e4. <code>GetPersonByIdAsync<\/code>:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/person\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdAsync(int personId)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var scope = await bucket.ScopeAsync(\"Person\");\r\n    var coll = await scope.CollectionAsync(\"Person\");\r\n    var personDoc = await coll.GetAsync(personId.ToString());\r\n    return Ok(personDoc.ContentAs&lt;Person&gt;());\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>SQL Server\uc640 \ub2ec\ub9ac Couchbase\ub294 \ub370\uc774\ud130\uc640 \uc0c1\ud638 \uc791\uc6a9\ud560 \uc218 \uc788\ub294 \ub2e4\uc591\ud55c API\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774 \uacbd\uc6b0 \ud0a4\/\uac12 \uc870\ud68c\ub294 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc9c1\uc811 Person \ubb38\uc11c\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. SQL \ucffc\ub9ac\ub97c \ud30c\uc2f1\ud558\uac70\ub098 \uc778\ub371\uc2f1\uc744 \uc0ac\uc6a9\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. Couchbase\uc758 \ud0a4\/\uac12 \uc870\ud68c\ub294 \uc885\uc885 \ub9c8\uc774\ud06c\ub85c\ucd08 \ub2e8\uc704\ub85c \uce21\uc815\ub429\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc81c \uc870\uc5b8: \uac00\ub2a5\ud558\uba74 \ud0a4\/\uac12 \uc870\ud68c\ub97c \uc0ac\uc6a9\ud558\uc138\uc694.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_get_an_expanded_entity_by_id\">ID\ub85c \ud655\uc7a5\ub41c \uc5d4\ud130\ud2f0 \uac00\uc838\uc624\uae30<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\ub370\uc774\ud130\ub294 \ubcf5\uc7a1\ud558\uace0 \uc5ec\ub7ec \ud14c\uc774\ube14\uc5d0 \uac78\uccd0 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4(\ub610\ub294 Couchbase\uc758 \uacbd\uc6b0 \uc5ec\ub7ec \ubb38\uc11c\uc5d0 \uac78\uccd0 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4). \uc0ac\uc6a9 \uc911\uc778 \ub3c4\uad6c\uc5d0 \ub530\ub77c \uad00\ub828 \uc5d4\ud2f0\ud2f0\ub97c \ub85c\ub4dc\ud560 \uc218 \uc788\ub294 \uc77c\ubd80 \uae30\ub2a5\uc774 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc608\ub97c \ub4e4\uc5b4, \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uba74 <code>\ud3ec\ud568<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc774 \uad00\ub828 \uc5d4\ud2f0\ud2f0\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. <code>GetPersonByIdExpandedAsync<\/code> \uc608\uc81c:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/personExpanded\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdExpandedAsync(int personId)\r\n{\r\n    var person = await _context.Persons\r\n        .Include(p =&gt; p.EmailAddresses)\r\n        .SingleOrDefaultAsync(p =&gt; p.BusinessEntityID == personId);\r\n\r\n    return Ok(person);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud574 \ub4a4\uc5d0\uc11c JOIN \ubc0f\/\ub610\ub294 \uc5ec\ub7ec SELECT \ucffc\ub9ac\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ubfd0\ub9cc \uc544\ub2c8\ub77c \ubaa8\ub4e0 O\/RM\uc774 \uc704\ud5d8\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4. SQL \ud504\ub85c\ud30c\uc77c\ub7ec\uc640 \uac19\uc740 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uc81c\ub85c \uc5b4\ub5a4 \ucffc\ub9ac\uac00 \uc2e4\ud589\ub418\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"admonitionblock note\">\n<table>\n<tbody>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">\ucc38\uace0<\/div>\n<\/td>\n<td class=\"content\">O\/RM\uc774 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc9c0\ub9cc <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/sql-to-nosql-automated-migration\/\">SQL\uc5d0\uc11c NoSQL\ub85c<\/a> \uc640 \ube44\uad50\ud560 \ub54c, \uc784\ud53c\ub358\uc2a4 \ubd88\uc77c\uce58\ub294 NoSQL \uc138\uacc4\uc5d0\uc11c \ud6e8\uc52c \ub35c \ubb38\uc81c\uac00 \ub41c\ub2e4\ub294 \uc810\uc744 \uae30\uc5b5\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase \uc0d8\ud50c\uc758 \uacbd\uc6b0, \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ub300\uc2e0\uc5d0 <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/nest.html\">NEST \uad6c\ubb38<\/a> SQL \ud45c\uc900\uc758 N1QL \ud655\uc7a5\uc758 \uc77c\ubd80\uc785\ub2c8\ub2e4. \ub2e4\uc74c\uc740 Couchbase \ubc84\uc804\uc758 <code>GetPersonByIdExpandedAsync<\/code> \uc678\ubaa8:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/personExpanded\/{personId}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonByIdExpandedAsync(int personId)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var cluster = bucket.Cluster;\r\n    var personResult = await cluster.QueryAsync&lt;Person&gt;(@\"\r\n        SELECT p.*, EmailAddresses\r\n        FROM AdventureWorks2016.Person.Person p\r\n        NEST AdventureWorks2016.Person.EmailAddress EmailAddresses ON EmailAddresses.BusinessEntityID = p.BusinessEntityID\r\n        WHERE p.BusinessEntityID = $personId\",\r\n        new QueryOptions().Parameter(\"personId\", personId));\r\n    return Ok(await personResult.Rows.SingleOrDefaultAsync());\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>NEST\ub294 \uc870\uc778\ub41c \ub370\uc774\ud130\ub97c \uc911\ucca9\ub41c JSON \uac1d\uccb4\uc5d0 \ub123\ub294 \uc77c\uc885\uc758 JOIN\uc785\ub2c8\ub2e4. O\/RM\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \ub9e4\ud551\ud558\ub294 \ub300\uc2e0 \uc774 \ub370\uc774\ud130\ub97c C# \uac1d\uccb4\ub85c \uc9c1\uc811 \uc9c1\ub82c\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_paging_query\">\ud398\uc774\uc9d5 \ucffc\ub9ac<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\ub370\uc774\ud130\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \ud0a4\uac00 \ud558\ub098\ub3c4 \uc5c6\ub294 \uacbd\uc6b0\ub97c \uc608\ub85c \ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uacb0\uacfc\uc758 '\ud398\uc774\uc9c0'\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4(\uc544\ub9c8\ub3c4 UI \uadf8\ub9ac\ub4dc\ub098 \ubaa9\ub85d\uc744 \ucc44\uc6b0\uae30 \uc704\ud55c \uac83\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4).<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_paging_in_sql_server\">SQL Server\uc758 \ud398\uc774\uc9d5<\/h3>\n<div class=\"paragraph\">\n<p>SQL Server \ubc84\uc804\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <code>GetPersonsPageAsync<\/code>:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpGet(\"\/persons\/page\/{pageNum}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonsPageAsync(int pageNum)\r\n{\r\n    var pageSize = 10;\r\n    var personPage = await _context.Persons\r\n        .OrderBy(p =&gt; p.LastName)\r\n        .Skip(pageNum * pageSize)\r\n        .Take(pageSize)\r\n        .Select(p =&gt; new { p.BusinessEntityID, p.FirstName, p.LastName })\r\n        .ToListAsync();\r\n    return Ok(personPage);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c \uc0ac\uc6a9, <code>\uc8fc\ubb38 \uae30\uc900<\/code>, <code>\uac74\ub108\ub6f0\uae30<\/code>\ubc0f <code>Take<\/code> \ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ud398\uc774\uc9d5\uc5d0 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. SQL Server \ud504\ub85c\ud30c\uc77c\ub7ec\ub97c \uc5f4\uba74 \uc0dd\uc131\ub418\ub294 SQL\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\" data-lang=\"SQL\">exec sp_executesql N'SELECT [p].[BusinessEntityID], [p].[FirstName], [p].[LastName]\r\nFROM [Person].[Person] AS [p]\r\nORDER BY [p].[LastName]\r\nOFFSET @__p_0 ROWS FETCH NEXT @__p_0 ROWS ONLY',N'@__p_0 int',@__p_0=10<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><code>\uc624\ud504\uc14b ... \ud589 \uac00\uc838 \uc624\uae30 \ub2e4\uc74c ...<\/code> \ub294 \uc5ec\uae30\uc11c \ud398\uc774\uc9d5\uc5d0 \uc0ac\uc6a9\ub418\ub294 \uad6c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_paging_in_couchbase\">Couchbase\uc758 \ud398\uc774\uc9d5<\/h3>\n<div class=\"paragraph\">\n<p>\ud398\uc774\uc9d5 \uad6c\ubb38\uc740 \ud56d\uc0c1 SQL \uad6c\ud604\uc5d0 \ub530\ub77c \ub2e4\ub985\ub2c8\ub2e4. Couchbase\ub294 \uc774 \uc810\uc5d0\uc11c Oracle\/MySQL \uad6c\ubb38\uc5d0 \ub354 \uc758\uc874\ud569\ub2c8\ub2e4. \ub2e4\uc74c\uc740 Couchbase \ubc84\uc804\uc758 <code>GetPersonsPageAsync<\/code>:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\" data-lang=\"SQL\">[HttpGet(\"\/persons\/page\/{pageNum}\")]\r\npublic async Task&lt;IActionResult&gt; GetPersonsPageAsync(int pageNum)\r\n{\r\n    var pageSize = 10;\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var bucketName = bucket.Name;\r\n    var cluster = bucket.Cluster;\r\n\r\n    var personPage = await cluster.QueryAsync&lt;Person&gt;($@\"\r\n        SELECT p.LastName, p.BusinessEntityID, p.FirstName\r\n        FROM `{bucketName}`.Person.Person p\r\n        WHERE p.LastName IS NOT MISSING\r\n        ORDER BY p.LastName\r\n        LIMIT {pageSize} OFFSET {(pageNum * pageSize)}\r\n    \");\r\n\r\n    return Ok(await personPage.Rows.ToListAsync());\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774 \uacbd\uc6b0 <code>\uc81c\ud55c ... \uc624\ud504\uc14b ...<\/code> \uac00 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub610\ud55c <code>p.LastName\uc774 \ub204\ub77d\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0<\/code>. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub294 NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc774\ubbc0\ub85c \ucffc\ub9ac \uc5d4\uc9c4\uc740 \ub2e4\uc74c\uc744 \uac00\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. <code>\uc131<\/code> \ub97c \ud3ec\ud568\ud55c \ubaa8\ub4e0 \ubb38\uc11c\uc5d0 <code>p.\uc131\uc73c\ub85c \uc8fc\ubb38<\/code>. \uc774\uac83\uc744 \ucd94\uac00\ud558\uba74 <code>\uc5b4\ub514<\/code> \uc808\uc744 \uc0ac\uc6a9\ud558\uba74 \ucffc\ub9ac\ub294 \uc774\uc81c \uc5b4\ub5a4 \uc778\ub371\uc2a4\ub97c \uc0ac\uc6a9\ud560\uc9c0 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc808\uc774 \uc5c6\uc73c\uba74 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ub370 \ud6e8\uc52c \ub354 \uc624\ub798 \uac78\ub9bd\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_update_with_an_acid_transaction\">ACID \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uc774 \uc608\uc81c\uc5d0\uc11c\ub294 SQL Server\uc640 Couchbase \ubaa8\ub450\uc5d0\uc11c \uad00\uacc4\ud615 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\ubbc0\ub85c \ub450 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubaa8\ub450\uc5d0\uc11c ACID \ud2b8\ub79c\uc7ad\uc158\uc774 \uc911\uc694\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774 \uc608\uc81c\uc5d0\uc11c\ub294 <code>PersonUpdateApi<\/code> \ub97c \uc5c5\ub370\uc774\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>\ub458 \ub2e4<\/strong> \uc0ac\ub78c\uc758 \uc774\ub984\uacfc \uc774\uba54\uc77c \uc8fc\uc18c\uc785\ub2c8\ub2e4. \uc774 \ub370\uc774\ud130\ub294 \ub450 \uac1c\uc758 \uac1c\ubcc4 \ud14c\uc774\ube14\/\ud589(SQL Server) \ub610\ub294 \ub450 \uac1c\uc758 \uac1c\ubcc4 \ubb38\uc11c(Couchbase)\uc5d0 \uc788\uc73c\ubbc0\ub85c, \uc774 \uc791\uc5c5\uc740 \uc804\ubd80 \uc544\ub2c8\uba74 \uc804\ubb34\uc758 \uc6d0\uc790 \uc5f0\uc0b0\uc774 \ub418\uae30\ub97c \uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"admonitionblock note\">\n<table>\n<tbody>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">\ucc38\uace0<\/div>\n<\/td>\n<td class=\"content\">\ud55c \uc0ac\ub78c\uc774 \uc5ec\ub7ec \uac1c\uc758 \uc774\uba54\uc77c \uc8fc\uc18c\ub97c \uac00\uc9c8 \uc218 \uc788\uc9c0\ub9cc \uc774 \ub370\uc774\ud130 \uc138\ud2b8\uc5d0\uc11c\ub294 \ub4dc\ubb3c\uae30 \ub54c\ubb38\uc5d0 (API\ub97c \ub2e8\uc21c\ud654\ud558\uae30 \uc704\ud574) \ub458 \ub2e4\uc5d0 \ub300\ud574 ID\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_acid_with_entity_framework\">\uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ud3ec\ud568\ub41c ACID<\/h3>\n<div class=\"paragraph\">\n<p>\ub2e4\uc74c\uc740 \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc5ec Person \ud14c\uc774\ube14\uc758 \ub370\uc774\ud130 \ud589\uacfc EmailAddress \ud14c\uc774\ube14\uc758 \ub370\uc774\ud130 \ud589\uc744 \ubaa8\ub450 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 ACID \ud2b8\ub79c\uc7ad\uc158\uc758 \uc608\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpPut(\"\/person\")]\r\npublic async Task&lt;IActionResult&gt; UpdatePurchaseOrderAsync(PersonUpdateApi personUpdateApi)\r\n{\r\n    var transaction = await _context.Database.BeginTransactionAsync();\r\n\r\n    try\r\n    {\r\n        \/\/ find the person\r\n        var person = await _context.Persons\r\n            .Include(p =&gt; p.EmailAddresses)\r\n            .SingleOrDefaultAsync(p =&gt; p.BusinessEntityID == personUpdateApi.PersonId);\r\n\r\n        \/\/ update name\r\n        person.FirstName = personUpdateApi.FirstName;\r\n        person.LastName = personUpdateApi.LastName;\r\n\r\n        \/\/ get the particular email address and update it\r\n        \/\/ if the supplied ID is invalid, this will throw an exception\r\n        var email = person.EmailAddresses.Single(e =&gt;\r\n            e.EmailAddressID == personUpdateApi.EmailAddressId);\r\n        email.EmailAddress = personUpdateApi.EmailAddress;\r\n\r\n        await _context.SaveChangesAsync();\r\n\r\n        \/\/ commit transaction\r\n        await transaction.CommitAsync();\r\n\r\n        return Ok($\"Person {personUpdateApi.PersonId} name and email updated.\");\r\n    }\r\n    catch (Exception ex)\r\n    {\r\n        await transaction.RollbackAsync();\r\n        return BadRequest(\"Something went wrong, transaction rolled back\");\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uac70\ub798\uc758 \ub124 \uac00\uc9c0 \uc8fc\uc694 \ubd80\ubd84\uc5d0 \uc720\uc758\ud558\uc138\uc694:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>\uac70\ub798 \uc2dc\uc791(<code>_context.Database.BeginTransactionAsync();<\/code>)<\/li>\n<li><code>\uc2dc\ub3c4<\/code>\/<code>catch<\/code><\/li>\n<li>\ud2b8\ub79c\uc7ad\uc158 \ucee4\ubc0b(<code>\ud2b8\ub79c\uc7ad\uc158.CommitAsync()\ub97c \uae30\ub2e4\ub9bd\ub2c8\ub2e4;<\/code>)<\/li>\n<li>\ub864\ubc31 \ud2b8\ub79c\uc7ad\uc158\uc758 <code>catch<\/code> (<code>\ud2b8\ub79c\uc7ad\uc158.\ub864\ubc31\ube44\ub3d9\uae30();<\/code>)<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774\uac83\uc740 \ucd5c\uadfc \uba87 \ub144 \ub3d9\uc548 SQL\uacfc NoSQL\uc744 \ube44\uad50\ud558\ub294 \uc911\uc694\ud55c \uae30\ub2a5\uc785\ub2c8\ub2e4. Couchbase\ub97c \uc0ac\uc6a9\ud558\uba74 \uc774\uc81c ACID \ud2b8\ub79c\uc7ad\uc158\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_acid_with_a_couchbase_transaction\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc774 \uc788\ub294 ACID<\/h3>\n<div class=\"paragraph\">\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \uacbd\uc6b0 API\ub294 \uc57d\uac04 \ub2e4\ub974\uc9c0\ub9cc \ub2e8\uacc4\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud569\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">[HttpPut(\"\/person\")]\r\npublic async Task&lt;IActionResult&gt; UpdatePurchaseOrderAsync(PersonUpdateApi personUpdateApi)\r\n{\r\n    \/\/ setup bucket, cluster, and collections\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var scope = await bucket.ScopeAsync(\"Person\");\r\n    var personColl = await scope.CollectionAsync(\"Person\");\r\n    var emailColl = await scope.CollectionAsync(\"EmailAddress\");\r\n\r\n    \/\/ create transaction\r\n    var cluster = bucket.Cluster;\r\n    var transaction = Transactions.Create(cluster,\r\n        TransactionConfigBuilder.Create()\r\n            .DurabilityLevel(DurabilityLevel.None)\r\n            .Build());\r\n\r\n    try\r\n    {\r\n        await transaction.RunAsync(async (context) =&gt;\r\n        {\r\n            \/\/ update person and email documents\r\n            \/\/ based on values passed in API object\r\n            var personKey = personUpdateApi.PersonId.ToString();\r\n            var emailKey = personKey + \"::\" + personUpdateApi.EmailAddressId.ToString();\r\n            var person = await context.GetAsync(personColl, personKey);\r\n            var email = await context.GetAsync(emailColl, emailKey);\r\n\r\n            var personDoc = person.ContentAs&lt;dynamic&gt;();\r\n            var emailDoc = email.ContentAs&lt;dynamic&gt;();\r\n\r\n            personDoc.FirstName = personUpdateApi.FirstName;\r\n            personDoc.LastName = personUpdateApi.LastName;\r\n            emailDoc.EmailAddress = personUpdateApi.EmailAddress;\r\n\r\n            await context.ReplaceAsync(person, personDoc);\r\n            await context.ReplaceAsync(email, emailDoc);\r\n        });\r\n        return Ok($\"Person {personUpdateApi.PersonId} name and email updated.\");\r\n    }\r\n    catch (Exception ex)\r\n    {\r\n        return BadRequest(\"Something went wrong, transaction rolled back.\");\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc8fc\uc694 \ub2e8\uacc4\ub294 \ub3d9\uc77c\ud569\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>\uac70\ub798 \uc2dc\uc791(<code>\ud2b8\ub79c\uc7ad\uc158.RunAsync( ... )<\/code>)<\/li>\n<li><code>\uc2dc\ub3c4<\/code>\/<code>catch<\/code><\/li>\n<li>\ud2b8\ub79c\uc7ad\uc158 \ucee4\ubc0b(\uc554\uc2dc\uc801\uc774\uc9c0\ub9cc <code>context.CommitAsync()<\/code> \uc0ac\uc6a9 \uac00\ub2a5)<\/li>\n<li>\ub864\ubc31 \ud2b8\ub79c\uc7ad\uc158(\ub2e4\uc2dc \ud55c \ubc88 \uc554\uc2dc\ub418\uc9c0\ub9cc <code>context.RollbackAsync()<\/code> \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4).<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub450 \uacbd\uc6b0 \ubaa8\ub450 ACID \ud2b8\ub79c\uc7ad\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. <strong>\uc640 \ub2ec\ub9ac<\/strong> \uadf8\ub7ec\ub098 SQL Server\ub294 <strong>\ub098\uc911\uc5d0<\/strong> Couchbase\uc758 \ub370\uc774\ud130\ub97c \ucd5c\uc801\ud654\ud558\uace0 \ud1b5\ud569\ud558\uc5ec \ud544\uc694\ud55c ACID \ud2b8\ub79c\uc7ad\uc158\uc758 \uc591\uc744 \uc904\uc774\uace0 \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ud0b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_stored_procedures_a_sql_and_nosql_comparison\">\uc800\uc7a5 \ud504\ub85c\uc2dc\uc800: SQL\uacfc NoSQL \ube44\uad50<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uc800\uc7a5 \ud504\ub85c\uc2dc\uc800\ub294 \ub54c\ub54c\ub85c \ub17c\ub780\uc758 \uc5ec\uc9c0\uac00 \uc788\ub294 \uc8fc\uc81c\uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uc800\uc7a5 \ud504\ub85c\uc2dc\uc800\uc5d0\ub294 \ub9ce\uc740 \uae30\ub2a5\uacfc \ub17c\ub9ac\uac00 \ud3ec\ud568\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_stored_procedure_in_sql_server\">SQL Server\uc758 \uc800\uc7a5 \ud504\ub85c\uc2dc\uc800<\/h3>\n<div class=\"paragraph\">\n<p>\"ListSubcomponents\"\ub77c\ub294 \uc800\uc7a5 \ud504\ub85c\uc2dc\uc800\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4 ( <a href=\"https:\/\/github.com\/mgroves\/SqlServerToCouchbase\">\uae43\ud5c8\ube0c\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9<\/a>). \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c\ub294 \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>FromSqlRaw<\/code> \ub97c \uc2e4\ud589\ud558\uace0 \uadf8 \uacb0\uacfc\ub97c C# \uac1d\uccb4\uc5d0 \ub9e4\ud551\ud569\ub2c8\ub2e4. \uc758\uc0ac \uc5d4\ud2f0\ud2f0 C# \uac1d\uccb4\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. <code>\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8 \ub098\uc5f4<\/code> \uc774 \uc2a4\ud504\ub85c\ud06c\uc5d0\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">\/\/ sproc example - see ExampleStoredProcedure.sql\r\n[HttpGet(\"\/getListSubcomponents\/{listPriceMin}\/{listPriceMax}\")]\r\npublic async Task&lt;IActionResult&gt; GetListSubcomponents(decimal listPriceMin, decimal listPriceMax)\r\n{\r\n    var listPriceMinParam = new SqlParameter(\"@ListPriceMin\", SqlDbType.Decimal) {Value = listPriceMin };\r\n    var listPriceMaxParam = new SqlParameter(\"@ListPriceMax\", SqlDbType.Decimal) {Value = listPriceMax };\r\n\r\n    var result = await _context.ListSubcomponents\r\n        .FromSqlRaw(\"EXECUTE dbo.ListSubcomponents @ListPriceMin, @ListPriceMax\", listPriceMinParam, listPriceMaxParam)\r\n        .ToListAsync();\r\n\r\n    return Ok(result);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc800\uc7a5 \ud504\ub85c\uc2dc\uc800\uc5d0\ub294 \ub450 \uac1c\uc758 \ub9e4\uac1c \ubcc0\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_couchbase_user_defined_function\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5<\/h3>\n<div class=\"paragraph\">\n<p>Couchbase\uc5d0\ub294 \uc544\uc9c1 \"\uc800\uc7a5 \ud504\ub85c\uc2dc\uc800\"\ub77c\ub294 \uac83\uc774 \uc5c6\uc9c0\ub9cc, \ud544\uc694\ud55c \uacbd\uc6b0 \ubcf5\uc7a1\ud55c \ub85c\uc9c1\uc744 \ud3ec\ud568\ud560 \uc218 \uc788\ub294 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218(UDF)\ub77c\ub294 \uac83\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub77c\ub294 UDF\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. <code>\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8 \ub098\uc5f4<\/code> (\ub610\ud55c <a href=\"https:\/\/github.com\/mgroves\/SqlServerToCouchbase\">\uae43\ud5c8\ube0c\uc5d0\uc11c \ubcf4\uae30<\/a>)\uc758 \uae30\ub2a5\uacfc \uc77c\uce58\ud558\ub294 SQL Server \uc2a4\ud504\ub85c\ud06c\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>ASP.NET\uc5d0\uc11c \ud574\ub2f9 UDF\ub97c \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\" data-lang=\"C#\">\/\/ sproc example - see ExampleStoredProcedure.sql\r\n[HttpGet(\"\/getListSubcomponents\/{listPriceMin}\/{listPriceMax}\")]\r\npublic async Task&lt;IActionResult&gt; GetListSubcomponents(decimal listPriceMin, decimal listPriceMax)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync();\r\n    var cluster = bucket.Cluster;\r\n\r\n    var options = new QueryOptions();\r\n    options.Parameter(\"$listPriceMin\", listPriceMin);\r\n    options.Parameter(\"$listPriceMax\", listPriceMax);\r\n\r\n    var result = await cluster.QueryAsync&lt;ListSubcomponent&gt;(\r\n        \"SELECT l.* FROM ListSubcomponents($listPriceMin, $listPriceMax) l\", options);\r\n\r\n    return Ok(await result.Rows.ToListAsync());\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub450 \uac1c\uc758 \ub9e4\uac1c \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec Couchbase\uc5d0\uc11c \uc774\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc740 \uc5d4\ud2f0\ud2f0 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c FromSqlRaw\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \ub9e4\uc6b0 \uc720\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_performance_sql_to_nosql_comparison\">\uc131\ub2a5 - SQL\uacfc NoSQL \ube44\uad50<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uc774\uc81c \uc571\uc744 Couchbase\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ubcc0\ud658\ud588\ub294\ub370 \uc0c8 \ubc84\uc804\uc774 \uc801\uc5b4\ub3c4 \uc774\uc804 SQL Server \ubc84\uc804\ub9cc\ud07c \ube60\ub974\uac8c \uc2e4\ud589\ub418\ub098\uc694?<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub300\ub2f5\ud558\uae30 \ubcf5\uc7a1\ud55c \uc9c8\ubb38\uc785\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\ub370\uc774\ud130 \ubaa8\ub378\uc744 \ucd5c\uc801\ud654\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc5ec\uc804\ud788 \ub2e4\uc74c\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ub9ac\ud130\ub7f4\ub85c \ubcc0\ud658\ud558\ub294 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/sql-to-nosql-automated-migration\/\">\uc774\uc804 \uac8c\uc2dc\ubb3c<\/a>.<\/li>\n<li>\ub370\uc774\ud130 \uc561\uc138\uc2a4\ub294 \uc0ac\uc6a9 \uc0ac\ub840\ub9c8\ub2e4 \ub9e4\uc6b0 \ub2e4\uc591\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud658\uacbd\uc740 \uc0ac\ub78c\ub9c8\ub2e4, \ud68c\uc0ac\ub9c8\ub2e4 \ud06c\uac8c \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>\ud558\uc9c0\ub9cc \uc800\ub294 \uc815\uc2e0 \uc0c1\ud0dc\ub97c \uc810\uac80\ud558\uae30 \uc704\ud574 '\ubc31 \uc624\ube0c \ub354 \uc5d4\ubca8\ub85c\ud504' \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uace0 \uc2f6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub85c\uceec \ucef4\ud4e8\ud130\uc5d0\uc11c \ub450 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubaa8\ub450 \uc2e4\ud589\ud588\uace0, \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/ngrok.com\">ngrok<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc778\ud130\ub137\uc5d0 \ub178\ucd9c\uc2dc\ucf30\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c <a href=\"https:\/\/loader.io\/\">loader.io<\/a> (\ub3d9\uc2dc\uc131 \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ud6cc\ub96d\ud55c \ub3c4\uad6c). \uadf8\ub7f0 \ub2e4\uc74c '\ud398\uc774\uc9d5' \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0 \ub300\ud574\uc11c\ub9cc \uba87 \uac00\uc9c0 \uac04\ub2e8\ud55c \uc131\ub2a5 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud588\uc2b5\ub2c8\ub2e4. \uc774 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \uc81c\uac00 \uc131\ub2a5\uc5d0 \ub300\ud574 \uac00\uc7a5 \uc6b0\ub824\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc774\uba70, \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uc911\uc5d0\uc11c \uac00\uc7a5 \"\uc0ac\uacfc\uc640 \uc0ac\uacfc\"\ub97c \ube44\uad50\ud55c SQL \ubc0f NoSQL\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_load_testing_sql_and_nosql_comparison\">\ub85c\ub4dc \ud14c\uc2a4\ud2b8 SQL\uacfc NoSQL \ube44\uad50<\/h3>\n<div class=\"paragraph\">\n<p>\ub2e4\uc74c\uc740 SQL Server \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uacb0\uacfc\uc785\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/05\/13301-sql-server-loader-performance.png\" alt=\"SQL and NoSQL comparison - SQL Server load testing\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ub2e4\uc74c\uc740 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uacb0\uacfc\uc785\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/05\/13302-couchbase-server-loader-performance.png\" alt=\"SQL and NoSQL comparison - Couchbase Server load testing\" \/><\/span><\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_interpreting_the_results_of_the_sql_and_nosql_comparison_load_test\">SQL \ubc0f NoSQL \ube44\uad50 \ubd80\ud558 \ud14c\uc2a4\ud2b8 \uacb0\uacfc \ud574\uc11d\ud558\uae30<\/h3>\n<div class=\"paragraph\">\n<p>\uc774\uac83\uc740 \"Couchbase\uac00 SQL Server\ubcf4\ub2e4 \ube60\ub974\ub2e4\"\ub294 \ubca4\uce58\ub9c8\ud06c\ub098 \ub370\uc774\ud130 \ud3ec\uc778\ud2b8\uac00 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc774\ub294 \ub2e8\uc9c0 \uc815\uc2e0 \uc0c1\ud0dc\ub97c \uc810\uac80\ud558\uae30 \uc704\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ubd80\ud558\uac00 \uac78\ub9b0 \uc0c1\ud0dc\uc5d0\uc11c \uc774\uc804\ub9cc\ud07c \uc88b\uc740 \uc131\ub2a5\uc744 \uc5bb\uc9c0 \ubabb\ud55c\ub2e4\uba74 \ubb54\uac00 \uc798\ubabb\ud558\uace0 \uc788\ub294 \uac83\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/proof-of-concept-move-relational\/\">\uac1c\ub150 \uc99d\uba85<\/a> \ud504\ub85c\uc138\uc2a4. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4, \ud2b9\ud788 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 7\uc740 \ub9e4\uc6b0 \uad00\uacc4\ud615 \uce5c\ud654\uc801\uc774\uc9c0\ub9cc, \uc5ec\uc804\ud788 \ub2e4\uc74c\uacfc \uac19\uc740 \ucc28\uc774\uc810\uacfc \ub258\uc559\uc2a4\uac00 \uc788\uc2b5\ub2c8\ub2e4. <strong>\ubaa8\ub4e0<\/strong> \uc774 \ud504\ub85c\uc138\uc2a4\ub97c \ud1b5\ud574 \uc5ec\ub7ec\ubd84\uacfc \ud504\ub85c\uc81d\ud2b8\uc5d0 \uac00\uc7a5 \uc911\uc694\ud55c \ucc28\uc774\uc810\uc744 \ud30c\uc545\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\ubcf4\ub2e4 \uac15\ub825\ud55c \ubca4\uce58\ub9c8\ud06c\ub97c \ucc3e\uace0 \uacc4\uc2e0\ub2e4\uba74 \ub2e4\uc74c \ub9ac\uc18c\uc2a4\ub97c \ucc38\uace0\ud558\uc138\uc694:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/benchmarks\/\">\uc54c\ud1a0\ub85c\uc2a4\uc758 \ubca4\uce58\ub9c8\ud06c \ubcf4\uace0\uc11c<\/a> (\ud0c0\uc0ac)<\/li>\n<li><a href=\"https:\/\/resources.couchbase.com\/c\/altoros-report-eval-nosql-dbaas-ycsb?x=p2kCzD#zoom=100\" target=\"_blank\" rel=\"noopener\">\ud074\ub77c\uc6b0\ub4dc \ubca4\uce58\ub9c8\ud06c<\/a><\/li>\n<li>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 <a href=\"https:\/\/showfast.sc.couchbase.com\/#\/timeline\/Linux\/kv\/max_ops\/all\">\"ShowFast\" \ubca4\uce58\ub9c8\ud06c<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_conclusion\">\uacb0\ub860<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\uc544\uc8fc \uae30\ubcf8\uc801\uc778 \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc640 \ud568\uaed8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\uc758 SQL\uacfc NoSQL \ube44\uad50 \ubc0f \ubcc0\ud658\uc744 \ud1b5\ud574 \uc81c\uac00 \ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\ubaa8\ub378\ub9c1 \ubcc0\uacbd \uc5c6\uc774 \uad00\uacc4\ud615 \ub370\uc774\ud130 \ubaa8\ub378 \uadf8\ub300\ub85c \ud638\uc2a4\ud305<\/li>\n<li>Couchbase SDK\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d ASP.NET \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \ubcc0\ud658\ud558\uae30<\/li>\n<li>\ub0ae\uc740 \uc704\ud5d8\uc73c\ub85c \ud655\uc7a5 \ubc0f \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ucda9\ubd84\ud55c \uc5ec\uc9c0\uac00 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \uc131\ub2a5\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc744 \uac83\uc73c\ub85c \uae30\ub300\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>\uc0ac\uc6a9 \uc0ac\ub840\ub294 \ub2e4\ub97c \uc218 \uc788\uc9c0\ub9cc, \uc774 \uc804\ud658 \uacfc\uc815\uc5d0\uc11c Couchbase\uac00 \uc81c\uacf5\ud55c \uc815\ubcf4\ub97c \uae30\uc5b5\ud558\uc138\uc694:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\uc26c\uc6b4 <a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/introduction\/why-couchbase.html#scale-out-archi\">\uc218\ud3c9\uc801 \ud655\uc7a5\uc131<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/introduction\/why-couchbase.html#ha\">\uace0\uac00\uc6a9\uc131<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/introduction\/why-couchbase.html#mem-first-archi\">\ub0b4\uc7a5 \uce90\uc2f1<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/introduction\/why-couchbase.html#core-db-engine\">\uc2a4\ud0a4\ub9c8 \uc720\uc5f0\uc131<\/a> (\uadf8\ub798\uc11c \uc560\ucd08\uc5d0 Couchbase\ub97c \uc0ac\uc6a9\ud558\ub824\uace0 \ud558\ub294 \uac83\uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4).<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_appendix\">\ubd80\ub85d<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\ub2e4\uc74c\uc740 \uc81c\uac00 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc218\ud589\ud55c SQL\uacfc NoSQL \ube44\uad50\uc5d0 \ub300\ud55c \uac04\uacb0\ud55c \uac00\uc774\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<colgroup>\n<col style=\"width: 50%\" \/>\n<col style=\"width: 50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">SQL Server \uc791\uc5c5<\/th>\n<th class=\"tableblock halign-left valign-top\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc6b4\uc601<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\ud55c \ud589\/\uc5d4\ud130\ud2f0 \uc77d\uae30\/\uc4f0\uae30<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/kv-operations.html\">\ud0a4\/\uac12 \uc870\ud68c<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\uc5ec\ub7ec \ud589\/\ud398\uc774\uc9c0 \uc77d\uae30\/\uc4f0\uae30<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/n1ql-queries-with-sdk.html\">N1QL \ucffc\ub9ac<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\uad00\ub828 \uc5d4\ud2f0\ud2f0\uac00 \uc788\ub294 \uc5d4\ud2f0\ud2f0 \ud558\ub098\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4.<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">N1QL \ucffc\ub9ac <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/nest.html\">NEST<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">BeginTransaction<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/distributed-acid-transactions-from-the-sdk.html\">Transaction.Create<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\uc800\uc7a5 \ud504\ub85c\uc2dc\uc800<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/userfun.html\">UDF<\/a> (<a href=\"https:\/\/docs.couchbase.com\/server\/7.0\/eventing\/eventing-overview.html\">\uc774\ubca4\ud2b8<\/a> \ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ub3c4 \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>\ubbf8\ub9ac \uc54c\ub9bc:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>\uac00\ub2a5\ud558\uba74 \ud0a4\/\uac12 API\ub85c \uc804\ud658\ud558\uc138\uc694.<\/li>\n<li>N1QL \uc791\uc131 \uc2dc \uc778\ub371\uc2f1, \uc778\ub371\uc2f1 \uacc4\ud68d \uc2dc\uac01\ud654 \ubc0f \uc778\ub371\uc2a4 \uc5b4\ub4dc\ubc14\uc774\uc800 \uc0ac\uc6a9<\/li>\n<li>\ub2e4\uc74c\uacfc \uac19\uc740 \uacbd\uc6b0\uc5d0\ub9cc ACID \ud2b8\ub79c\uc7ad\uc158\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc131\ub2a5 \ubaa9\ud45c\uc5d0 \ub300\ud574 \uc0dd\uac01\ud558\uace0 \ud14c\uc2a4\ud2b8 \ubc29\ubc95\uc744 \uc124\uc815\ud558\uc138\uc694.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_next_steps\">\ub2e4\uc74c \ub2e8\uacc4<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\ud655\uc778 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/downloads\/\">\ud604\uc7ac \ubca0\ud0c0 \ubc84\uc804\uc778 Couchbase Server 7<\/a>\ub97c \uc9c0\uae08 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc138\uc694. \ubb34\ub8cc\ub85c \ub2e4\uc6b4\ub85c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uad00\uacc4\ud615 \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud558\uace0 \uba87 \uac00\uc9c0 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ubcc0\ud658\ud558\uc5ec \ud504\ub85c\uc138\uc2a4\uac00 \uc81c\ub300\ub85c \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud574 \ubcf4\uc138\uc694.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>This SQL and NoSQL comparison is the next step after converting your SQL Server database to Couchbase. In the previous post, I copied AdventureWorks from SQL Server to Couchbase. In this post, I\u2019m going to show an ASP.NET Core application [&hellip;]<\/p>","protected":false},"author":71,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10126,1816,1812,2396],"tags":[9499,1556],"ppma_author":[8937],"class_list":["post-11147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-asp-dotnet","category-couchbase-server","category-n1ql-query","category-transactions","tag-acid-transactions","tag-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL and NoSQL comparison: ASP.NET application - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This SQL and NoSQL comparison shows the application code and queries for both SQL Server and Couchbase, including paging, SQL, load testing.\" \/>\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\/sql-nosql-comparison-aspnet-application\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL and NoSQL comparison: ASP.NET application\" \/>\n<meta property=\"og:description\" content=\"This SQL and NoSQL comparison shows the application code and queries for both SQL Server and Couchbase, including paging, SQL, load testing.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/sql-nosql-comparison-aspnet-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-27T15:01:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T02:40:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/05\/13301-sql-server-loader-performance.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\/sql-nosql-comparison-aspnet-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"SQL and NoSQL comparison: ASP.NET application\",\"datePublished\":\"2021-05-27T15:01:06+00:00\",\"dateModified\":\"2025-06-14T02:40:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/\"},\"wordCount\":1899,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"ACID transactions\",\"SQL Server\"],\"articleSection\":[\".NET\",\"ASP.NET\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\",\"Transactions\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/\",\"name\":\"SQL and NoSQL comparison: ASP.NET application - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2021-05-27T15:01:06+00:00\",\"dateModified\":\"2025-06-14T02:40:16+00:00\",\"description\":\"This SQL and NoSQL comparison shows the application code and queries for both SQL Server and Couchbase, including paging, SQL, load testing.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL and NoSQL comparison: ASP.NET application\"}]},{\"@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":"SQL and NoSQL comparison: ASP.NET application - The Couchbase Blog","description":"\uc774 SQL \ubc0f NoSQL \ube44\uad50\ub294 \ud398\uc774\uc9d5, SQL, \ub85c\ub4dc \ud14c\uc2a4\ud2b8\ub97c \ud3ec\ud568\ud558\uc5ec SQL Server\uc640 Couchbase\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc \ubc0f \ucffc\ub9ac\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.","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\/sql-nosql-comparison-aspnet-application\/","og_locale":"ko_KR","og_type":"article","og_title":"SQL and NoSQL comparison: ASP.NET application","og_description":"This SQL and NoSQL comparison shows the application code and queries for both SQL Server and Couchbase, including paging, SQL, load testing.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/sql-nosql-comparison-aspnet-application\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-05-27T15:01:06+00:00","article_modified_time":"2025-06-14T02:40:16+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/05\/13301-sql-server-loader-performance.png","type":"","width":"","height":""}],"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\/sql-nosql-comparison-aspnet-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"SQL and NoSQL comparison: ASP.NET application","datePublished":"2021-05-27T15:01:06+00:00","dateModified":"2025-06-14T02:40:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/"},"wordCount":1899,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["ACID transactions","SQL Server"],"articleSection":[".NET","ASP.NET","Couchbase Server","SQL++ \/ N1QL Query","Transactions"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/","url":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/","name":"SQL and NoSQL comparison: ASP.NET application - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2021-05-27T15:01:06+00:00","dateModified":"2025-06-14T02:40:16+00:00","description":"\uc774 SQL \ubc0f NoSQL \ube44\uad50\ub294 \ud398\uc774\uc9d5, SQL, \ub85c\ub4dc \ud14c\uc2a4\ud2b8\ub97c \ud3ec\ud568\ud558\uc5ec SQL Server\uc640 Couchbase\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc \ubc0f \ucffc\ub9ac\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/sql-nosql-comparison-aspnet-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL and NoSQL comparison: ASP.NET application"}]},{"@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\/11147","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=11147"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/11147\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=11147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=11147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=11147"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=11147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}