이번 글은 .Net 8.0 기준의 Restful Web Api를 구현하는 방법과 MariaDb의 데이터를 Web Api로 가져오고 저장하는 내용을 다루고자 합니다.
개발환경
OS : Windows 11
.Net 버전 : 8.0
개발도구 : Visual Studio Code
MariaDb 11.5
EntityFramework
1. 프로젝트 생성
Powershell을 열고 프로젝트를 생성하고자 하는 폴더로 이동하여 dotnet new 명령어를 아래와 같이 실행한다.
\> dotnet new webapi --use-controllers -o TodoApi
--use-controllers | -controllers : controller기반의 Web Api생성
-o : 대상폴더
Powershell에서 dotnet new 명령하는 사용하여 프로젝트 생성
2. 프로젝트 오픈 및 Package 추가
Visual Studio Code에서 해당 프로젝트를 열고 Microsoft EntityFramework와 MySql EntityFramework Package를 설치 한다. Ctrl+`를 클릭하면 Visual Studio Code 하단데 터미널 창이 오픈된다. 명령어는 다음과 같다.
\> dotnet add package Microsoft.EntityFrameworkCore
\> dotnet add package MySql.EntityFrameworkCore
Visual Studio Code Extensions에서 SQLTools를 검색하여 SQLTools MySQL/MariaDB/TiDB Extension을 설치한다.
해당 Extension으로 MariaDb에 연결이 가능하다.
Visual Studio Code Extension화면
3. Model/DbContext생성 및 서비스 등록
먼저 MariaDb 테이블 스키마는 다음과 같다.
db: tutorial, table : todo
column
type
비고
id
varchar(50)
PK
date
date
PK
title
text
is_complete
tinyint(1)
[ Table ( "todo" , Schema = "tutorial" )]
public class TodoItem
{
[ Column ( "id" )]
public string Id { get ; set ; } = "" ;
[ Column ( "date" )]
public DateTime Date { get ; set ; }
[ Column ( "title" )]
public string Title { get ; set ; } = "" ;
[ Column ( "is_complete" )]
public bool IsComplete { get ; set ; }
}
public class TutorialDbContext : DbContext
{
public TutorialDbContext ( DbContextOptions options ) : base ( options )
{
}
protected override void OnModelCreating ( ModelBuilder modelBuilder )
{
modelBuilder . Entity < TodoItem >() . HasKey ( x => new { x . Id , x . Date });
}
public DbSet < TodoItem > TodoItems { get ; set ; }
}
appsettings.Development.json에 ConectionString 등록
"ConnectionStrings" : {
"Tutorial" : "server=localhost; port=3306; database=tutorial; user=root; password=********"
}
builder . Services . AddDbContext < TutorialDbContext >(
option => option . UseMySQL (
builder . Configuration . GetConnectionString ( "Tutorial" ) ! ));
4. Service 클래스 생성 및 Program.cs에 등록
TutorialDbContext를 사용하는 서비스 클래스를 생성한다.
public class TodoService
{
private readonly TutorialDbContext _dbContext ;
public TodoService ( TutorialDbContext dbContext )
{
_dbContext = dbContext ;
}
public async Task < List < TodoItem >> GetTodoItems ()
{
var list = await _dbContext . TodoItems . ToListAsync ();
return list ;
}
public async Task < TodoItem ? > GetTodoItem ( string id , DateTime date )
{
var sql = "SELECT * FROM todo WHERE id = ?id AND date = ?date" ;
var parameters = new MySqlParameter [ 2 ];
parameters [ 0 ] = new MySqlParameter () { Value = id , ParameterName = "id" };
parameters [ 1 ] = new MySqlParameter () { Value = date , ParameterName = "date" };
var list = await _dbContext . TodoItems . FromSqlRaw ( sql , parameters ) . ToListAsync ();
return list . FirstOrDefault ();
}
public async Task PostTodoItem ( TodoItem item )
{
var savedItem = await GetTodoItem ( item . Id , item . Date );
if ( savedItem == null )
{
_dbContext . Add ( item );
}
else
{
_dbContext . Entry ( savedItem ) . CurrentValues . SetValues ( item );
}
await _dbContext . SaveChangesAsync ();
}
}
생성한 TodoService를 Program.cs에서 서비스로 등록한다.
builder . Services . AddScoped < TodoService >();
5. Controller 생성 및 Http Method 작성
ControllerBase 클래스를 상속 받는 TodoApiController 클래스를 생성한다.
[ ApiController ]
[ Route ( "api/ [ controller ] " )]
public class TodoApiController : ControllerBase
{
private readonly TodoService _todoService ;
public TodoApiController ( TodoService todoService )
{
_todoService = todoService ;
}
[ HttpGet ]
[ Route ( "todoitems" )]
public async Task < ActionResult < List < TodoItem >>> GetTodoItems ()
{
var list = await _todoService . GetTodoItems ();
return Ok ( list );
}
[ HttpGet ]
[ Route ( "todoitem/ { id } / { date } " )]
public async Task < ActionResult < TodoItem >> GetTodoItem ( string id , DateTime date )
{
var item = await _todoService . GetTodoItem ( id , date );
return Ok ( item );
}
[ HttpPost ]
public async Task < ActionResult < TodoItem >> PostTodoItem ( TodoItem item )
{
await _todoService . PostTodoItem ( item );
return CreatedAtAction ( nameof ( GetTodoItem ), new { id = item . Id , date = item . Date }, item );
}
}
6. 빌드 및 테스트
Powershell에서 아래 명령어를 실행한다.
\> dotnet watch run
Swagger화면에서 각 메소드들을 실행해 보고 테스트 한다.
swagger화면
참고
자습서: ASP.NET Core를 사용하여 웹 API 만들기
ASP.NET Core를 사용하여 웹 API를 빌드하는 방법을 알아봅니다.
learn.microsoft.com