티스토리 뷰

이번 포스팅에서는 ASP.NET Web API를 만들어 보도록 하겠습니다.

Project 생성

저는 Visual Studio 2017 Community 버전을 사용하고 있습니다.

마이크로소프트에서 제공하고 있는 ASP.NET Tutorial을 바탕으로 Web API프로젝트를 구성하겠습니다.

  • 파일 > 새로만들기 > 프로젝트

  • 템플릿 중 ASP.NET Core 웹 응용 프로그램 (.NET Core) 선택

  • ASP.NET Core 버전은 1.1 선택

  • Web API 선택

  • 솔루션 탐색기에 MVC형태 비슷하게(Models 폴더 추가가 필요함) 프로젝트 구성이 되어 있는 것을 확인 후 Ctrl + Shift + B 솔루션 전체 빌드
  • 솔루션 밑에 생성된 프로젝트를 시작 프로젝트로 설정 후 Ctrl + F5로 디버깅 없이 시작
  • IIS Express를 통해 Web API가 실행되고, 작업을 따로 하지 않았기 때문에 아래와 같이 나오게 됨

InMemory DB 사용하기

Web API 개발에 집중하기 위해서 DB와 연결하는 작업은 일단 넘어가고, EntityFramework에서 사용할 수 있는 InMemory DB를 사용하도록 하겠습니다.

  • 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔 에서 아래 명령어로 Install

PM> Install-Package Microsoft.EntityFrameworkCore.InMemory

  • 설치된 DB는 .csproj(프로젝트 파일)이나 Nuget 에서 확인 가능

Model 추가

  • 프로젝트에서 우클릭 후 추가 > 새 폴더 (폴더명 : Models)

  • Models 폴더에서 우클릭 후 추가 > 클래스 추가 (클래스명 : TodoItem)

  • 아래 코드 입력
namespace TodoApi.Models
{
    public class TodoItem
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }
    }
}
  • Models 폴더에서 우클릭 후 추가 > 클래스 추가 (클래스명 : TodoContext)
  • InMemory DB 사용을 위해 Microsoft.EntityFrameworkCore.DbContext를 상속 받는 Database Context 클래스 생성
  • 아래 코드 입력
using Microsoft.EntityFrameworkCore;

namespace TodoApi.Models
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<TodoItem> TodoItems { get; set; }

    }
}

Database Context 등록

using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using TodoApi.Models;

namespace TodoApi
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase());
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseMvc();
        }
    }
}
  • Startup.cs에 있는 ConfigureServices Method에 Database Context(TodoContext) 등록하기
    Controller에서 생성자 주입 방식을 사용하여 Dependency Injection을 구현하게 되는데 이를 위해 등록해 놓는 코드
  • ASP.NET Core는 기본적으로 Dependency Injection을 지원하고 활용하도록 설계됨

컨트롤러 추가

  • Controllers 폴더에서 우클릭 후 추가 > 새 항목 > MVC 컨트롤러 클래스 추가 (MVC 컨트롤러 클래스명 : TodoController)

  • 아래 코드 입력
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using TodoApi.Models;
using System.Linq;

namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    public class TodoController : Controller
    {
        private readonly TodoContext _context;

        public TodoController(TodoContext context)
        {
            _context = context;

            if (_context.TodoItems.Count() == 0)
            {
                _context.TodoItems.Add(new TodoItem { Name = "Item1" });
                _context.SaveChanges();
            }
        }
    }
}
  • 컨트롤러에 [Route("api/[controller]")] 라우팅 관련 속성 추가
  • TodoController 클래스 생성자에 TodoContext를 주입하는 의존성 주입 기법 사용하였고, DB에 데이터가 없을 때 Name이 “Item1”인 데이터를 생성하게 함
  • 전역 변수로 생성한 Database Context(TodoContext)는 컨트롤러에 CRUD를 구현할 때 사용함

컨트롤러에 CRUD 구현

TodoController 클래스에 아래 Method들을 추가

Create

[HttpPost]
public IActionResult Create([FromBody] TodoItem item)
{
    if (item == null)
    {
        return BadRequest();
    }

    _context.TodoItems.Add(item);
    _context.SaveChanges();

    return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
}

Read

[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
    return _context.TodoItems.ToList();
}

[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
    var item = _context.TodoItems.FirstOrDefault(t => t.Id == id);
    if (item == null)
    {
        return NotFound();
    }
    return new ObjectResult(item);
}

Update

[HttpPut("{id}")]
public IActionResult Update(long id, [FromBody] TodoItem item)
{
    if (item == null || item.Id != id)
    {
        return BadRequest();
    }

    var todo = _context.TodoItems.FirstOrDefault(t => t.Id == id);
    if (todo == null)
    {
        return NotFound();
    }

    todo.IsComplete = item.IsComplete;
    todo.Name = item.Name;

    _context.TodoItems.Update(todo);
    _context.SaveChanges();
    return new NoContentResult();
}

Delete

[HttpDelete("{id}")]
public IActionResult Delete(long id)
{
    var todo = _context.TodoItems.First(t => t.Id == id);
    if (todo == null)
    {
        return NotFound();
    }

    _context.TodoItems.Remove(todo);
    _context.SaveChanges();
    return new NoContentResult();
}

PostMan을 사용하여 테스트

Ctrl + F5로 Web API 실행하면 웹 브라우저에서 http://localhost:port/api/values와 같은 주소로 이동합니다.
참고 : Controller 생성 시 Routing 속성([Route("api/[controller]")])을 넣어줬기 때문에http://localhost:port/api/values 와 같은 형태로 실행됨

Create


  • POST 방식으로 설정
  • 화면 상단에서 Body –> raw 라디오 버튼을 클릭 후 JSON(application/json)을 선택
  • 아래 코드 입력

    {
      "name":"item2",
      "isComplete":true
    }
    
  • 생성된 데이터를 반환

Read

Update

  • PUT 방식으로 설정
  • URL은 http://localhost:port/api/todo/key 아이디 값을 파라미터로 넘겨주는 방식으로 입력
  • 아래 코드 입력

    {
      "id": 1,
      "name": "UpdateItem1",
      "isComplete": true
    }
    

Delete


GitHub 저장소에 소스코드 저장하기

  • 도구 > 확장 및 업데이트 에서 Online 항목 중 GitHub를 검색해서 GitHub Extension for Visual Studio를 설치

  • 설치가 완료되면 팀 탐색기에 보이게 되는 GitHub 메뉴박스에서 Connet 버튼을 Click

  • GitHub 로그인

  • 솔루션 탐색기로 가서 솔루션에 우클릭 한 후 소스제어에 솔루션 추가 클릭

  • GitHub 탭에서 Get Started 버튼 클릭

  • 팀 탐색기에서 저장소 이름과 설명 부분 작성 후 Publish

  • Github에 Repository 생성 완료



참고한 사이트 
Create a web API with ASP.NET Core MVC and Visual Studio for Windows
Introduction to Dependency Injection in ASP.NET Core
Setting up and using GitHub in Visual Studio 2017

'ASP.NET' 카테고리의 다른 글

ASP.NET MVC5 Passing Data to Views  (0) 2018.08.01
ASP.NET MVC5 라우팅  (0) 2018.07.25
Word 문서 HTML로 변환하기  (0) 2018.05.29
Docker로 ASP.NET Core Web API 배포하기  (0) 2017.12.20
ASP.NET 비동기 호출  (0) 2017.12.20
댓글