본문 바로가기
New Skill

[ASP.NET] EF Core + MySQL 연결하기

by jisayDeveloper 2023. 10. 9.
728x90
반응형
SMALL

우연한 기회에 C#과 .NET을 배우게 되었는데 이번 포스팅은 EF Core(Entity Framework Core)라는 개체-데이터 저장소 매핑 기술을 사용하여 MySQL을 연결하고 읽고 쓰는 방법에 대해 작성하겠습니다.

 

 EF Core(Entity Framework Core)

EF( Entity Framework ) 는 2008년 말에 서비스 팩 1이 포함된 .NET Framework 3.5의 일부로 처음 출시되 었습니다. 그 이후로 Microsoft가 프로그래머가 ORM(개체 관계형 매핑) 도구를 사용하는 방식을 관찰하면서 Entity Framework는 발전 했습니다 . ORM은 매핑 정의를 사용하여 테이블의 열을 클래스의 속성에 연결합니다. 그러면 프로그래머는 관계형 테이블이 나 NoSQL 데이터 저장소에서 제공하는 다른 구조에 값을 저장하는 방법을 알아야 하는 대신 익숙한 방식으로 다 양한 유형의 개체와 상호 작용할 수 있습니다.

지난 스프링 부트 포스팅에서 샘플 데이터베이스 썼듯이 이번에도 똑같이 사용하겠습니다.

(지난 포스팅 참고) https://jisaydeveloper.tistory.com/13

 

[Spring boot]MariaDB Sample Database로 RESTful API 만들기

준비물 : Spring boot , Post man https://www.mariadbtutorial.com/getting-started/mariadb-sample-database/ MariaDB Sample Database In this tutorial, you will learn about a MariaDB sample database nation and how to load the sample database into the MariaDB

jisaydeveloper.tistory.com

 

프로젝트 만들기

이렇게 프로젝트를 만들면 자체 샘플 코드들이 있는데 우리는 이 코드를 건들진 않고 

바로 MySQL연결부터 들어가겠습니다.

 

일단 EF Core를 사용하기 위해서 Microsoft.EntityFrameworkCore 패키지를 설치해야합니다.

방법은 도구 -> NuGet 패키지 관리자 -> entity 검색 

Microsoft.EntityFrameworkCore 다운받으면 됩니다.

그리고 maria db 사용을 위해 

Pomelo.EntityFrameworkCore.MySql를 추가로 다운받습니다.


그 후 appsettings.json 에 연결정보를 넣어주고 

Model을 만듭니다.

using System.ComponentModel.DataAnnotations;

namespace ack4.Model
{
    public class Languages 
    {
        [Key]
        public int Language_id { get; set; } 


        public string Language { get; set; } 
    }
}

LanguagesDbContext

DbContext를 만드는 이유는 Entity Framework (EF)를 사용하여 데이터베이스와 상호 작용하기 위한 핵심 컴포넌트를 정의하고 관리하기 위함입니다. DbContext는 EF의 일부로 데이터베이스와 애플리케이션 코드 간의 중간 역할을 수행합니다.

using ack4.Model;
using Microsoft.EntityFrameworkCore;


namespace ack4
{
    public class LanguagesDbContext : DbContext
    {
        public LanguagesDbContext(DbContextOptions<LanguagesDbContext> options)
            : base(options) 
        { 
        }
        public DbSet<Languages> Languages { get; set; }
    }
}

그다음 Progam.cs에 DbContext를 등록해줍니다.

using ack4;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);


builder.Services.AddControllers();


builder.Services.AddDbContext<LanguagesDbContext>(options =>
{
    // DbContext 옵션 구성
    string connectionString = builder.Configuration.GetConnectionString(name: "DefaultConnection");
    options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
});

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Controller

비주얼 스튜디오를 처음 써보면서 놀라운 점은 Controller를 만들때 기본적인 CRUD 코드가 들어간 컨트롤러를 만들어 줍니다.

API에 Entity Framework 동작이 포함된 API 컨트롤러를 선택하면

만든 Languages 모델을 넣고, DbContext 넣고 만들면

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using ack4;
using ack4.Model;

namespace ack4.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class Languages1Controller : ControllerBase
    {
        private readonly LanguagesDbContext _context;

        public Languages1Controller(LanguagesDbContext context)
        {
            _context = context;
        }

        // GET: api/Languages1
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Languages>>> GetLanguages()
        {
          if (_context.Languages == null)
          {
              return NotFound();
          }
            return await _context.Languages.ToListAsync();
        }

        // GET: api/Languages1/5
        [HttpGet("{id}")]
        public async Task<ActionResult<Languages>> GetLanguages(int id)
        {
          if (_context.Languages == null)
          {
              return NotFound();
          }
            var languages = await _context.Languages.FindAsync(id);

            if (languages == null)
            {
                return NotFound();
            }

            return languages;
        }

        // PUT: api/Languages1/5
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPut("{id}")]
        public async Task<IActionResult> PutLanguages(int id, Languages languages)
        {
            if (id != languages.Language_id)
            {
                return BadRequest();
            }

            _context.Entry(languages).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!LanguagesExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

        // POST: api/Languages1
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPost]
        public async Task<ActionResult<Languages>> PostLanguages(Languages languages)
        {
          if (_context.Languages == null)
          {
              return Problem("Entity set 'LanguagesDbContext.Languages'  is null.");
          }
            _context.Languages.Add(languages);
            await _context.SaveChangesAsync();

            return CreatedAtAction("GetLanguages", new { id = languages.Language_id }, languages);
        }

        // DELETE: api/Languages1/5
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteLanguages(int id)
        {
            if (_context.Languages == null)
            {
                return NotFound();
            }
            var languages = await _context.Languages.FindAsync(id);
            if (languages == null)
            {
                return NotFound();
            }

            _context.Languages.Remove(languages);
            await _context.SaveChangesAsync();

            return NoContent();
        }

        private bool LanguagesExists(int id)
        {
            return (_context.Languages?.Any(e => e.Language_id == id)).GetValueOrDefault();
        }
    }
}

이렇게 기본적인 CRUD 기능이 만들어지고 이제 본인 필요에 따라 코드를 수정하고 사용하시며내 됩니다.

 

 

이번 EF Core를 배우면서 C#에 대한 기본문법도 공부하고 비주얼 스튜디오도 접하게 되어 스프링부트와 자바만 접해본 필자는 재밌는 시간이였습니다. 아직 비주얼 스튜디오가 익숙지 않고 생각보다 구글링해서 오류가 나올때마다 곤혹스러웠는데 버전차이라던지 스캐폴딩이 안된다거나 아직 모르는게 너무 많은 거 같다.

 

아직 간단한 REST API지만 앞으로 시간을 할애해서 좀 더 배우는 시간을 갖어야 겠다.

728x90
반응형
LIST