ASPNET 6 Web Api Basic Tutorial 1 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor)

이미지
작성 순서 Create Project Create Controller Add Swagger Add SeriLog Add MediatR Add EntityFramework Core Add Migration Apply Database Add Web Api  Refactoring with Extension Method 1. Create Project Create  2. Create Controller Add NewFolder to project ( Controller ) UserController.cs using Microsoft.AspNetCore.Mvc; namespace WebApiBasicTutorial.Controller { [ApiController] [Route("[controller] ")] public class UserController :ControllerBase { } } Program.cs 에 다음 코드 추가   삭제 ==>  app.MapGet( "/" , () => "Hello World!" ); 추가 ==>  builder.Services.AddControllers(); 3. Add Swagger 개발자 프롬프트에서 프로젝트 폴더로 이동  (현재 .sln 파일이 있는 폴더라면 .csproj 파일이 있는 폴더로 이동) 아래 명령 실행 dotnet add package Swashbuckle.AspNetCore Program.cs 에 다음 코드 추가 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); app.UseSwagger(); app.UseSwaggerUI(); Properties --> launchSettings.json --> "launchUrl": "swagger",...

ASPNET 6 Web API & Refactoring with Extension Method

서론 ASPNET 6 Web API 는 Startup.cs 라는 초기화 및 설정 변경을 지정할 수 있는 class 가 사라졌다. 그로인해 대부분의 초기화 코드와 설정 코드들이 program.cs 에 위치하게 된다.  문제점 Project 자체가 크지 않을때는 상관 없으나 프로젝트가 점점 거대해지고 복잡해 지게 되면 Program.cs 파일 자체도 덩달아 거대하고 복잡하게 된다.  그렇게 되면 관리하기 힘든 프로젝트가 되고 말것이다.  해결책 Extension method 를 통해 refactoring 을 해보자 아래 기능들을 Extension method 를 통해 refactoring 해보자 1. IServiceCollection 연관 작업들 2. IHostBuilder 연관 작업들 3. IApplicationBuilder 연관 작업들 1. Extensions 폴더 생성 및 Extension class 생성 IServiceCollectionExtension.cs 생성 아래코드 추가 public static class IServiceCollectionExtension { public static void InitController( this IServiceCollection self) { self.AddControllers(); self.AddEndpointsApiExplorer(); } } IHostBuilderExtension.cs 생성 아래코드 추가 public static class IHostBuilderExtension { public static void AddSeriLog( this IHostBuilder self) { self.UseSerilog((ctx, lc) => lc .ReadFrom.Configuration(ctx.Configurati...

EF Core Reverse Engineering

이미지
Reverse Engineering 리버스 엔지니어링은 데이터베이스 스키마에 기반 하 여 엔터티 형식 클래스 및 DbContext 클래스를 스캐폴딩 하는 프로세스이다.  아래 두가지 방법을 이용할 수 있다. Scaffold-DbContext PMC  : (EF Core 패키지 관리자 Console) 도구  dotnet ef dbcontext scaffold  : .net CLI (명령줄 인터페이스) 도구 1. 개발자 명령 프롬프트로 이동한다.  2. 솔루션 파일이 아닌 project (.csproj) 파일이 있는 디렉토리로 이동한다.  3. 다음 명령을 실행한다.  dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=WebApiServer" Microsoft.EntityFrameworkCore.SqlServer --context-dir Infrastructure/Reverse --output-dir Infrastructure/Reverse/Models 4. 아래와 같이 User.cs 모델과 WebApiServerContext.cs 라는 DB Context 가 생성된다.  5. 원래 존재 하던 MyDbContext.cs 를 삭제 하자. 6. WebApiServerContext.cs 파일을 열고 다음을 수정하자.  OnConfiguraing 을 주석처리 // protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) // { // if (!optionsBuilder.IsConfigured) // { //#warning To protect potentially sensitive information in your connection string, ...

EF core migration update

이미지
 Migration Update Model 을 수정하여  field 의  add, remove, update  를 하게 되었을때 해당 내용을 DB 상에 적용 하려면 어떻게 해야 할까? 이러한 내용을 위해 EF Core 는 migration 을 추가 하여 처리 한다.  그 과정을 알아보자.  1. Field 추가 및 Db 적용 Infrastructure --> Models --> User.cs 파일을 열고 아래와 같이 변경하자 (No 추가) public class User { public string Id { get ; set ; } = string .Empty; public string Name { get ; set ; } = string .Empty; public string Email { get ; set ; } = string .Empty; public int No { get ; set ; } } 개발자 명령 프롬프트에서 Migration 을 추가 하자 dotnet ef migrations add AddNo --context MyDbContext --output-dir Migrations/MsSqlMigrations --project WebApiBasicEmpty --startup-project WebApiBasicEmpty Database 에 적용하자. dotnet ef database update --context MyDbContext --project WebApiBasicEmpty --startup-project WebApiBasicEmpty DB 확인 2. Remove Migration Infrastructure --> Models --> User.cs 파일을 열고 아래와 같이 변경하자 (No제거) public class User { ...

EF Core Query

이미지
Query (None Transaction) 모든 데이터 로드 using ( var context = new BloggingContext()) { var blogs = context.Blogs.ToList(); } 단일 엔터티 로드 using ( var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1 ); } 필터링 using ( var context = new BloggingContext()) { var blogs = context.Blogs .Where(b => b.Url.Contains( "dotnet" )) .ToList(); } 예제) Select all user (모든데이터) Controller 에 다음을 추가 [ProducesResponseType(typeof(List<User>), StatusCodes.Status200OK)] [HttpGet("")] public async Task<IActionResult> GetUsers() { return Ok ( await _mediator.Send( new GetUsers())); } Command folder 에 GetUsers.cs 파일 추가 public class GetUsers : IRequest<List<User>> { } Command folder 에 GetUsersHandler.cs 파일 추가 public class GetUsersHandler : IRequestHandler<GetUsers, List<User>> { private readonly MyDbContext _dbContext; public GetUsersH...

EFcore with Command

이미지
 EF Core 를 통한 Sql 제어 1. Command (Transaction) Add Controller 에 다음을 추가 [ProducesResponseType(typeof(List<User>), StatusCodes.Status200OK)] [HttpPost("")] public async Task<IActionResult> CreateUser( string id, string name, string email) { if (!ModelState.IsValid) return BadRequest (ModelState); var user = new AddUser { Id = id, Name = name, Email = email }; return Ok ( await _mediator.Send(user)); } Command folder 에 AddUser.cs 파일 추가 public class AddUser :IRequest<List<User>> { public string Id { get ; set ; } = string .Empty; public string Name { get ; set ; } = string .Empty; public string Email { get ; set ; } = string .Empty; } CommandHandler folder 에 AddUserHandler.cs 파일 추가 public class AddUserHandler : IRequestHandler<AddUser, List<User>> { private readonly MyDbContext _dbContext; public AddUserHandler (MyDbContext db...