코딩/.Net

MariaDb기반의 .Net Web Api 개발

해보^^ 2024. 10. 17. 10:04
반응형

이번 글은 .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 Extensions
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)  
    • Model Class 생성
[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; }
    }
    • DbContext 생성
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=********"
  }
    • Program.cs에 DbContext 등록
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

 

반응형

'코딩 > .Net' 카테고리의 다른 글

Outlook Add-In 개발  (0) 2024.11.12
C# 개발을 위한 Visual Studio Code 설치 및 설정  (0) 2024.09.01