연습 - 기존 데이터베이스에서 리버스 엔지니어링

완료됨

Contoso Pizza의 관리자는 회사가 앱에 쿠폰을 표시할 수 있도록 엔드포인트를 추가하도록 요청했습니다. 쿠폰은 기존 데이터베이스에 저장됩니다. 이 단원에서는 기존 데이터베이스에서 스캐폴딩을 만들고 결과 엔터티 클래스를 수정합니다.

프로모션 데이터베이스 검사

스캐폴드된 코드를 생성하는 데 사용할 데이터베이스를 살펴보겠습니다.

  1. Explorer 창에서 Promotions 디렉터리를 확장하고 Promotions.db 파일을 마우스 오른쪽 단추로 클릭한 다음, 데이터베이스 열기를 선택합니다.

    새 데이터베이스가 SQLite Explorer 폴더에서 열립니다.

  2. SQLite Explorer 폴더에서 Promotions.db 및 쿠폰 노드를 확장합니다. 데이터 스키마에 유의합니다.

  3. 쿠폰 노드를 마우스 오른쪽 단추로 클릭하고 테이블 표시를 선택합니다. 쿠폰 데이터를 검사합니다.

프로모션 컨텍스트 및 쿠폰 모델 스캐폴딩

이제 데이터베이스를 사용하여 코드를 스캐폴드합니다.

  1. 다음 명령을 실행합니다.

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    이전 명령:

    • 제공된 연결 문자열을 사용하여 DbContext 및 모델 클래스를 스캐폴드합니다.
    • Microsoft.EntityFrameworkCore.Sqlite 데이터베이스 공급자를 사용하도록 지정합니다.
    • 결과 DbContext 및 모델 클래스에 대한 디렉터리를 지정합니다.

    참고

    이 연습에서는 소스 코드에 있는 연결 문자열에 대한 경고를 무시합니다. 실제 코드는 연결 문자열을 항상 안전한 위치에 저장하세요.

  2. Models\Coupon.cs를 엽니다. SQLite에는 날짜/시간 데이터 형식이 없으므로 Expiration 속성이 문자열로 정의됩니다. Expiration 형식을 string?에서 DateTime으로 변경합니다. EF Core가 날짜/시간 데이터를 문자열 데이터로 변환하는 것을 관리합니다.

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    데이터베이스가 변경되면 스캐폴드된 파일을 새로 생성할 수 있습니다. 생성된 파일은 매번 덮어쓰이지만 고유한 별도 파일의 사용자 지정 속성 및 동작으로 확장할 수 있는 partial 클래스로 만들어집니다.

쿠폰 엔드포인트 추가

스캐폴드된 코드를 테스트하려면 API에 엔드포인트를 추가해야 합니다. 그런 다음, 새 API 컨트롤러를 추가합니다.

API 컨트롤러의 작동 방식을 더 잘 이해하려면 ASP.NET Core 컨트롤러를 사용하여 웹 API 만들기를 참조하세요.

  1. Controllers 폴더에 다음 코드가 포함된 CouponController.cs라는 파일을 추가합니다.

    using ContosoPizza.Data;
    using ContosoPizza.Models;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class CouponController : ControllerBase
    {
        PromotionsContext _context;
    
        public CouponController(PromotionsContext context)
        {
            _context = context;
        }
    
        [HttpGet]
        public IEnumerable<Coupon> Get()
        {
            return _context.Coupons
                .AsNoTracking()
                .ToList();
        }
    }
    

    이 코드는 API에 api/coupon 엔드포인트를 추가합니다.

    위의 코드에서

    • PromotionsContext 개체가 생성자에 삽입됩니다.
    • Get 메서드는 모든 쿠폰을 반환합니다.
  2. Program.cs에서 // Add the PromotionsContext 주석을 다음 코드로 바꿉니다.

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    이 코드는 PromotionsContext를 종속성 삽입 시스템에 등록합니다.

  3. 모든 변경 내용을 저장하고 dotnet run을 실행하여 앱을 실행합니다.

엔드포인트 테스트

이제 엔드포인트가 추가되었으므로 쿠폰 작업을 테스트해 보겠습니다.

  1. 이전 연습에서 했던 것처럼 API의 Swagger UI로 이동하거나 브라우저에서 기존 UI를 새로 고칩니다.

  2. 쿠폰 제목 아래에서 가져오기 작업을 확장하고 사용해 보기를 선택합니다.

  3. 실행을 선택합니다. 응답 본문에는 데이터베이스의 쿠폰이 표시됩니다.

    [
    {
        "id": 1,
        "description": "Buy 1 get 1 free",
        "expiration": "2025-01-01T00:00:00"
    },
    {
        "id": 2,
        "description": "4 large pizzas for $40",
        "expiration": "2024-06-30T00:00:00"
    }
    ]
    

    expiration은 datetime 값입니다.

이것으로 끝입니다. 기존 데이터베이스에서 스캐폴딩을 만들고 수정했습니다.