IMCAT.DEV
로그인 가입
C# 고급 디자인패턴

C# REST API 설계 및 구현

C# REST API 설계 및 구현 — 고급

REST API 설계 및 구현

1. 도입 (왜 배워야 하는가)

REST API(Representational State Transfer Application Programming Interface)는 현대 소프트웨어 개발에서 필수적인 요소로 자리 잡았습니다. 다양한 시스템 간의 통신과 데이터 교환을 가능하게 하여, 클라이언트와 서버 간의 상호작용을 원활하게 합니다. 특히, 웹 애플리케이션, 모바일 앱, IoT 기기 등에서 데이터 송수신을 처리하는 데 없어서는 안 될 기술입니다.

이 개념을 모르면 클라이언트와 서버 간의 데이터 전송 방식에 대한 이해가 부족해지고, 결과적으로 비효율적인 시스템 설계나 구현이 발생할 수 있습니다. 예를 들어, 데이터 전송 방식을 잘못 설계하면 성능 저하, 보안 취약점, 그리고 유지보수 어려움 등의 문제가 발생할 수 있습니다.

2. 핵심 개념 설명

REST API의 핵심 구성 요소는 다음과 같습니다:

용어정의
리소스API가 다루는 데이터의 단위 (예: 사용자, 상품 등)
URI리소스를 식별하기 위한 고유한 주소
HTTP 메서드리소스에 대한 작업을 정의하는 방법 (GET, POST, PUT, DELETE)
상태 코드요청 처리 결과를 나타내는 3자리 숫자 코드

비유로 이해하기

리소스를 도서관의 책으로 비유할 수 있습니다. 각 책은 고유한 ISBN(URI)을 가지고 있으며, 책을 대출하거나 반납하는 행위가 HTTP 메서드에 해당합니다. 상태 코드는 도서관 직원이 대출 요청을 처리한 결과(예: 대출 가능, 이미 대출된 책 등)를 나타냅니다.

3. 기본 코드 예제

다음은 C#을 사용하여 간단한 REST API를 구현하는 기본 코드입니다.

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private static List<string> products = new List<string> { "Apple", "Banana", "Orange" };

    [HttpGet]
    public ActionResult<List<string>> GetProducts()
    {
        return Ok(products); // 200 OK 응답과 함께 제품 목록 반환
    }
}

실행 결과

["Apple", "Banana", "Orange"]

코드 한 줄씩 동작 설명

  • using Microsoft.AspNetCore.Mvc;: ASP.NET Core MVC를 사용하기 위해 필요한 네임스페이스를 포함합니다.
  • [ApiController]: 이 클래스가 API 컨트롤러임을 나타내는 특성입니다.
  • [Route("api/[controller]")]: API의 URL 경로를 정의합니다. [controller]는 클래스 이름에서 "Controller"를 제거한 부분으로 대체됩니다.
  • private static List<string> products = new List<string> { "Apple", "Banana", "Orange" };: 제품 목록을 저장하는 정적 리스트를 선언합니다.
  • [HttpGet]: 이 메서드가 GET 요청을 처리함을 나타냅니다.
  • public ActionResult<List<string>> GetProducts(): 제품 목록을 반환하는 메서드입니다.
  • return Ok(products);: HTTP 200 OK 상태 코드를 반환하며, 제품 목록을 응답으로 전송합니다.
  • 4. 실전 활용 예제

    예제 1: 장바구니 구현

    쇼핑몰에서 장바구니를 구현할 때, 사용자가 추가한 상품을 관리하는 REST API를 설계할 수 있습니다.

    [HttpPost]
    public ActionResult AddToCart(string product)
    {
        // 장바구니에 상품 추가 로직
        return CreatedAtAction(nameof(GetCart), new { product }, product);
    }

    예제 2: 사용자 정보 업데이트

    사용자의 정보를 업데이트하는 API도 필요합니다. 이때 PUT 메서드를 사용할 수 있습니다.

    [HttpPut("{id}")]
    public ActionResult UpdateUser(int id, User user)
    {
        // 사용자 정보 수정 로직
        return NoContent(); // 204 No Content 상태 반환
    }

    5. 흔한 실수와 주의사항

    실수 1: 잘못된 HTTP 메서드 사용

  • 잘못된 코드: GET 요청으로 데이터를 수정하는 경우
  • [HttpGet]
    public ActionResult UpdateProduct(string product)
    {
        // 수정 로직
        return Ok();
    }
  • 올바른 코드: PUT 요청으로 수정
  • [HttpPut]
    public ActionResult UpdateProduct(string product)
    {
        // 수정 로직
        return Ok();
    }

    실수 2: 상태 코드 의미 오해

  • 잘못된 코드: 200 OK를 사용하여 삭제된 후에 응답
  • [HttpDelete("{id}")]
    public ActionResult DeleteProduct(int id)
    {
        // 삭제 로직
        return Ok(); // 잘못된 상태 코드
    }
  • 올바른 코드: 204 No Content 상태 반환
  • [HttpDelete("{id}")]
    public ActionResult DeleteProduct(int id)
    {
        // 삭제 로직
        return NoContent(); // 올바른 상태 코드
    }

    6. 정리

  • REST API는 클라이언트와 서버 간의 데이터 통신을 가능하게 합니다.
  • 리소스, URI, HTTP 메서드, 상태 코드와 같은 핵심 개념을 이해해야 합니다.
  • 초기 구현 시의 기본적인 패턴을 숙지하고 실무에 적용할 수 있어야 합니다.
  • 다음에는 인증 및 권한 부여, API 문서화와 같은 고급 주제를 학습하는 것이 좋습니다.