17.C#과 REST API를 이용한 외부 시스템과의 연동, C#으로 RESTful 서비스 개발 및 외부 시스템 연동 예제

17. C#과 REST API를 이용한 외부 시스템과의 연동

오늘날 제조업에서는 다양한 시스템이 서로 연결되어 통합된 정보 환경을 조성해야 합니다. 특히 MES(Manufacturing Execution System)와 같은 공장 자동화 시스템은 다른 외부 시스템과의 원활한 데이터 연동이 필수적입니다. 이 글에서는 C#과 REST API를 이용하여 외부 시스템과의 연동을 구현하는 방법에 대해 자세히 설명하겠습니다.

REST API란 무엇인가?

REST(Representational State Transfer)는 웹 서비스 아키텍처 스타일로, 클라이언트와 서버 간의 상호작용을 정의하는 일련의 규칙과 원칙을 제공합니다. REST API는 이러한 원칙을 따르는 API로, HTTP 프로토콜을 기반으로 합니다. 자원(데이터)과 그 상태를 URL을 통해 참조하며, HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 자원에 대한 작업을 수행합니다.

C#에서 RESTful 서비스 개발하기

C# 환경에서 RESTful 서비스를 개발하는 가장 일반적인 방법은 ASP.NET Core를 사용하는 것입니다. ASP.NET Core는 Microsoft가 제공하는 오픈소스 프레임워크로, 웹 애플리케이션 및 RESTful API를 손쉽게 개발할 수 있는 많은 기능을 제공합니다.

1. ASP.NET Core Web API 프로젝트 생성

dotnet new webapi -n MyRestApi

위 명령어를 실행하여 새로운 ASP.NET Core Web API 프로젝트를 생성합니다. ‘MyRestApi’는 프로젝트 이름입니다.

2. 모델 클래스 정의

우리의 예제에서 사용할 모델 클래스를 정의합니다. 예를 들어, 제품 정보를 저장하는 Product 클래스를 만들어 보겠습니다.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

3. 데이터 컨텍스트 설정

Entity Framework Core를 사용하여 데이터베이스와 연결하겠습니다. NuGet 패키지 관리자를 사용하여 Microsoft.EntityFrameworkCore.SqlServer 및 Microsoft.EntityFrameworkCore.Tools 패키지를 설치합니다.

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools

그 다음, ApplicationDbContext 클래스를 정의하여 데이터베이스 컨텍스트를 설정합니다.

using Microsoft.EntityFrameworkCore;

public class ApplicationDbContext : DbContext
{
    public DbSet Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("your_connection_string_here");
    }
}

4. 제품 컨트롤러 생성

제품 정보를 처리하는 API 엔드포인트를 생성하기 위해, ProductsController 클래스를 설정합니다.

using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public ProductsController(ApplicationDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public IActionResult GetAllProducts()
    {
        return Ok(_context.Products.ToList());
    }

    [HttpGet("{id}")]
    public IActionResult GetProductById(int id)
    {
        var product = _context.Products.Find(id);
        if (product == null) return NotFound();
        return Ok(product);
    }

    [HttpPost]
    public IActionResult CreateProduct([FromBody] Product product)
    {
        _context.Products.Add(product);
        _context.SaveChanges();
        return CreatedAtAction(nameof(GetProductById), new { id = product.Id }, product);
    }

    [HttpPut("{id}")]
    public IActionResult UpdateProduct(int id, [FromBody] Product product)
    {
        if (id != product.Id) return BadRequest();
        _context.Products.Update(product);
        _context.SaveChanges();
        return NoContent();
    }

    [HttpDelete("{id}")]
    public IActionResult DeleteProduct(int id)
    {
        var product = _context.Products.Find(id);
        if (product == null) return NotFound();
        _context.Products.Remove(product);
        _context.SaveChanges();
        return NoContent();
    }
}

외부 시스템 연동 예제

이제 우리가 만든 RESTful 서비스와 외부 시스템(예: ERP 시스템) 간의 연동을 다뤄보겠습니다. 많은 ERP 시스템은 REST API를 통해 데이터를 주고받을 수 있는 기능을 제공합니다.

1. 외부 시스템 API 호출 구현

HttpClient를 사용하여 외부 API를 호출하는 메서드를 추가하겠습니다.

using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

public class ExternalSystemService
{
    private readonly HttpClient _httpClient;

    public ExternalSystemService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri("https://external.api.com/");
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task> GetProductsFromExternalSystemAsync()
    {
        var response = await _httpClient.GetAsync("api/products");
        if (response.IsSuccessStatusCode)
        {
            var jsonResponse = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize>(jsonResponse);
        }
        return null;
    }
}

2. RestController에서 외부 시스템 데이터 동기화

이제 ProductsController에 외부 시스템의 제품 데이터를 동기화하는 메서드를 추가하겠습니다.

[HttpPost("sync")]
public async Task SyncExternalProducts()
{
    var externalProducts = await _externalSystemService.GetProductsFromExternalSystemAsync();
    if (externalProducts != null)
    {
        foreach (var product in externalProducts)
        {
            _context.Products.Add(product);
        }
        _context.SaveChanges();
        return Ok();
    }
    return NotFound();
}

결론

C#과 REST API를 이용한 외부 시스템 연동은 다양한 제조 환경에서 데이터를 효율적으로 관리하고 활용하는 데 큰 도움이 됩니다. 이 글에서는 C#으로 RESTful 서비스를 개발하고 외부 시스템과의 연동을 위한 기초적인 내용을 살펴보았습니다. 이를 바탕으로 여러분은 제조업체의 요구사항에 맞게 시스템을 확장하고 최적화할 수 있습니다. 다음 단계로는 보안 및 인증, 데이터 검증과 같은 추가적인 기능을 고려해 볼 수 있습니다.

이와 같은 시스템 연동을 통해 MES와 외부 시스템 간의 데이터 흐름을 원활하게 만들어줄 수 있습니다. 발표할 새로운 프로젝트를 계획하고 있다면, 이 예제를 참고하여 C# 기반의 RESTful 서비스를 구축하고 외부 API와의 통합을 효율적으로 수행하시기 바랍니다.