Azure Translator API를 활용한 ASP.NET Core Web API 컨트롤러 구현

  • 6 minutes to read

소개

이 문서에서는 Azure Translator Text API를 사용하여 ASP.NET Core Web API 컨트롤러를 통해 영어 문장을 스페인어로 번역하는 기능을 구현합니다. 번역 로직은 하나의 메서드로 분리하여 문자열 입력을 받아 문자열 결과를 반환하도록 설계했습니다. 이를 통해 코드 재사용성과 유지보수 효율성을 높입니다.

사전 준비

Azure Translator Text API를 사용하려면 다음 단계를 완료해야 합니다:

  1. Azure Portal에 로그인하여 Translator 리소스를 생성합니다.
  2. 생성된 리소스의 API 키엔드포인트 URL을 확인합니다.
  3. **리소스 지역(Region)**을 기록해둡니다. 예: koreacentral.

자세한 설정 가이드는 Azure Translator 서비스 설정 가이드를 참고하세요.

프로젝트 설정

  1. ASP.NET Core Web API 프로젝트 생성
    Visual Studio에서 ASP.NET Core Web API 프로젝트를 생성합니다.

    • 프로젝트 템플릿: ASP.NET Core Web API
    • .NET 버전: .NET 6 또는 그 이상
  2. 필요한 NuGet 패키지 설치
    API 호출과 JSON 처리를 위해 System.Text.Json을 설치합니다.

    dotnet add package System.Text.Json
    
  3. HttpClient 및 JSON 옵션 등록
    Program.cs 파일에서 HttpClient를 DI 컨테이너에 등록하고, JSON 직렬화 옵션을 설정합니다.

    Program.cs 수정:

    var builder = WebApplication.CreateBuilder(args);
    
    // HttpClient 등록
    builder.Services.AddHttpClient();
    
    // JSON 옵션 설정 (대소문자 구분 없이 처리)
    builder.Services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        });
    
    // CORS 설정 (필요한 경우)
    builder.Services.AddCors(options =>
    {
        options.AddPolicy("AllowAll", policy =>
            policy.AllowAnyOrigin()
                  .AllowAnyMethod()
                  .AllowAnyHeader());
    });
    
    var app = builder.Build();
    
    // CORS 미들웨어 활성화
    app.UseCors("AllowAll");
    
    app.UseAuthorization();
    app.MapControllers();
    app.Run();
    

Web API 컨트롤러 구현

아래 코드는 번역 기능을 TranslateTextAsync 메서드로 분리하여 구현합니다. 이 메서드는 문자열을 입력받아 번역된 문자열을 반환합니다.

전체 코드

using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class TranslatorController : ControllerBase
{
    private readonly IHttpClientFactory _httpClientFactory;
    private const string SubscriptionKey = "YOUR_AZURE_SUBSCRIPTION_KEY";
    private const string Endpoint = "https://api.cognitive.microsofttranslator.com/";
    private const string Region = "YOUR_RESOURCE_REGION"; // 예: "koreacentral"
    private const string Route = "/translate?api-version=3.0&to=es";

    public TranslatorController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpPost]
    public async Task<IActionResult> Translate([FromBody] TranslationRequest request)
    {
        try
        {
            var translatedText = await TranslateTextAsync(request.Text);
            return Ok(new { TranslatedText = translatedText });
        }
        catch (HttpRequestException ex)
        {
            return StatusCode(500, $"번역 실패: {ex.Message}");
        }
    }

    private async Task<string> TranslateTextAsync(string input)
    {
        var client = _httpClientFactory.CreateClient();
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", SubscriptionKey);
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Region", Region);

        var requestBody = new object[] { new { Text = input } };
        var content = new StringContent(
            JsonSerializer.Serialize(requestBody),
            Encoding.UTF8,
            "application/json");

        var response = await client.PostAsync(Endpoint + Route, 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;
    }
}

public class TranslationRequest
{
    public string Text { get; set; }
}

코드 설명

  1. TranslateTextAsync 메서드

    • 문자열을 입력받아 Azure Translator API를 통해 번역된 문자열을 반환합니다.
    • HTTP 요청 실패 시 HttpRequestException을 발생시켜 에러를 처리합니다.
  2. Translate 메서드 (API 엔드포인트)

    • POST /api/translator 경로로 들어오는 요청을 처리합니다.
    • 클라이언트에서 받은 텍스트를 TranslateTextAsync 메서드로 번역하고 결과를 반환합니다.
  3. TranslationRequest 클래스

    • 클라이언트 요청에서 번역할 텍스트를 받기 위한 데이터 모델입니다.

API 실행 및 테스트

  1. API 실행
    Visual Studio에서 프로젝트를 실행합니다. API는 https://localhost:{port}/api/translator 경로에서 실행됩니다.

  2. HTTP 파일을 사용한 테스트

    아래와 같은 HTTP 파일을 사용하여 API를 테스트할 수 있습니다. Visual Studio 또는 VS Code에서 HTTP 파일을 만들고 실행하세요.

    translator-test.http 파일:

    POST https://localhost:5001/api/Translator
    Content-Type: application/json
    
    {
      "text": "Hello, how are you?"
    }
    

    실행 방법:

    • Visual Studio 또는 VS Code에서 .http 파일을 열고 Send Request를 클릭합니다.
  3. Postman을 사용한 테스트

    • HTTP 메서드: POST
    • URL: https://localhost:{port}/api/translator
    • 요청 본문:
      {
        "text": "Hello, how are you?"
      }
      
    • 응답 예시:
      {
        "TranslatedText": "Hola, ¿cómo estás?"
      }
      

예외 처리 및 확장 가능성

  • 예외 처리:
    번역 실패 시 HttpRequestException을 발생시켜 클라이언트에 500 상태 코드를 반환합니다.

  • 다국어 지원:
    Route에서 to 매개변수를 변경하여 다양한 언어로 번역할 수 있습니다. 예: &to=fr는 프랑스어 번역을 의미합니다.

결론

이 ASP.NET Core Web API는 Azure Translator Text API를 사용해 영어 문장을 스페인어로 번역하는 기능을 제공합니다. TranslateTextAsync 메서드를 통해 번역 로직을 재사용 가능하게 구성했으며, 비동기 처리를 통해 빠르고 효율적인 응답을 보장합니다.

실제 응용 프로그램에서는 예외 처리와 입력 검증을 더욱 강화하여 안정성을 높일 수 있습니다. 이 API는 필요에 따라 쉽게 확장하여 다른 언어와 추가 기능을 구현할 수 있습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com