{"id":989,"date":"2026-10-28T11:33:37","date_gmt":"2026-10-28T02:33:37","guid":{"rendered":"https:\/\/csharp.ihavenomoney.co.kr\/?p=989"},"modified":"2026-10-29T10:15:08","modified_gmt":"2026-10-29T01:15:08","slug":"builder-services","status":"publish","type":"post","link":"https:\/\/csharp.ihavenomoney.co.kr\/?p=989","title":{"rendered":"ASP.NET Core builder.Services \uc0ac\uc6a9\ubc95: DI \ub4f1\ub85d, CORS, HttpClient\uc640 \uc218\uba85 \uad00\ub9ac"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><code>builder.Services<\/code> \ub4f1\ub85d \uba54\uc11c\ub4dc \uc0c1\uc138 \uc124\uba85<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>builder.Services<\/code>\ub294 <strong>DI(\uc758\uc874\uc131 \uc8fc\uc785) \ucee8\ud14c\uc774\ub108<\/strong>\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc5d0 &#8220;\uc774\ub7f0 \uae30\ub2a5\/\ud074\ub798\uc2a4\ub97c \uc4f0\uaca0\ub2e4&#8221;\uace0 \ub4f1\ub85d\ud574 \ub450\uba74, \uc571\uc774 \uc2e4\ud589\ub420 \ub54c \ud544\uc694\ud55c \uacf3\uc5d0 ASP.NET Core\uac00 \uc54c\uc544\uc11c \ub9cc\ub4e4\uc5b4 \ub123\uc5b4 \uc90d\ub2c8\ub2e4. \uc544\ub798 \uba54\uc11c\ub4dc\ub4e4\uc740 \ubaa8\ub450 \uc774 \ucee8\ud14c\uc774\ub108\uc5d0 \ubb34\uc5b8\uac00\ub97c \ub4f1\ub85d\ud558\ub294 \uc5ed\ud560\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. <code>AddCors<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddCors(options =&gt; options.AddPolicy(\"FrontPage\", policy =&gt;\n    policy.WithOrigins(frontPageOrigins)\n          .WithMethods(\"GET\", \"POST\")\n          .WithHeaders(\"Content-Type\", \"X-Admin-Key\")));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: CORS \uc815\ucc45\uc744 <strong>\uc815\uc758<\/strong>\ud569\ub2c8\ub2e4. \uc815\uc758\ub9cc \ud560 \ubfd0, \uc2e4\uc81c \uc801\uc6a9\uc740 \uc544\ub798 \ubbf8\ub4e4\uc6e8\uc5b4\uac00 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.UseCors(\"FrontPage\");   \/\/ \uc815\uc758\ud55c \uc815\ucc45\uc744 \uc694\uccad \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \uc801\uc6a9<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\uba54\uc11c\ub4dc<\/th><th>\uc758\ubbf8<\/th><\/tr><\/thead><tbody><tr><td><code>AddPolicy(\"FrontPage\", ...)<\/code><\/td><td>\uc774\ub984\uc774 \uc788\ub294 \uc815\ucc45\uc744 \ub4f1\ub85d<\/td><\/tr><tr><td><code>WithOrigins(...)<\/code><\/td><td>\ud5c8\uc6a9\ud560 \uc624\ub9ac\uc9c4 \ubaa9\ub85d<\/td><\/tr><tr><td><code>WithMethods(\"GET\",\"POST\")<\/code><\/td><td>\ud5c8\uc6a9\ud560 HTTP \uba54\uc11c\ub4dc (PUT, DELETE\ub294 \ucc28\ub2e8\ub428)<\/td><\/tr><tr><td><code>WithHeaders(...)<\/code><\/td><td>\ud5c8\uc6a9\ud560 \uc694\uccad \ud5e4\ub354<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc38\uace0\ub85c <code>AllowAnyOrigin()<\/code>, <code>AllowAnyMethod()<\/code>, <code>AllowAnyHeader()<\/code>\ub3c4 \uc788\uc9c0\ub9cc \ubaa8\ub450 \ud5c8\uc6a9\uc774\ub77c \ubcf4\uc548\uc0c1 \uad8c\uc7a5\ub418\uc9c0 \uc54a\uace0, \uc774 \ucf54\ub4dc\ub294 \ud544\uc694\ud55c \uac83\ub9cc \uc5ec\ub294 \ubc29\uc2dd\uc744 \uc37c\uc2b5\ub2c8\ub2e4. \ub610\ud55c <code>AllowCredentials()<\/code>\ub97c \uc4f0\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \ucfe0\ud0a4 \uac19\uc740 \uc790\uaca9 \uc99d\uba85 \ud3ec\ud568 \uc694\uccad\uc740 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 (\ud5e4\ub354 \ud0a4 \ubc29\uc2dd\uc774\ub77c \ud544\uc694 \uc5c6\uc74c).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. <code>AddControllers<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddControllers();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: <code>[ApiController]<\/code> \ud074\ub798\uc2a4(\ucee8\ud2b8\ub864\ub7ec)\ub97c \uc0ac\uc6a9\ud558\ub294 \ub370 \ud544\uc694\ud55c \uae30\ub2a5\uc744 \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3ec\ud568\ub418\ub294 \uac83\ub4e4:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucee8\ud2b8\ub864\ub7ec \ud0d0\uc0c9 (\uc5b4\uc148\ube14\ub9ac\uc5d0\uc11c <code>ControllerBase<\/code>\ub97c \uc0c1\uc18d\ud55c \ud074\ub798\uc2a4 \ucc3e\uae30)<\/li>\n\n\n\n<li>\ubaa8\ub378 \ubc14\uc778\ub529 (\uc694\uccad JSON, \ucffc\ub9ac\uc2a4\ud2b8\ub9c1\uc744 C# \uac1d\uccb4\ub85c \ubcc0\ud658)<\/li>\n\n\n\n<li>JSON \uc9c1\ub82c\ud654\/\uc5ed\uc9c1\ub82c\ud654 (<code>System.Text.Json<\/code>)<\/li>\n\n\n\n<li>\ubaa8\ub378 \uac80\uc99d (<code>[Required]<\/code> \ub4f1 \uc5b4\ud2b8\ub9ac\ubdf0\ud2b8 \uac80\uc0ac)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>AddControllers()<\/code> \ud6c4 <code>app.MapControllers()<\/code>\ub97c \ud638\ucd9c\ud574\uc57c \ucee8\ud2b8\ub864\ub7ec\uac00 \uc2e4\uc81c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \uc5f0\uacb0\ub429\ub2c8\ub2e4. \ub4f1\ub85d(Add)\uacfc \uc0ac\uc6a9(Map\/Use)\uc774 \uc9dd\uc744 \uc774\ub8e8\ub294 \uad6c\uc870\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ucc38\uace0: <code>AddControllersWithViews()<\/code>\ub294 Razor \ubdf0\uae4c\uc9c0 \ud3ec\ud568\ud55c MVC\uc6a9\uc774\uace0, <code>AddControllers()<\/code>\ub294 View \uc5c6\uc774 API \uc804\uc6a9\uc785\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">3. <code>AddHttpClient<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddHttpClient&lt;AiService&gt;(c =&gt; c.Timeout = TimeSpan.FromSeconds(40));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: \uc678\ubd80 HTTP API\ub97c \ud638\ucd9c\ud558\uae30 \uc704\ud55c <code>HttpClient<\/code>\ub97c <strong>\ud329\ud1a0\ub9ac(IHttpClientFactory)<\/strong> \ubc29\uc2dd\uc73c\ub85c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uc774 \ucf54\ub4dc\ub294 <strong>\ud0c0\uc785 \uc9c0\uc815 \ud074\ub77c\uc774\uc5b8\ud2b8(typed client)<\/strong> \ud328\ud134\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>AiService<\/code>\ub294 \uc774\ub807\uac8c <code>HttpClient<\/code>\ub97c \uc0dd\uc131\uc790\ub85c \ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class AiService\n{\n    private readonly HttpClient _http;\n    public AiService(HttpClient http) =&gt; _http = http;   \/\/ 40\ucd08 \ud0c0\uc784\uc544\uc6c3\uc774 \uc124\uc815\ub41c HttpClient\uac00 \uc8fc\uc785\ub428\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc65c <code>new HttpClient()<\/code>\ub97c \uc9c1\uc811 \uc4f0\uc9c0 \uc54a\ub098?<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\uc9c1\uc811 \uc0dd\uc131<\/th><th><code>AddHttpClient<\/code> \uc0ac\uc6a9<\/th><\/tr><\/thead><tbody><tr><td>\uc694\uccad\ub9c8\ub2e4 \ub9cc\ub4e4\uba74 \uc18c\ucf13 \uace0\uac08(socket exhaustion) \uc704\ud5d8<\/td><td>\ub0b4\ubd80 \uc5f0\uacb0 \ud480\uc744 \ud329\ud1a0\ub9ac\uac00 \uad00\ub9ac<\/td><\/tr><tr><td>\uc2f1\uae00\ud1a4\uc73c\ub85c \uc624\ub798 \uc4f0\uba74 DNS \ubcc0\uacbd\uc744 \ubc18\uc601 \ubabb \ud568<\/td><td>\ud578\ub4e4\ub7ec\ub97c \uc8fc\uae30\uc801\uc73c\ub85c \uad50\uccb4\ud574 DNS \uac31\uc2e0 \ubc18\uc601<\/td><\/tr><tr><td>\uc124\uc815\uc774 \ucf54\ub4dc \uacf3\uacf3\uc5d0 \ud769\uc5b4\uc9d0<\/td><td>\ub4f1\ub85d \uc2dc\uc810\uc5d0 \ud55c \ubc88 \uc124\uc815 (\ud0c0\uc784\uc544\uc6c3, \uae30\ubcf8 \uc8fc\uc18c, \ud5e4\ub354)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Timeout<\/code>\uc744 40\ucd08\ub85c \ub454 \uac83\uc740 AI API \uc751\ub2f5\uc774 \uc624\ub798 \uac78\ub9b4 \uc218 \uc788\uc5b4\uc11c\ub85c \ubcf4\uc785\ub2c8\ub2e4 (\uae30\ubcf8\uac12\uc740 100\ucd08). \ud544\uc694\ud558\uba74 <code>c.BaseAddress<\/code>, <code>c.DefaultRequestHeaders<\/code> \ub4f1\ub3c4 \uc5ec\uae30\uc11c \uc124\uc815\ud560 \uc218 \uc788\uace0, Polly \uac19\uc740 \uc7ac\uc2dc\ub3c4 \uc815\ucc45\ub3c4 \uc774\uc5b4\uc11c \ubd99\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. <code>AddSingleton<\/code> \/ <code>AddScoped<\/code> (\uadf8\ub9ac\uace0 <code>AddTransient<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddSingleton&lt;IsoCatalog&gt;();\nbuilder.Services.AddScoped&lt;CountryRepository&gt;();\nbuilder.Services.AddScoped&lt;ApprovalService&gt;();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: \ud074\ub798\uc2a4\ub97c DI \ucee8\ud14c\uc774\ub108\uc5d0 \ub4f1\ub85d\ud558\ub418, <strong>\uc778\uc2a4\ud134\uc2a4\uc758 \uc218\uba85(lifetime)<\/strong> \uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\uc218\uba85<\/th><th>\uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131<\/th><th>\uc801\ud569\ud55c \uc6a9\ub3c4<\/th><\/tr><\/thead><tbody><tr><td><strong>Singleton<\/strong><\/td><td>\uc571 \uc804\uccb4\uc5d0\uc11c <strong>\ub531 1\uac1c<\/strong> \uacf5\uc720<\/td><td>\ubd88\ubcc0 \ub370\uc774\ud130, \uce90\uc2dc, \uc124\uc815 (\uc608: <code>IsoCatalog<\/code>)<\/td><\/tr><tr><td><strong>Scoped<\/strong><\/td><td><strong>HTTP \uc694\uccad 1\uac74\ub2f9 1\uac1c<\/strong> (\uc694\uccad \uc548\uc5d0\uc11c\ub294 \uacf5\uc720)<\/td><td>DB \ucee8\ud14d\uc2a4\ud2b8, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac, \uc11c\ube44\uc2a4 (\uc608: <code>CountryRepository<\/code>)<\/td><\/tr><tr><td><strong>Transient<\/strong><\/td><td><strong>\uc8fc\uc785\ubc1b\uc744 \ub54c\ub9c8\ub2e4 \uc0c8\ub85c<\/strong> \uc0dd\uc131<\/td><td>\uac00\ubccd\uace0 \uc0c1\ud0dc \uc5c6\ub294 \uc720\ud2f8\ub9ac\ud2f0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud504\ub85c\uc81d\ud2b8\uc758 \uc120\ud0dd\uc774 \ud569\ub9ac\uc801\uc778 \uc774\uc720:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>IsoCatalog<\/code>: ISO \uad6d\uac00 \ucf54\ub4dc \uac19\uc740 \ubcc0\ud558\uc9c0 \uc54a\ub294 \ubaa9\ub85d\uc774\ub77c \ud55c \ubc88 \ub9cc\ub4e4\uc5b4 \uacf5\uc720\ud558\uba74 \ud6a8\uc728\uc801\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>CountryRepository<\/code>, <code>ApprovalService<\/code>: \uc694\uccad \ub2e8\uc704\ub85c \uc0c1\ud0dc\/DB \uc5f0\uacb0\uc744 \ub2e4\ub8e8\ubbc0\ub85c Scoped\uac00 \uc77c\ubc18\uc801\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc8fc\uc758\ud560 \uc810 (\uc218\uba85 \ubd88\uc77c\uce58)<\/strong>: Singleton\uc774 Scoped\ub97c \uc8fc\uc785\ubc1b\uc73c\uba74 \uc548 \ub429\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 <code>IsoCatalog<\/code>(Singleton)\uac00 \uc0dd\uc131\uc790\uc5d0\uc11c <code>CountryRepository<\/code>(Scoped)\ub97c \ubc1b\uc73c\uba74, \uc694\uccad\uc774 \ub05d\ub098\ub3c4 Scoped \uac1d\uccb4\uac00 \uc0b4\uc544\ub0a8\ub294 \ubb38\uc81c\uac00 \uc0dd\uaca8 \uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c\ub294 \uc608\uc678\uac00 \ub0a9\ub2c8\ub2e4. \uc218\uba85\uc774 <strong>\uae34 \ucabd\uc774 \uc9e7\uc740 \ucabd\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\ub3c4\ub85d<\/strong> \ud558\uc138\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc38\uace0\ub85c <code>AddHttpClient&lt;AiService&gt;<\/code>\ub85c \ub4f1\ub85d\ub41c <code>AiService<\/code>\ub294 \uae30\ubcf8\uc801\uc73c\ub85c <strong>Transient<\/strong>\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. <code>AddEndpointsApiExplorer<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddEndpointsApiExplorer();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: \uc571\uc5d0 \uc5b4\ub5a4 \uc5d4\ub4dc\ud3ec\uc778\ud2b8(\uacbd\ub85c, \uba54\uc11c\ub4dc, \ud30c\ub77c\ubbf8\ud130, \uc751\ub2f5 \ud0c0\uc785)\uac00 \uc788\ub294\uc9c0 <strong>\uba54\ud0c0\ub370\uc774\ud130\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\uac8c<\/strong> \ud574 \uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc790\uccb4\ub294 \ud654\uba74\uc5d0 \uc544\ubb34\uac83\ub3c4 \ubcf4\uc5ec\uc8fc\uc9c0 \uc54a\uace0, \ub4a4\uc758 Swagger\uac00 &#8220;\ubb38\uc11c\ub97c \ub9cc\ub4e4 \uc7ac\ub8cc&#8221;\ub97c \uac00\uc838\uac00\ub294 \ud1b5\ub85c\uc785\ub2c8\ub2e4. \ud2b9\ud788 Minimal API(<code>app.MapGet(...)<\/code>) \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c Swagger\uc5d0 \ubcf4\uc774\uac8c \ud558\ub824\uba74 \ud544\uc218\uc774\uace0, \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc4f0\ub354\ub77c\ub3c4 \uad00\ub840\uc801\uc73c\ub85c \ud568\uaed8 \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. <code>AddSwaggerGen<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddSwaggerGen();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5ed\ud560<\/strong>: \uc704\uc5d0\uc11c \uc218\uc9d1\ud55c \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \uc815\ubcf4\ub85c <strong>OpenAPI(Swagger) \uba85\uc138 \ubb38\uc11c<\/strong>(JSON)\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ub4f1\ub85d\ud569\ub2c8\ub2e4. (<code>Swashbuckle.AspNetCore<\/code> \ud328\ud0a4\uc9c0)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub4f1\ub85d\ub9cc\uc73c\ub85c\ub294 \ubd80\uc871\ud558\uace0, \ubbf8\ub4e4\uc6e8\uc5b4\ub85c \ub178\ucd9c\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \ud504\ub85c\uc81d\ud2b8\ub294 \uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c\ub9cc \ucf2d\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (app.Environment.IsDevelopment())\n{\n    app.UseSwagger();     \/\/ \/swagger\/v1\/swagger.json \ubb38\uc11c \uc81c\uacf5\n    app.UseSwaggerUI();   \/\/ \/swagger \uc5d0\uc11c \ube0c\ub77c\uc6b0\uc800\uc6a9 \ud14c\uc2a4\ud2b8 \ud654\uba74 \uc81c\uacf5\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc635\uc158\uc73c\ub85c \ubb38\uc11c \uc81c\ubaa9, <code>X-Admin-Key<\/code> \ud5e4\ub354 \uc785\ub825 \ubc84\ud2bc \ub4f1\uc744 \ucd94\uac00\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">csharp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddSwaggerGen(c =&gt;\n{\n    c.AddSecurityDefinition(\"AdminKey\", new OpenApiSecurityScheme\n    {\n        Type = SecuritySchemeType.ApiKey,\n        In = ParameterLocation.Header,\n        Name = \"X-Admin-Key\"\n    });\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud504\ub85c\uc81d\ud2b8\ucc98\ub7fc <code>\/api<\/code> \uc804\uccb4\uac00 API \ud0a4\ub97c \uc694\uad6c\ud55c\ub2e4\uba74, \uc704\ucc98\ub7fc \uc124\uc815\ud574\uc57c Swagger UI\uc5d0\uc11c \u201cAuthorize\u201d \ubc84\ud2bc\uc73c\ub85c \ud0a4\ub97c \ub123\uace0 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Swagger UI\uc5d0\uc11c \ud638\ucd9c \uc2dc \ubaa8\ub450 401\uc774 \ub0a9\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc804\uccb4 \uad6c\uc870 \ud55c\ub208\uc5d0 \ubcf4\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core\ub294 <strong>&#8220;\ub4f1\ub85d(Services) \u2192 \ube4c\ub4dc \u2192 \uc0ac\uc6a9(Middleware)&#8221;<\/strong> 3\ub2e8\uacc4\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>builder.Services.AddXxx()   \u2190 1. \uae30\ub2a5\/\ud074\ub798\uc2a4\ub97c DI\uc5d0 \"\ub4f1\ub85d\" (\uc7ac\ub8cc \uc900\ube44)\nvar app = builder.Build();  \u2190 2. \ucee8\ud14c\uc774\ub108 \ud655\uc815\napp.UseXxx() \/ MapXxx()     \u2190 3. \uc694\uccad \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \"\uc801\uc6a9\" (\uc2e4\uc81c \uc0ac\uc6a9)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\ub4f1\ub85d (<code>builder.Services<\/code>)<\/th><th>\uc801\uc6a9 (<code>app<\/code>)<\/th><\/tr><\/thead><tbody><tr><td><code>AddCors<\/code><\/td><td><code>UseCors(\"FrontPage\")<\/code><\/td><\/tr><tr><td><code>AddControllers<\/code><\/td><td><code>MapControllers()<\/code><\/td><\/tr><tr><td><code>AddEndpointsApiExplorer<\/code> + <code>AddSwaggerGen<\/code><\/td><td><code>UseSwagger()<\/code> + <code>UseSwaggerUI()<\/code><\/td><\/tr><tr><td><code>AddSingleton\/Scoped\/HttpClient<\/code><\/td><td>\ucee8\ud2b8\ub864\ub7ec \ub4f1\uc758 \uc0dd\uc131\uc790 \uc8fc\uc785\uc73c\ub85c \uc0ac\uc6a9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Add...<\/code>\ub9cc \ud558\uace0 <code>Use...<\/code>\/<code>Map...<\/code>\uc744 \ube60\ub728\ub9ac\uba74 \uc544\ubb34 \uc77c\ub3c4 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc73c\ub2c8, \uae30\ub2a5\uc774 \ub3d9\uc791\ud558\uc9c0 \uc54a\uc744 \ub54c\ub294 \uc774 \uc9dd\uc774 \ub9de\ub294\uc9c0\ubd80\ud130 \ud655\uc778\ud574 \ubcf4\uc138\uc694.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ASP.NET Core builder.Services\uc758 \uc5ed\ud560\uacfc AddCors, AddControllers, AddHttpClient \ubc0f Singleton\u00b7Scoped\u00b7Transient \ub4f1 DI \uc11c\ube44\uc2a4 \ub4f1\ub85d \ubc29\ubc95\uc744 \uc2e4\ubb34 \ucf54\ub4dc\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":[108],"tags":[],"class_list":["post-989","post","type-post","status-publish","format-standard","hentry","category-net-core"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/989","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=989"}],"version-history":[{"count":3,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/989\/revisions"}],"predecessor-version":[{"id":1002,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/989\/revisions\/1002"}],"wp:attachment":[{"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/csharp.ihavenomoney.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}