728x90
반응형
728x170
▶ Models/TodoModel.cs
namespace TestProject.Models
{
/// <summary>
/// 할일 모델
/// </summary>
public class TodoModel
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region ID - ID
/// <summary>
/// ID
/// </summary>
public long ID { get; set; }
#endregion
#region 제목 - Name
/// <summary>
/// 제목
/// </summary>
public string Name { get; set; }
#endregion
#region 완료 여부 - IsComplete
/// <summary>
/// 완료 여부
/// </summary>
public bool IsComplete { get; set; }
#endregion
}
}
728x90
▶ Data/DatabaseContext.cs
using Microsoft.EntityFrameworkCore;
using TestProject.Models;
namespace TestProject.Data
{
/// <summary>
/// 데이터베이스 컨텍스트
/// </summary>
public class DatabaseContext : DbContext
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 할일 - Todo
/// <summary>
/// 할일
/// </summary>
public DbSet<TodoModel> Todo { get; set; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - DatabaseContext(options)
/// <summary>
/// 생성자
/// </summary>
/// <param name="options">옵션</param>
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
{
}
#endregion
}
}
300x250
▶ Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using TestProject.Data;
namespace TestProject
{
/// <summary>
/// 시작
/// </summary>
public class Startup
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 구성 - Configuration
/// <summary>
/// 구성
/// </summary>
public IConfiguration Configuration { get; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - Startup(configuration)
/// <summary>
/// 생성자
/// </summary>
/// <param name="configuration">구성</param>
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 서비스 컬렉션 구성하기 - ConfigureServices(services)
/// <summary>
/// 서비스 컬렉션 구성하기
/// </summary>
/// <param name="services">서비스 컬렉션</param>
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DatabaseContext>(options => options.UseInMemoryDatabase("TodoList"));
services.AddControllers();
}
#endregion
#region 구성하기 - Configure(app, environment)
/// <summary>
/// 구성하기
/// </summary>
/// <param name="app">애플리케이션 빌더</param>
/// <param name="environment">웹 호스트 환경</param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment environment)
{
if(environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints
(
endpointRouterBuilder =>
{
endpointRouterBuilder.MapControllers();
}
);
}
#endregion
}
}
▶ Controllers/TodoController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TestProject.Data;
using TestProject.Models;
namespace TestProject.Controllers
{
/// <summary>
/// 할일 컨트롤러
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class TodoController : ControllerBase
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 데이터베이스 컨텍스트
/// </summary>
private readonly DatabaseContext context;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - TodoController(context)
/// <summary>
/// 생성자
/// </summary>
/// <param name="context">컨텍스트</param>
public TodoController(DatabaseContext context)
{
this.context = context;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region GET 처리하기 - Get()
/// <summary>
/// GET 처리하기
/// </summary>
/// <returns>액션 결과 태스크</returns>
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoModel>>> Get()
{
return await this.context.Todo.ToListAsync();
}
#endregion
#region GET 처리하기 - Get(id)
/// <summary>
/// GET 처리하기
/// </summary>
/// <param name="id">ID</param>
/// <returns>액션 결과 태스크</returns>
[HttpGet("{id}")]
public async Task<ActionResult<TodoModel>> Get(long id)
{
TodoModel todo = await this.context.Todo.FindAsync(id);
if(todo == null)
{
return NotFound();
}
return todo;
}
#endregion
#region POST 처리하기 - Post(todo)
/// <summary>
/// POST 처리하기
/// </summary>
/// <param name="todo">할일</param>
/// <returns>액션 결과 태스크</returns>
[HttpPost]
public async Task<ActionResult<TodoModel>> Post(TodoModel todo)
{
this.context.Todo.Add(todo);
await this.context.SaveChangesAsync();
return CreatedAtAction("Get", new { id = todo.ID }, todo);
}
#endregion
#region PUT 처리하기 - Put(id, todo)
/// <summary>
/// PUT 처리하기
/// </summary>
/// <param name="id">ID</param>
/// <param name="todo">할일</param>
/// <returns>액션 결과 태스크</returns>
[HttpPut("{id}")]
public async Task<IActionResult> Put(long id, TodoModel todo)
{
if(id != todo.ID)
{
return BadRequest();
}
this.context.Entry(todo).State = EntityState.Modified;
try
{
await this.context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
if(!TodoExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
#endregion
#region DELETE 처리하기 - Delete(id)
/// <summary>
/// DELETE 처리하기
/// </summary>
/// <param name="id">ID</param>
/// <returns>액션 결과 태스크</returns>
[HttpDelete("{id}")]
public async Task<ActionResult<TodoModel>> Delete(long id)
{
TodoModel todo = await this.context.Todo.FindAsync(id);
if(todo == null)
{
return NotFound();
}
this.context.Todo.Remove(todo);
await this.context.SaveChangesAsync();
return todo;
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 할일 존재 여부 구하기 - TodoExists(id)
/// <summary>
/// 할일 존재 여부 구하기
/// </summary>
/// <param name="id"></param>
/// <returns>할일 존재 여부</returns>
private bool TodoExists(long id)
{
return this.context.Todo.Any(e => e.ID == id);
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Web API' 카테고리의 다른 글
[C#/WEB API/.NET5] PostgreSQL 데이터베이스 사용하기 (0) | 2021.07.25 |
---|---|
[C#/WEB API/.NET5] 커스텀 미들웨어를 사용해 API 키 인증하기 (0) | 2021.07.24 |
[C#/WEB API/.NET5] IAsyncActionFilter 인터페이스 : API 키 인증하기 (0) | 2021.07.24 |
[C#/WEB API/.NETCORE] ControllerBase 클래스 : StatusCode 메소드를 사용해 검증 오류 처리하기 (0) | 2020.10.30 |
[C#/WEB API/.NETCORE] IRouteConstraint 인터페이스 : 커스텀 경로 제약 조건 사용하기 (0) | 2020.10.30 |
[C#/WEB API/.NETCORE] 대용량 데이터를 스트리밍 방식으로 전달받기 (0) | 2020.10.20 |
[C#/WEB API] 대용량 데이터를 스트리밍 방식으로 전달받기 (0) | 2020.10.19 |
[C#/WEB API/.NETCORE] ConsumesAttribute/ProducesAttribute 클래스 - 요청/응답 컨텐트 타입 설정하기 (0) | 2020.10.11 |
[C#/WEB API/.NETCORE] ControllerBase 클래스 : Response 속성을 사용해 파일 다운로드시 스트리밍 처리하기 (0) | 2020.10.10 |
[C#/WEB API/.NETCORE] Controller 클래스 : Json 메소드를 사용해 JSON 데이터 받기 (0) | 2020.10.10 |
댓글을 달아 주세요