Azure Translator API를 활용한 ASP.NET Core MVC 컨트롤러 구현
소개
이 문서에서는 Azure Translator Text API를 사용하여 ASP.NET Core MVC 컨트롤러를 통해 영어 문장을 스페인어로 번역하는 기능을 구현하는 방법을 다룹니다. 번역 로직은 하나의 메서드로 분리하여 문자열 입력을 받아 문자열 결과를 반환하도록 설계하여 코드의 재사용성과 유지보수 효율성을 높입니다.
사전 준비
Azure Translator Text API를 사용하려면 다음 단계를 완료해야 합니다:
- Azure Portal 또는 Azure Government Portal에 로그인하여 Translator 리소스를 생성합니다.
- 생성된 리소스의 API 키와 엔드포인트 URL을 확인합니다. Azure Government 클라우드에서는 엔드포인트가 다릅니다.
- **리소스 지역(Region)**을 기록해둡니다. 예:
koreacentral
.
자세한 설정 가이드는 Azure Translator 서비스 설정 가이드를 참고하세요.
프로젝트 설정
ASP.NET Core MVC 프로젝트 생성
Visual Studio에서 ASP.NET Core MVC 프로젝트를 생성합니다.- 프로젝트 템플릿:
ASP.NET Core MVC
- .NET 버전:
.NET 6
또는 그 이상
- 프로젝트 템플릿:
필요한 NuGet 패키지 설치
API 호출과 JSON 처리를 위해System.Text.Json
을 설치합니다.dotnet add package System.Text.Json
설정 파일(appsettings.json) 구성
appsettings.json
파일에 Translator API의 엔드포인트, Subscription Key, 그리고 Region을 추가합니다.{ "AzureTranslator": { "Endpoint": "https://api.cognitive.microsofttranslator.com/", // Azure Government의 경우 "https://api.cognitive.microsofttranslator.us/" "SubscriptionKey": "YOUR_AZURE_SUBSCRIPTION_KEY", "Region": "YOUR_RESOURCE_REGION" // 예: "koreacentral" } }
AzureTranslatorSettings 클래스 생성
Translator API 설정을 바인딩할 모델 클래스를 프로젝트 내Settings
폴더에 추가합니다.Settings/AzureTranslatorSettings.cs:
namespace DotNetNote.Settings { public class AzureTranslatorSettings { public string Endpoint { get; set; } public string SubscriptionKey { get; set; } public string Region { get; set; } } }
HttpClient 및 JSON 옵션 등록
Program.cs
파일에서HttpClient
를 DI 컨테이너에 등록하고, JSON 직렬화 옵션을 설정합니다.AzureTranslatorSettings
는appsettings.json
의 설정을 바인딩하여 사용합니다.Program.cs 수정:
var builder = WebApplication.CreateBuilder(args); // Azure Translator 설정 바인딩 builder.Services.Configure<AzureTranslatorSettings>(builder.Configuration.GetSection("AzureTranslator")); builder.Services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<AzureTranslatorSettings>>().Value); // HttpClient 등록 builder.Services.AddHttpClient(); // JSON 옵션 설정 (대소문자 구분 없이 처리) builder.Services.AddControllersWithViews() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; }); var app = builder.Build(); app.UseAuthorization(); app.MapDefaultControllerRoute(); app.Run();
TranslationRequestModel 클래스 생성
사용자 입력을 처리하기 위해
TranslationRequestModel
클래스도 추가합니다.ViewModels/Translators/TranslationRequestModel.cs
namespace DotNetNote.ViewModels.Translators { public class TranslationRequestModel { public string Text { get; set; } } }
MVC 컨트롤러 구현
아래 코드는 번역 기능을 TranslateTextAsync
메서드로 분리하여 구현합니다. 이 메서드는 문자열을 입력받아 번역된 문자열을 반환합니다.
전체 코드
Controllers/Translators/TranslationController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using DotNetNote.Settings;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using DotNetNote.ViewModels.Translators;
namespace DotNetNote.Controllers.Translators
{
public class TranslationController : Controller
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly AzureTranslatorSettings _translatorSettings;
public TranslationController(IHttpClientFactory httpClientFactory, IOptions<AzureTranslatorSettings> translatorSettings)
{
_httpClientFactory = httpClientFactory;
_translatorSettings = translatorSettings.Value;
}
[HttpGet]
public IActionResult Translate()
{
return View(new TranslationRequestModel());
}
[HttpPost]
public async Task<IActionResult> Translate(TranslationRequestModel model)
{
if (string.IsNullOrWhiteSpace(model.Text))
{
ModelState.AddModelError(nameof(model.Text), "텍스트를 입력하세요.");
return View(model);
}
try
{
var translatedText = await TranslateTextAsync(model.Text);
ViewData["TranslatedText"] = translatedText;
return View("TranslateResult");
}
catch (HttpRequestException ex)
{
ModelState.AddModelError(string.Empty, $"번역 실패: {ex.Message}");
return View(model);
}
}
private async Task<string> TranslateTextAsync(string input)
{
var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", _translatorSettings.SubscriptionKey);
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Region", _translatorSettings.Region);
var requestBody = new object[] { new { Text = input } };
var content = new StringContent(
JsonSerializer.Serialize(requestBody),
Encoding.UTF8,
"application/json");
var response = await client.PostAsync($"{_translatorSettings.Endpoint}/translate?api-version=3.0&to=es", content);
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException($"번역 요청 실패: {response.StatusCode}");
}
var jsonResponse = await response.Content.ReadAsStringAsync();
using var doc = JsonDocument.Parse(jsonResponse);
var translatedText = doc.RootElement[0]
.GetProperty("translations")[0]
.GetProperty("text")
.GetString();
return translatedText ?? string.Empty;
}
}
}
컨트롤러 설명
- Translate 메서드: 텍스트 입력을 받아 번역된 결과를 View로 전달합니다. 번역 요청 실패 시 예외 메시지를 ModelState에 추가하여 View에 표시합니다.
- TranslateTextAsync 메서드: 입력 문자열을 Azure Translator API를 통해 번역하며, HTTP 요청 실패 시
HttpRequestException
을 발생시켜 에러를 처리합니다.
뷰 파일 (Translate.cshtml 및 TranslateResult.cshtml)
Translate.cshtml: 번역할 텍스트를 입력하는 폼입니다.
@model DotNetNote.ViewModels.Translators.TranslationRequestModel <form method="post" asp-action="Translate"> <label for="text">번역할 텍스트:</label> <input type="text" id="text" name="Text" asp-for="Text" /> <button type="submit">번역</button> </form> <div> @Html.ValidationMessageFor(model => model.Text) </div>
TranslateResult.cshtml: 번역 결과를 표시하는 뷰입니다.
<h3>번역 결과</h3> <p>@ViewData["TranslatedText"]</p>
실행 및 테스트
API 실행
Visual Studio에서 프로젝트를 실행합니다. 기본 경로에서 번역 페이지에 액세스할 수 있습니다.텍스트 입력 및 결과 확인
/Translation/Translate
경로에서 번역할 텍스트를 입력하고 번역 결과를 확인할 수 있습니다.
결론
이 ASP.NET Core MVC 프로젝트는 Azure Translator Text API를 사용해 영어 문장을 스페인어로 번역하는 기능을 제공합니다. TranslateTextAsync
메서드를 통해 번역 로직을 분리하여 코드 재사용성을 높였으며, appsettings.json
에서 엔드포인트, Subscription Key, 그리고 Region을 관리하여 보안성을 강화했습니다.