이번 포스팅에서는 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
- GET 방식으로 설정
- 아이디 값을 파라미터로 넘겨주는 방식은 http://localhost:port/api/todo/key
Update
- PUT 방식으로 설정
- URL은 http://localhost:port/api/todo/key 아이디 값을 파라미터로 넘겨주는 방식으로 입력
아래 코드 입력
{ "id": 1, "name": "UpdateItem1", "isComplete": true }
Delete
- DELETE 방식으로 설정
- URL은 http://localhost:port/api/todo/key 아이디 값을 파라미터로 넘겨주는 방식으로 입력
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