ASP.NET Core Web API Project 만들기

마이크로 서비스 구축 실습을 목표로 이것 저것 하나씩 연습해 보는 중입니다^^

마이크로 서비스 실습 예정 순서

  1. ASP.NET Core Web API Project 만들기
  2. Docker로 배포하기
  3. MongoDB와 Web API 연결
  4. 의존성 주입(DI)과 보안을 고려해서 Web API 다시 만들기
  5. UI만들기(Node JS나 Angular JS를 활용해서 만들 예정)


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

Project 생성

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

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

image_1

image_2

image_3

image_4

InMemory DB 사용하기

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

image_5

PM> Install-Package Microsoft.EntityFrameworkCore.InMemory

image_6

Model 추가

image_7

image_8

namespace TodoApi.Models
{
    public class TodoItem
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }
    }
}
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();
        }
    }
}

컨트롤러 추가

image_9

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();
            }
        }
    }
}

컨트롤러에 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

image_10

Read

image_11

Update

image_12

Delete

image_13


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

image_14

image_15

image_16

image_17

image_18

image_19

image_20


참고한 사이트
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