더북(TheBook)

2. MaximServiceController.cs 파일을 열고 다음과 같이 작성한다. ASP.NET의 웹 폼 페이지 또는 MVC 뷰 페이지를 사용하면 직접 앞에서 작성한 리파지터리 클래스만을 사용해 데이터를 주고받는 페이지들을 구현할 수 있다. 하지만 클라이언트 측에서 가져다 사용할 Web API를 만들어야 하므로 ApiController 클래스를 상속 받아서 각각의 CRUD를 구현해야 한다. 다음 코드는 CRUD를 서비스하고 이에 대한 예외 처리(HTTP 에러 메시지 출력)를 함께 하는 전형적인 스타일의 ASP.NET Web API 코드다. 물론 구현하는 상태에 따라서 다른 모습으로 보일 수 있지만, 교과서다운 코드로 손색이 없기에 기본 Web API에 사용하는 코드 스타일로 학습해 두자.

▼  /Controllers/MaximServiceController.cs

using MemoEngine.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MemoEngine.Controllers
{
  /// <summary>
  /// 명언(Maxim) 제공 서비스: /api/maximservice/
  /// 기본 뼈대 만드는 것은 Web API 스캐폴딩으로 구현 후 각각의 코드를 구현
  /// </summary>
  public class MaximServiceController : ApiController
  {
      MaximServiceRepository repo = new MaximServiceRepository();
      
      // GET: api/MaximService
      public IEnumerable<Maxim> Get()
      {
          return repo.GetMaxims().AsEnumerable();
      }
      
      // GET: api/MaximService/5
      public Maxim Get(int id)
      {
          // 데이터 조회
          Maxim maxim = repo.GetMaximById(id);
          if (maxim == null)
          {
              throw new HttpResponseException(
                  Request.CreateResponse(HttpStatusCode.NotFound));
          }
          return maxim;
      }
      
      // POST: api/MaximService
      public HttpResponseMessage Post([FromBody]Maxim maxim)
      {
          if (ModelState.IsValid)
          {
              // 데이터 입력
              repo.AddMaxim(maxim);
              
              HttpResponseMessage response =
                  Request.CreateResponse(HttpStatusCode.Created, maxim);
              response.Headers.Location =
                  new Uri(Url.Link(“DefaultApi”, new { id = maxim.Id }));
              return response;
          }
          else
          {
              return Request.CreateErrorResponse(
                  HttpStatusCode.BadRequest, ModelState);
          }
      }
      
      // PUT: api/MaximService/5
      public HttpResponseMessage Put(int id, [FromBody]Maxim maxim)
      {
          if (!ModelState.IsValid)
          {
              return Request.CreateErrorResponse(
                  HttpStatusCode.BadRequest, ModelState);
          }
          if (id != maxim.Id)
          {
              return Request.CreateResponse(HttpStatusCode.BadRequest);
          }
          
          // 데이터 수정
          repo.UpdateMaxim(maxim);
          
          return Request.CreateResponse(HttpStatusCode.OK);
      }
      
      // DELETE: api/MaximService/5
      public HttpResponseMessage Delete(int id)
      {
          Maxim maxim = repo.GetMaximById(id);
          if (maxim == null)
          {
              return Request.CreateResponse(HttpStatusCode.NotFound);
          }
          
          // 데이터 삭제
          repo.RemoveMaxim(id);
          
          return Request.CreateResponse(HttpStatusCode.OK, maxim);
      }
  }
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.