{"id":1023,"date":"2026-10-29T16:42:51","date_gmt":"2026-10-29T07:42:51","guid":{"rendered":"https:\/\/csharp.ihavenomoney.co.kr\/?p=1023"},"modified":"2026-10-29T17:03:55","modified_gmt":"2026-10-29T08:03:55","slug":"dotnet-10-openapi-swagger-ui-scalar-guide","status":"publish","type":"post","link":"https:\/\/csharp.ihavenomoney.co.kr\/?p=1023","title":{"rendered":".NET 10 OpenAPI \uae30\ubcf8 \uc9c0\uc6d0\uacfc Swagger UI\u00b7Scalar \uc124\uce58 \ubc0f \uc124\uc815 \ubc29\ubc95"},"content":{"rendered":"<p><strong>.NET 10\uc5d0\uc11c\ub294 Swagger\uac00 \uae30\ubcf8\uc73c\ub85c \uc81c\uacf5\ub420\uae4c\uc694?<\/strong> \uc815\ud655\ud788\ub294 <strong>OpenAPI \ubb38\uc11c \uc0dd\uc131 \uae30\ub2a5\uc744 Microsoft\uac00 \uacf5\uc2dd \uc9c0\uc6d0<\/strong>\ud558\uba70, Swagger UI\uc640 Scalar \uac19\uc740 \uc6f9 \uae30\ubc18 API \ud14c\uc2a4\ud2b8 \ud654\uba74\uc740 \ubcc4\ub3c4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Visual Studio Code \ud658\uacbd\uc5d0\uc11c .NET 10 Web API\ub97c \uc0dd\uc131\ud558\uace0, OpenAPI JSON\uacfc Swagger UI \ubc0f Scalar\ub97c \uac01\uac01 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc744 \ub2e8\uacc4\ubcc4\ub85c \uc815\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n<div style=\"background:#eef5ff;border-left:4px solid #2563eb;padding:14px 18px;margin:20px 0;border-radius:5px;\"><strong>\ud575\uc2ec \uc694\uc57d<\/strong><br \/>OpenAPI \uba85\uc138 JSON: <code>\/openapi\/v1.json<\/code><br \/>Swagger UI: <code>\/swagger<\/code> (\ubcc4\ub3c4 \uc124\uce58)<br \/>Scalar: <code>\/scalar<\/code> (\ubcc4\ub3c4 \uc124\uce58)<br \/>\uae30\ubcf8 \uad8c\uc7a5: <code>Microsoft.AspNetCore.OpenApi<\/code> + \ud544\uc694\ud55c UI \ud558\ub098 \uc120\ud0dd<\/div>\n<h2>1. .NET 8\uacfc .NET 10\uc758 OpenAPI\u00b7Swagger \ube44\uad50<\/h2>\n<div style=\"overflow-x:auto;\">\n<table style=\"width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th style=\"text-align:left;padding:10px;border:1px solid #ddd;\">\ud56d\ubaa9<\/th>\n<th style=\"text-align:left;padding:10px;border:1px solid #ddd;\">.NET 8 \uc77c\ubc18\uc801\uc778 \uad6c\uc131<\/th>\n<th style=\"text-align:left;padding:10px;border:1px solid #ddd;\">.NET 10 \uae30\ubcf8 \uad6c\uc131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\ubb38\uc11c \uc0dd\uc131<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">Swashbuckle \ub9ce\uc774 \uc0ac\uc6a9<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">Microsoft.AspNetCore.OpenApi<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uc11c\ube44\uc2a4 \ub4f1\ub85d<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>AddSwaggerGen()<\/code> (Swashbuckle)<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>AddOpenApi()<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">JSON \ub178\ucd9c<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>UseSwagger()<\/code> (Swashbuckle)<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>MapOpenApi()<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uae30\ubcf8 JSON \uacbd\ub85c<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>\/swagger\/v1\/swagger.json<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>\/openapi\/v1.json<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">UI \ud3ec\ud568 \uc5ec\ubd80<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">\ud328\ud0a4\uc9c0\/\ud15c\ud50c\ub9bf \uad6c\uc131\uc5d0 \ub530\ub984<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uae30\ubcf8 \ud15c\ud50c\ub9bf\uc5d0 UI \ubbf8\ud3ec\ud568<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uae30\ubcf8 OpenAPI \ubc84\uc804<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">\ud328\ud0a4\uc9c0 \uc124\uc815\uc5d0 \ub530\ub77c \ub2e4\ub984<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">3.1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\ucc38\uace0: .NET 8\uc5d0\uc11c\ub3c4 \ub2e4\ub978 \ud328\ud0a4\uc9c0 \uc870\ud569\uc73c\ub85c OpenAPI\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc704 \ud45c\ub294 \ud754\ud788 \uc0ac\uc6a9\ud558\ub294 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc131\uc744 \ube44\uad50\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>2. .NET 10 SDK \ud655\uc778 \ubc0f Web API \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131<\/h2>\n<p>\uba3c\uc800 <a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/10.0\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft .NET 10 SDK<\/a>\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. VS Code\uc758 <strong>\ud130\ubbf8\ub110<\/strong>\uc744 \uc5f4\uace0 \uc124\uce58 \uc5ec\ubd80\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet --version\ndotnet --list-sdks<\/code><\/pre>\n<p>\uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\uace0 \ud3f4\ub354\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet new webapi -n MyApi -f net10.0\ncd MyApi\ncode .<\/code><\/pre>\n<p>\uc77c\ubc18\uc801\uc778 .NET 10 Web API \ud15c\ud50c\ub9bf\uc740 <code>Microsoft.AspNetCore.OpenApi<\/code> \uad00\ub828 \uad6c\uc131\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uae30\uc874 \ud504\ub85c\uc81d\ud2b8\ub77c\uba74 NuGet \ud328\ud0a4\uc9c0\ub97c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet add package Microsoft.AspNetCore.OpenApi<\/code><\/pre>\n<h2>3. .NET 10 \uae30\ubcf8 OpenAPI \uae30\ub2a5 \ud65c\uc131\ud654<\/h2>\n<p><code>Program.cs<\/code>\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\uc131\ud569\ub2c8\ub2e4. \uc544\ub798 \uc608\uc81c\ub294 \ucd5c\uc18c API(Minimal API) \ud504\ub85c\uc81d\ud2b8\ub85c, \uc678\ubd80 Swagger \ubb38\uc11c \uc0dd\uc131 \ud328\ud0a4\uc9c0 \uc5c6\uc774 OpenAPI JSON\uc744 \uc81c\uacf5\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-csharp\">var builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenApi();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi();\n}\n\napp.MapGet(\"\/hello\", () =&gt;\n    Results.Ok(new { Message = \"Hello .NET 10\" }))\n    .WithName(\"GetHello\");\n\napp.Run();<\/code><\/pre>\n<p>\ud504\ub85c\uc81d\ud2b8\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet run<\/code><\/pre>\n<p>\ud130\ubbf8\ub110\uc5d0 \ud45c\uc2dc\ub418\ub294 \ud3ec\ud2b8\ub97c \ud655\uc778\ud55c \ub4a4 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ub2e4\uc74c URL\uc744 \uc5fd\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-text\">https:\/\/localhost:\ud3ec\ud2b8\ubc88\ud638\/openapi\/v1.json<\/code><\/pre>\n<p>\uc815\uc0c1 \uc751\ub2f5\uc5d0\uc11c\ub294 \ubb38\uc11c\uc758 \ucd5c\uc0c1\ub2e8\uc5d0\uc11c <code>\"openapi\": \"3.1.0\"<\/code>\uacfc \uac19\uc740 \ubc84\uc804 \ud544\ub4dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \uc774 \ub2e8\uacc4\uc5d0\uc11c\ub294 \uc2dc\uac01\uc801\uc778 Swagger UI \ud654\uba74\uc774 \uc544\ub2c8\ub77c <strong>JSON \ubb38\uc11c<\/strong>\uac00 \ucd9c\ub825\ub429\ub2c8\ub2e4.<\/p>\n<h2>4. Swagger UI \uc124\uce58 \ubc0f \uc0ac\uc6a9<\/h2>\n<p>API \ubaa9\ub85d\uc744 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ubcf4\uace0 <strong>Try it out<\/strong>\uc73c\ub85c \uc9c1\uc811 \ud14c\uc2a4\ud2b8\ud558\ub824\uba74 UI \uc804\uc6a9 \ud328\ud0a4\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. .NET 10\uc758 \uae30\ubcf8 OpenAPI \uc0dd\uc131 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ubb38\uc11c \uc0dd\uc131\uae30\ub97c \uc911\ubcf5 \ub4f1\ub85d\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet add package Swashbuckle.AspNetCore.SwaggerUi<\/code><\/pre>\n<p>\ub2e4\uc74c\uc740 Swagger UI\uae4c\uc9c0 \ud65c\uc131\ud654\ud55c \uc804\uccb4 <code>Program.cs<\/code>\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-csharp\">var builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenApi();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi();\n\n    app.UseSwaggerUI(options =&gt;\n    {\n        options.SwaggerEndpoint(\"\/openapi\/v1.json\", \"MyApi v1\");\n    });\n}\n\napp.MapGet(\"\/hello\", () =&gt;\n    Results.Ok(new { Message = \"Hello .NET 10\" }))\n    .WithName(\"GetHello\");\n\napp.Run();<\/code><\/pre>\n<p>\uc2e4\ud589 \ud6c4 <code>https:\/\/localhost:\ud3ec\ud2b8\ubc88\ud638\/swagger<\/code>\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4. \uc2e4\uc81c \ud3ec\ud2b8 \ubc88\ud638\ub294 <code>dotnet run<\/code> \ucd9c\ub825\uc5d0 \ud45c\uc2dc\ub41c \uc8fc\uc18c\ub97c \ub530\ub985\ub2c8\ub2e4.<\/p>\n<h2>5. Swagger UI \ub300\uc2e0 Scalar \uc0ac\uc6a9\ud558\uae30<\/h2>\n<p><a href=\"https:\/\/scalar.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Scalar<\/a>\ub294 OpenAPI \ubb38\uc11c\ub97c \uc77d\uc5b4 API \ubaa9\ub85d\uacfc \uc694\uccad\/\uc751\ub2f5\uc744 \uc2dc\uac01\uc801\uc73c\ub85c \ud45c\uc2dc\ud558\ub294 \ud604\ub300\uc801\uc778 \ub300\ud654\ud615 API \ubb38\uc11c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc6d0\ud558\ub294 UI\uc5d0 \ub530\ub77c Swagger UI \ub300\uc2e0 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet add package Scalar.AspNetCore<\/code><\/pre>\n<p>Scalar\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 <code>Program.cs<\/code> \uc608\uc81c:<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-csharp\">using Scalar.AspNetCore;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenApi();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi();\n    app.MapScalarApiReference();\n}\n\napp.MapGet(\"\/hello\", () =&gt;\n    Results.Ok(new { Message = \"Hello .NET 10\" }))\n    .WithName(\"GetHello\");\n\napp.Run();<\/code><\/pre>\n<p>\uc2e4\ud589 \ud6c4 <code>https:\/\/localhost:\ud3ec\ud2b8\ubc88\ud638\/scalar<\/code>\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4. Swagger UI\uc640 Scalar\ub294 \ub458 \ub2e4 OpenAPI JSON\uc744 \uc18c\ube44\ud558\ub294 \ub3c4\uad6c\uc774\uba70, \uc77c\ubc18\uc801\uc778 \uac1c\uc778 \uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c\ub294 \ub458 \uc911 \ud558\ub098\ub9cc \uc124\uce58\ud574\ub3c4 \ucda9\ubd84\ud569\ub2c8\ub2e4.<\/p>\n<h2>5-1. Scalar \uc2e4\uc804 \uc0ac\uc6a9\ubc95: GET\u00b7POST API \uc9c1\uc811 \ud14c\uc2a4\ud2b8<\/h2>\n<p>Scalar\ub294 \ub2e8\uc21c\ud55c API \ubb38\uc11c \ubdf0\uc5b4\uac00 \uc544\ub2d9\ub2c8\ub2e4. <strong>API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc120\ud0dd\ud558\uc5ec \uc694\uccad\uc744 \uc804\uc1a1\ud558\uace0 HTTP \uc0c1\ud0dc \ucf54\ub4dc\uc640 JSON \uc751\ub2f5\uc744 \ud655\uc778<\/strong>\ud558\ub294 \ub300\ud654\ud615 API \ud14c\uc2a4\ud2b8 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc544\ub798 \uc608\uc81c\ub294 \uc55e\uc11c \ub9cc\ub4e0 .NET 10 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ubc14\ub85c \uc2e4\uc2b5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\u2460 \uc2e4\uc2b5\uc6a9 GET\u00b7POST \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uc791\uc131<\/h3>\n<p>\uae30\uc874 <code>Program.cs<\/code>\ub97c \uc544\ub798 \uc608\uc81c\ub85c \ubc14\uafc9\ub2c8\ub2e4. \uba54\ubaa8\ub9ac\uc5d0 \uc0c1\ud488 \ubaa9\ub85d\uc744 \uc800\uc7a5\ud558\ub294 \ub2e8\uc21c\ud55c \uc0d8\ud50c\uc774\uba70 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uadf8\ub7a8\uc744 \uc7ac\uc2dc\uc791\ud558\uba74 \uc0c1\ud488 \ubaa9\ub85d\uc774 \ucd08\uae30\ud654\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-csharp\">using Scalar.AspNetCore;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddOpenApi();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi();\n    app.MapScalarApiReference(options =&gt;\n    {\n        options.WithTitle(\"MyApi - Scalar API \ud14c\uc2a4\ud2b8\");\n    });\n}\n\nvar products = new List&lt;Product&gt;\n{\n    new(1, \"Keyboard\", 35000),\n    new(2, \"Mouse\", 19000)\n};\n\n\/\/ GET \/api\/products : \ubaa9\ub85d \uc870\ud68c\napp.MapGet(\"\/api\/products\", () =&gt; Results.Ok(products))\n   .WithName(\"GetProducts\");\n\n\/\/ GET \/api\/products\/1 : \uc0c1\ud488 \ud55c \uac1c \uc870\ud68c\napp.MapGet(\"\/api\/products\/{id:int}\", (int id) =&gt;\n{\n    var item = products.FirstOrDefault(p =&gt; p.Id == id);\n    return item is null ? Results.NotFound() : Results.Ok(item);\n}).WithName(\"GetProductById\");\n\n\/\/ POST \/api\/products : \uc0c1\ud488 \ub4f1\ub85d\napp.MapPost(\"\/api\/products\", (CreateProductRequest request) =&gt;\n{\n    var newId = products.Count == 0 ? 1 : products.Max(p =&gt; p.Id) + 1;\n    var item = new Product(newId, request.Name, request.Price);\n    products.Add(item);\n    return Results.Created($\"\/api\/products\/{item.Id}\", item);\n}).WithName(\"CreateProduct\");\n\napp.Run();\n\nrecord Product(int Id, string Name, decimal Price);\nrecord CreateProductRequest(string Name, decimal Price);<\/code><\/pre>\n<p>\uc2e4\ud589 \uba85\ub839:<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet run<\/code><\/pre>\n<p>\ud130\ubbf8\ub110\uc758 \uc2e4\uc81c \uc8fc\uc18c\ub97c \uae30\uc900\uc73c\ub85c <code>https:\/\/localhost:\ud3ec\ud2b8\ubc88\ud638\/scalar<\/code>\uc5d0 \uc811\uc18d\ud569\ub2c8\ub2e4. HTTPS \uc8fc\uc18c\uac00 \uc5c6\ub2e4\uba74 \ud130\ubbf8\ub110\uc5d0 \ud45c\uc2dc\ub41c HTTP \uc8fc\uc18c\uc5d0\uc11c \ub3d9\uc77c\ud55c \uacbd\ub85c\ub97c \uc0ac\uc6a9\ud558\uc138\uc694. <code>\/openapi\/v1.json<\/code>\uc5d0\ub294 \uc774 \uc138 \uac00\uc9c0 API\uac00 \ubb38\uc11c\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h3>\u2461 Scalar \ud654\uba74\uc5d0\uc11c API \ucc3e\uae30<\/h3>\n<ol>\n<li>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <code>\/scalar<\/code> \ud398\uc774\uc9c0\ub97c \uc5fd\ub2c8\ub2e4.<\/li>\n<li>API \ubaa9\ub85d\uc5d0\uc11c <code>GET \/api\/products<\/code>, <code>GET \/api\/products\/{id}<\/code>, <code>POST \/api\/products<\/code> \ud56d\ubaa9\uc744 \ucc3e\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uba54\uc11c\ub4dc\uc640 \uacbd\ub85c\ub97c \ud074\ub9ad\ud574 \uc124\uba85, \ub9e4\uac1c\ubcc0\uc218, \uc694\uccad \ubc0f \uc751\ub2f5 \ud615\uc2dd\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>Test Request<\/strong> \uae30\ub2a5\uc744 \uc5f4\uc5b4 \ud14c\uc2a4\ud2b8 \uc694\uccad\uc744 \uc900\ube44\ud569\ub2c8\ub2e4. \uba54\ub274 \uc774\ub984\uc774\ub098 \ubc30\uce58\ub294 Scalar \ubc84\uc804\uc5d0 \ub530\ub77c \uc870\uae08 \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h3>\u2462 GET \uc694\uccad \ud14c\uc2a4\ud2b8<\/h3>\n<p><strong>GET \/api\/products<\/strong>\ub97c \uc120\ud0dd\ud558\uace0 \ud14c\uc2a4\ud2b8 \uc694\uccad\uc744 \uc804\uc1a1\ud569\ub2c8\ub2e4. \uc815\uc0c1 \uc751\ub2f5\uc774\ub77c\uba74 \uc0c1\ud0dc \ucf54\ub4dc\ub294 <strong>200 OK<\/strong>\uc774\uba70 \uc544\ub798\uc640 \ube44\uc2b7\ud55c JSON \ubaa9\ub85d\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-json\">[\n  { \"id\": 1, \"name\": \"Keyboard\", \"price\": 35000 },\n  { \"id\": 2, \"name\": \"Mouse\", \"price\": 19000 }\n]<\/code><\/pre>\n<p><strong>GET \/api\/products\/{id}<\/strong>\ub97c \uc120\ud0dd\ud558\uc5ec \uacbd\ub85c \ub9e4\uac1c\ubcc0\uc218 <code>id<\/code>\uc5d0 <code>1<\/code>\uc744 \uc785\ub825\ud558\uace0 \uc804\uc1a1\ud558\uba74 Keyboard \uc0c1\ud488 \ud55c \uac74\uc744 \ubc1b\uc2b5\ub2c8\ub2e4. \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 <code>id<\/code>\ub97c \uc785\ub825\ud558\uba74 \uc608\uc81c \ucf54\ub4dc\uc5d0\uc11c <strong>404 Not Found<\/strong>\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<h3>\u2463 POST \uc694\uccad: JSON \ub4f1\ub85d\ud558\uae30<\/h3>\n<p><strong>POST \/api\/products<\/strong>\ub97c \uc120\ud0dd\ud55c \ub4a4 \uc694\uccad \ubcf8\ubb38(Body)\uc5d0 \ub2e4\uc74c JSON\uc744 \uc785\ub825\ud569\ub2c8\ub2e4. <code>Content-Type: application\/json<\/code>\uc744 \uc0ac\uc6a9\ud574\uc57c \ud558\uba70 Scalar\uc758 \uc694\uccad \ud654\uba74\uc5d0\uc11c \ud574\ub2f9 \ud5e4\ub354\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-json\">{\n  \"name\": \"Monitor\",\n  \"price\": 250000\n}<\/code><\/pre>\n<p>\uc694\uccad\uc744 \uc804\uc1a1\ud558\uba74 \uc0d8\ud50c API\ub294 <strong>201 Created<\/strong>\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc751\ub2f5 \ubcf8\ubb38\uc740 \ub2e4\uc74c\uacfc \ube44\uc2b7\ud569\ub2c8\ub2e4. \ub2e4\uc2dc <code>GET \/api\/products<\/code>\ub97c \ud638\ucd9c\ud558\uba74 \uc2e0\uaddc \uc0c1\ud488\uc774 \ubaa9\ub85d\uc5d0 \ud3ec\ud568\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-json\">{\n  \"id\": 3,\n  \"name\": \"Monitor\",\n  \"price\": 250000\n}<\/code><\/pre>\n<h3>\u2464 \uc751\ub2f5 \uacb0\uacfc\uc5d0\uc11c \ud655\uc778\ud560 \uc0ac\ud56d<\/h3>\n<ul>\n<li><strong>Status:<\/strong> 200(\uc870\ud68c \uc131\uacf5), 201(\uc0dd\uc131 \uc131\uacf5), 400(\uc798\ubabb\ub41c \uc694\uccad), 401(\uc778\uc99d \ud544\uc694), 403(\uad8c\ud55c \ubd80\uc871), 404(\uacbd\ub85c\/\ub9ac\uc18c\uc2a4 \uc5c6\uc74c), 500(\uc11c\ubc84 \uc608\uc678) \ub4f1<\/li>\n<li><strong>Response Body:<\/strong> API\uac00 \ubc18\ud658\ud55c JSON \ubc0f \uc624\ub958 \uc124\uba85<\/li>\n<li><strong>Headers:<\/strong> \uc751\ub2f5 Content-Type \ub4f1 HTTP \ud5e4\ub354<\/li>\n<li><strong>Code Samples:<\/strong> \uc9c0\uc6d0\ub418\ub294 \uc5b8\uc5b4\u00b7HTTP \ud074\ub77c\uc774\uc5b8\ud2b8\ubcc4 \uc694\uccad \uc608\uc2dc\ub97c \ud655\uc778\ud558\uace0 \ubcf5\uc0ac\ud558\uc5ec \uc7ac\uc0ac\uc6a9<\/li>\n<\/ul>\n<h3>\u2465 JWT Bearer \ud1a0\ud070\uc774 \ud544\uc694\ud55c API \ud14c\uc2a4\ud2b8<\/h3>\n<p>\uc778\uc99d\uc774 \ud544\uc694\ud55c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud14c\uc2a4\ud2b8\ud558\ub294 \uacbd\uc6b0 Scalar\uc758 \uc778\uc99d(Auth\/Authentication) \uc785\ub825 \uc601\uc5ed\uc5d0\uc11c Bearer \ud1a0\ud070\uc744 \uc785\ub825\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc815\uc0c1\uc801\uc778 \uc694\uccad\uc5d0\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \uc544\ub798 \ud5e4\ub354\uac00 \ucd94\uac00\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-http\">Authorization: Bearer eyJhbGciOi...<\/code><\/pre>\n<p><strong>\uc8fc\uc758:<\/strong> Scalar\uc758 \uc778\uc99d UI\uc5d0 \uc120\ud0dd\ud560 \ud56d\ubaa9\uc744 \ud45c\uc2dc\ud558\ub824\uba74 OpenAPI \ubb38\uc11c\uc5d0 \ud574\ub2f9 \ubcf4\uc548 \uc2a4\ud0a4\ub9c8\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub2e8\uc21c\ud788 <code>app.MapScalarApiReference()<\/code>\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 ASP.NET Core \uc11c\ubc84\uc5d0 JWT \uc778\uc99d \uae30\ub2a5\uc774 \ucd94\uac00\ub418\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c API\uc5d0\ub3c4 \uc778\uc99d \ubbf8\ub4e4\uc6e8\uc5b4\uc640 \uad8c\ud55c \uc124\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uac1c\ubc1c \uc911\uc5d0\ub3c4 \ud1a0\ud070\u00b7\ube44\ubc00\ubc88\ud638\ub97c <code>Program.cs<\/code>\uc5d0 \ud558\ub4dc\ucf54\ub529\ud558\uac70\ub098 \uacf5\uac1c \ubb38\uc11c\uc5d0 \ud3ec\ud568\ud558\uc9c0 \ub9c8\uc138\uc694.<\/p>\n<h3>\u2466 Scalar\uc758 \uc81c\ubaa9\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uc18d \uacbd\ub85c \ubcc0\uacbd<\/h3>\n<p>Scalar UI \uc81c\ubaa9\uacfc \ubc30\uce58\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798 \ucf54\ub4dc\ub294 <code>app.MapScalarApiReference()<\/code> \ubd80\ubd84\uc744 \ub300\uccb4\ud558\ub294 \uc608\uc81c\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-csharp\">app.MapScalarApiReference(\"\/docs\", options =&gt;\n{\n    options.WithTitle(\"MyApi \uac1c\ubc1c\uc790 API \ubb38\uc11c\")\n           .WithClassicLayout();\n});<\/code><\/pre>\n<p>\uc774 \uc124\uc815\uc744 \uc801\uc6a9\ud55c \ub4a4 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <code>https:\/\/localhost:\ud3ec\ud2b8\ubc88\ud638\/docs<\/code>\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4. <code>WithClassicLayout()<\/code>\uc740 \uc0ac\uc6a9\ud558\uae30 \uc26c\uc6b4 \ubb38\uc11c \ub808\uc774\uc544\uc6c3 \uc120\ud0dd\uc9c0 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4.<\/p>\n<h3>\u2467 \uc790\uc8fc \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c \ud574\uacb0<\/h3>\n<ul>\n<li><strong>\/scalar\uac00 404:<\/strong> <code>Scalar.AspNetCore<\/code> \uc124\uce58\uc640 <code>MapScalarApiReference()<\/code> \ud638\ucd9c, \uadf8\ub9ac\uace0 Development \ud658\uacbd\uc778\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>API \ubaa9\ub85d\uc774 \ube44\uc5b4 \uc788\uc74c:<\/strong> <code>\/openapi\/v1.json<\/code>\uc774 \uc815\uc0c1 JSON\uc744 \ubc18\ud658\ud558\ub294\uc9c0 \ud655\uc778\ud558\uace0 \ucd5c\uc18c API\uac00 <code>app.Run()<\/code>\ubcf4\ub2e4 \uc55e\uc5d0 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc810\uac80\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>404\/405 \uc751\ub2f5:<\/strong> \uc694\uccad URL, HTTP \uba54\uc11c\ub4dc(GET\/POST), <code>id<\/code> \ub4f1 \uacbd\ub85c \uac12\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>400 \uc751\ub2f5:<\/strong> Body\uc758 JSON \ubb38\ubc95\uacfc \uc18d\uc131\uba85\u00b7\uac12 \uc720\ud615\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>401\/403 \uc751\ub2f5:<\/strong> \uc778\uc99d \ud1a0\ud070, \ub9cc\ub8cc \uc5ec\ubd80, \uc11c\ubc84\uc758 \uad8c\ud55c \uc815\ucc45\uc744 \uc810\uac80\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\ube0c\ub77c\uc6b0\uc800 \uc694\uccad \uc2e4\ud328:<\/strong> API \uc11c\ubc84\uac00 \uc2e4\ud589 \uc911\uc778\uc9c0, \uc2e4\uc81c \ud3ec\ud2b8\/HTTP\u00b7HTTPS \uc8fc\uc18c\uac00 \ub9de\ub294\uc9c0, \uc778\uc99d\uc11c\ub098 CORS \uc815\ucc45 \ubb38\uc81c\ub294 \uc5c6\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>\ucd94\uac00 \ucc38\uace0:<\/strong> Scalar\ub294 \uc6f9 API \ubb38\uc11c \ud398\uc774\uc9c0 \uc678\uc5d0\ub3c4 \ubcc4\ub3c4 API Client \uc81c\ud488\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub3c5\ub9bd\ud615 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c\ub294 \uceec\ub809\uc158, \ud658\uacbd \ubcc0\uc218, \uc694\uccad \uc790\ub3d9\ud654 \ubc0f \uc751\ub2f5 \ud14c\uc2a4\ud2b8\ub97c \ub354 \ud3ed\ub113\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub450 \uc81c\ud488\uc744 \ub3d9\uc77c\ud55c UI\ub85c \ud63c\ub3d9\ud558\uc9c0 \ub9c8\uc138\uc694.<\/p>\n<p>Scalar \uacf5\uc2dd \uc0ac\uc6a9 \uc548\ub0b4: <a href=\"https:\/\/scalar.com\/docs-for\/dotnet\" target=\"_blank\" rel=\"noopener noreferrer\">ASP.NET Core + Scalar \uc2dc\uc791\ud558\uae30<\/a> \/ <a href=\"https:\/\/scalar.com\/products\/api-references\/integrations\/aspnetcore\/integration\" target=\"_blank\" rel=\"noopener noreferrer\">Scalar.AspNetCore \uc124\uc815\uacfc \uc778\uc99d<\/a> \/ <a href=\"https:\/\/scalar.com\/products\/api-client\/getting-started\" target=\"_blank\" rel=\"noopener noreferrer\">Scalar API Client \uc0ac\uc6a9 \uac00\uc774\ub4dc<\/a><\/p>\n<h2>6. Swagger UI\uc640 Scalar \ube44\uad50<\/h2>\n<div style=\"overflow-x:auto;\">\n<table style=\"width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th style=\"padding:10px;border:1px solid #ddd;\">\uad6c\ubd84<\/th>\n<th style=\"padding:10px;border:1px solid #ddd;\">Swagger UI<\/th>\n<th style=\"padding:10px;border:1px solid #ddd;\">Scalar<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uae30\ubcf8 \uc6a9\ub3c4<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">API \ubb38\uc11c \ud655\uc778\u00b7\uc694\uccad \ud14c\uc2a4\ud2b8<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">API \ubb38\uc11c \ud655\uc778\u00b7\uc694\uccad \ud14c\uc2a4\ud2b8<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\ud654\uba74 \uad6c\uc131<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uc804\ud1b5\uc801\uc778 Swagger UI<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">\ud604\ub300\uc801\uc778 \ubb38\uc11c UI<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">NuGet \ud328\ud0a4\uc9c0<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">Swashbuckle.AspNetCore.SwaggerUi<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\">Scalar.AspNetCore<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #ddd;\">\uc811\uc18d \uc8fc\uc18c<\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>\/swagger<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #ddd;\"><code>\/scalar<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>7. \uc790\uc8fc \ubc1c\uc0dd\ud558\ub294 \uc624\ub958\uc640 \ud574\uacb0 \ubc29\ubc95<\/h2>\n<h3>\uc624\ub958 \u2460 Unable to render this definition<\/h3>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-text\">The provided definition does not specify a valid version field.\nSupported version fields are swagger: \"2.0\" and openapi: 3.x.y<\/code><\/pre>\n<p>\uba3c\uc800 <code>\/openapi\/v1.json<\/code>\uc744 \uc9c1\uc811 \uc5f4\uc5b4\uc11c <code>openapi<\/code> \ubc84\uc804 \ud544\ub4dc\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. 404\ub098 500 \uc624\ub958 \ub610\ub294 HTML \uc624\ub958 \ud398\uc774\uc9c0\uac00 \ub098\uc624\uba74 Swagger UI\ubcf4\ub2e4 <strong>\uc11c\ubc84\uc758 JSON \uc0dd\uc131 \uc624\ub958<\/strong>\ubd80\ud130 \ud574\uacb0\ud574\uc57c \ud569\ub2c8\ub2e4. .NET 10 \uae30\ubcf8 \uad6c\uc131\uacfc \uc774\uc804 Swashbuckle \uacbd\ub85c(<code>\/swagger\/v1\/swagger.json<\/code>)\ub97c \ud63c\ub3d9\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc8fc\uc758\ud558\uc138\uc694.<\/p>\n<h3>\uc624\ub958 \u2461 Microsoft.OpenApi.Models.OpenApiOperation TypeLoadException<\/h3>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-text\">System.TypeLoadException: Could not load type\n'Microsoft.OpenApi.Models.OpenApiOperation'\nfrom assembly 'Microsoft.OpenApi, Version=2.7.5.0'<\/code><\/pre>\n<p>\uc774 \uc624\ub958\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \uc624\ub798\ub41c OpenAPI \uad00\ub828 \ucf54\ub4dc\u00b7\ud328\ud0a4\uc9c0\uac00 \uc0c8\ub85c\uc6b4 <code>Microsoft.OpenApi<\/code> 2.x\uc640 \ucda9\ub3cc\ud560 \ub54c \ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 .NET 8\uc758 \uc77c\ubd80 <code>.WithOpenApi()<\/code> \uad6c\ud604\uacfc OpenAPI.NET 2.x \uc870\ud569\uc740 \ud638\ud658\ub418\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc9c1\uc811 \ucc38\uc870\ud55c \ud328\ud0a4\uc9c0\uc640 \uac04\uc811 \ucc38\uc870\ud55c \ud328\ud0a4\uc9c0\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet list package --include-transitive<\/code><\/pre>\n<p><strong>\uc911\uc694:<\/strong> .NET 10\uc5d0\uc11c\ub294 <code>Microsoft.OpenApi<\/code> 2.x \uae30\ubc18 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc73c\ubbc0\ub85c, \uc774\uc804 \uc624\ub958\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \ubb34\uc870\uac74 1.x\ub85c \ub2e4\uc6b4\uadf8\ub808\uc774\ub4dc\ud558\ub294 \ubc29\ubc95\uc740 \uad8c\uc7a5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. .NET \ubc84\uc804\uacfc OpenAPI \ud328\ud0a4\uc9c0\uc758 \ud638\ud658 \uc870\ud569\uc744 \ud655\uc778\ud558\uace0, \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc624\ub798\ub41c Swagger \uc124\uc815\uc774\ub098 <code>.WithOpenApi()<\/code> \ucf54\ub4dc\ub97c \uc815\ub9ac\ud558\uc138\uc694.<\/p>\n<h3>\uc624\ub958 \u2462 \/swagger \ub610\ub294 \/scalar \uc811\uc18d \uc2dc 404<\/h3>\n<p>\ud574\ub2f9 UI \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud588\ub294\uc9c0, <code>UseSwaggerUI()<\/code> \ub610\ub294 <code>MapScalarApiReference()<\/code>\ub97c \ub4f1\ub85d\ud588\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. \uc608\uc81c\ucc98\ub7fc <code>IsDevelopment()<\/code> \uc870\uac74 \uc548\uc5d0 \ub450\uc5c8\ub2e4\uba74 \ud658\uacbd\uc774 <code>Development<\/code>\uac00 \uc544\ub2d0 \ub54c\ub294 UI\uac00 \ud45c\uc2dc\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uc624\ub958 \u2463 \uc124\uce58 \ud6c4\uc5d0\ub3c4 \uc774\uc804 \uc624\ub958\uac00 \ubc18\ubcf5\ub428<\/h3>\n<p>\ube0c\ub77c\uc6b0\uc800 \uce90\uc2dc\ub97c \uac15\ub825 \uc0c8\ub85c\uace0\uce68(<code>Ctrl + F5<\/code>)\ud558\uace0 \ud328\ud0a4\uc9c0 \ucc38\uc870\ub97c \uc810\uac80\ud55c \ub4a4 \ub2e4\uc2dc \ube4c\ub4dc\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"wp-block-code\" style=\"overflow-x:auto;background:#f6f8fa;border:1px solid #e5e7eb;border-radius:8px;padding:16px;line-height:1.55;\"><code class=\"language-powershell\">dotnet clean\ndotnet restore\ndotnet build\ndotnet run<\/code><\/pre>\n<h2>8. \uc6b4\uc601 \ud658\uacbd\uc5d0\uc11c \uc8fc\uc758\ud560 \uc810<\/h2>\n<p>OpenAPI \ubb38\uc11c\uc5d0\ub294 API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\u00b7\ub9e4\uac1c\ubcc0\uc218\u00b7\ub370\uc774\ud130 \ubaa8\ub378 \uc815\ubcf4\uac00 \ud3ec\ud568\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c Swagger UI\ub098 Scalar \uac19\uc740 \ub300\ud654\ud615 API \ubb38\uc11c UI\ub294 <strong>\uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c\ub9cc \ud65c\uc131\ud654<\/strong>\ud558\ub294 \uac83\uc774 \uc548\uc804\ud569\ub2c8\ub2e4. \uc6b4\uc601 \ud658\uacbd\uc5d0 \uacf5\uac1c\ud574\uc57c \ud55c\ub2e4\uba74 \uc778\uc99d\u00b7\uc778\uac00 \ubc0f \uc811\uadfc \uc81c\uc5b4\ub97c \uc801\uc6a9\ud558\uc138\uc694.<\/p>\n<h2>9. \uacb0\ub860<\/h2>\n<p>.NET 10\uc5d0\uc11c\ub294 OpenAPI JSON \uc0dd\uc131\uc5d0 <strong><code>AddOpenApi()<\/code>\uc640 <code>MapOpenApi()<\/code><\/strong>\ub97c \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4. API \ud14c\uc2a4\ud2b8 \ud654\uba74\uc774 \ud544\uc694\ud558\ub2e4\uba74 Swagger UI \ub610\ub294 Scalar\ub97c \ucd94\uac00\ud558\uc138\uc694. \uc0c8\ub85c \ub9cc\ub4dc\ub294 API \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c\ub294 <strong>.NET 10 \uae30\ubcf8 OpenAPI + Scalar<\/strong> \uc870\ud569\uc774 \uac04\ub2e8\ud558\uace0 \ud3b8\ub9ac\ud55c \uc120\ud0dd\uc774\uba70, \uae30\uc874 Swagger UI\uc5d0 \uc775\uc219\ud558\ub2e4\uba74 UI \uc804\uc6a9 \ud328\ud0a4\uc9c0\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\ub3c4 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uacf5\uc2dd \ucc38\uace0 \ubb38\uc11c<\/h2>\n<ul>\n<li><a href=\"https:\/\/learn.microsoft.com\/ko-kr\/aspnet\/core\/fundamentals\/openapi\/overview?view=aspnetcore-10.0\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft \u2013 ASP.NET Core OpenAPI \uc9c0\uc6d0 \uac1c\uc694<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/ko-kr\/aspnet\/core\/fundamentals\/openapi\/using-openapi-documents?view=aspnetcore-10.0\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft \u2013 Swagger UI\u00b7Scalar\ub85c OpenAPI \ubb38\uc11c \uc0ac\uc6a9<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/ko-kr\/aspnet\/core\/release-notes\/aspnetcore-10.0?view=aspnetcore-10.0\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft \u2013 ASP.NET Core .NET 10 \ubcc0\uacbd \uc0ac\ud56d<\/a><\/li>\n<li><a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/10.0\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft \u2013 .NET 10 SDK \ub2e4\uc6b4\ub85c\ub4dc<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>ASP.NET Core .NET 10\uc5d0\uc11c OpenAPI\ub294 \uae30\ubcf8 \uc9c0\uc6d0\ub418\uc9c0\ub9cc Swagger UI\ub294 \ubcc4\ub3c4 \uc124\uce58\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. VS Code \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131, AddOpenApi\/MapOpenApi, Swagger UI\uc640 Scalar \uc124\uc815, TypeLoadException \ud574\uacb0 \ubc29\ubc95\uc744 \uc608\uc81c\ub85c \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74,108],"tags":[],"class_list":["post-1023","post","type-post","status-publish","format-standard","hentry","category-c-form","category-net-core"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1023"}],"version-history":[{"count":1,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1023\/revisions"}],"predecessor-version":[{"id":1024,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1023\/revisions\/1024"}],"wp:attachment":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}