연습 - 앱 실행

완료됨

이전 연습에서는 데이터베이스 작업을 구현하기 위해 팀의 API에 대한 코드를 작성했습니다. 이 연습에서는 데이터베이스에 연결된 API를 테스트합니다.

API 실행

  1. 터미널 창에서 앱을 실행합니다.

    dotnet run
    
  2. 앱을 실행하여 출력을 검사하고 다음 정보를 확인합니다.

    • EF Core는 SQL 명령이 실행될 때 info 로그 이벤트로 에코합니다.
    • 데이터베이스가 아직 없는 경우 SQL CREATE 명령을 사용하여 테이블과 인덱스를 정의합니다.
    • 데이터베이스가 아직 시드되지 않은 경우 시드 데이터를 추가하기 위해 INSERT 명령이 실행됩니다.
    • 보안을 위해 매개 변수 값은 콘솔에 에코되지 않습니다. EnableSensitiveDataLogging을 사용하여 이 설정을 변경할 수 있습니다.
  3. SQLite 탐색기를 사용하여 시드된 데이터베이스를 탐색합니다. 각 테이블에는 데이터가 있습니다.

Swagger로 이동

이제 API가 실행되고 있으므로 API를 테스트하여 작업이 예상대로 작동하는지 확인하려고 합니다. API는 Swagger를 사용하여 테스트 UI를 제공하도록 구성됩니다. Swagger는 RESTful 웹 서비스를 설계, 빌드, 문서화, 사용하는 데 도움이 되는 도구입니다.

  1. 앱을 실행한 후 표시되는 출력에서 앱이 수신 대기하는 HTTP URL을 찾습니다. 출력은 다음 예제와 유사합니다.

    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: http://localhost:5200
    
  2. URL을 열려면 Ctrl 키를 누른 상태에서 해당 URL을 선택합니다. 브라우저는 API의 / 위치로 열리고 다음 Contoso Pizza management API. Go to /swagger to open the Swagger test UI. 텍스트를 반환합니다.

  3. 브라우저 주소 표시줄에서 URL의 끝에 /swagger를 추가한 후 Enter 키를 누릅니다.

CRUD 작업 테스트

다음 단계에서는 Swagger UI를 사용하여 클라이언트 애플리케이션과 동일한 방식으로 각 API의 작업을 테스트합니다. 각 작업 후 SQLite Explorer에서 데이터베이스를 검사하여 데이터베이스 변경 내용이 발생하는지 확인합니다.

  1. 피자의 전체 목록을 요청합니다.

    1. 피자 제목 아래에서 GET /Pizza 작업을 확장하고 사용해 보기를 선택합니다.
    2. 실행 단추를 선택합니다.

    API는 피자 목록을 JSON(응답 본문 아래)으로 반환합니다.

    [
        {
            "id": 1,
            "name": "Meat Lovers",
            "sauce": null,
            "toppings": null
        },
        {
            "id": 2,
            "name": "Hawaiian",
            "sauce": null,
            "toppings": null
        },
        {
            "id": 3,
            "name": "Alfredo Chicken",
            "sauce": null,
            "toppings": null
        }
        ]
    

    saucetoppings 속성이 null인 이유는 무엇인가요? 이 결과는 PizzaService.GetAll 메서드에서 Include 확장 메서드를 사용하여 탐색 속성을 로드하도록 지정하지 않았기 때문에 예상되는 결과입니다.

  2. 피자 한 판을 요청해 보겠습니다.

    1. GET /Pizza{id} 작업까지 아래로 스크롤하여 확장합니다. 그런 다음, 사용해 보기를 선택합니다.
    2. ID 필드에 2를 입력하고 실행을 선택합니다.

    API는 "Hawaiian" 피자를 반환합니다. PizzaService.GetById 메서드가 Include 확장 메서드를 사용하므로 saucetoppings 속성이 채워진 것을 알 수 있습니다.

  3. 새 피자를 추가합니다.

    1. POST /Pizza 작업(방금 사용한 GET 작업 사이에 있음)까지 위로 스크롤하여 확장합니다. 그런 다음, 사용해 보기를 선택합니다.

    2. 요청 본문 텍스트 상자에 다음 JSON을 붙여넣습니다.

      {
        "name": "BBQ Beef",
        "sauce": {
          "name": "BBQ",
          "isVegan": false
        },
        "toppings": [
          {
            "name": "Smoked Beef Brisket",
            "calories": 250
          }
        ]
      }
      
    3. 실행을 선택합니다.

    API는 id 속성이 채워진 새 피자를 반환합니다.

  4. BBQ Beef 피자에 또 다른 토핑을 추가합니다.

    1. PUT /Pizza{id}/addtopping 작업까지 아래로 스크롤하여 확장합니다. 사용해 보기를 선택합니다.
    2. ID 필드에 4를 입력합니다.
    3. toppingId 필드에 5를 입력합니다.
    4. 실행을 선택합니다.

    API는 피자를 업데이트하고 성공 코드를 반환합니다. 데이터베이스에서 피자를 토핑과 연결하는 레코드가 PizzaTopping에 추가됩니다.

  5. BBQ Beef 피자의 소스를 변경합니다.

    1. PUT /Pizza{id}/updatesauce 작업까지 아래로 스크롤하여 확장합니다. 사용해 보기를 선택합니다.
    2. ID 필드에 4를 입력합니다.
    3. sauceId 필드에 2를 입력합니다.
    4. 실행을 선택합니다.

    API는 피자를 업데이트하고 성공 코드를 반환합니다. 데이터베이스에서 Pizza 레코드가 업데이트되어 피자를 새 소스와 연결합니다.

  6. GET /Pizza{id} 작업으로 돌아가서 id 필드를 4로 설정하고 BBQ Beef 피자를 요청합니다. 그런 다음, 실행을 선택합니다. saucetoppings 속성이 채워집니다.

    {
        "id": 4,
        "name": "BBQ Beef",
        "sauce": {
            "id": 2,
            "name": "Alfredo",
            "isVegan": false
        },
        "toppings": [
            {
            "id": 5,
            "name": "Pineapple",
            "calories": 75
            },
            {
            "id": 6,
            "name": "Smoked Beef Brisket",
            "calories": 250
            }
        ]
    }
    
  7. Alfredo 소스에 파인애플을 곁들인 스모크 브리스킷 피자는 끔찍한 아이디어라는 것을 깨달았습니다.

    피자를 삭제합니다.

    1. DELETE /Pizza{id} 작업을 찾아 확장합니다. 사용해 보기를 선택합니다.
    2. ID 필드에 4를 입력합니다.
    3. 실행을 선택합니다.

    API는 피자를 삭제하고 성공 코드를 반환합니다. 데이터베이스에서 Pizza 레코드 및 PizzaTopping에서 연결된 레코드가 삭제됩니다.

  8. 앱이 실행 중인 터미널에서 Ctrl+C를 눌러 실행 중인 앱을 중지합니다.

앱을 실험할 수 있습니다. 새 데이터베이스로 시작하려는 경우 언제든지 앱을 중지하고 ContosoPizza.db, .db-shm, .db-wal 파일을 삭제합니다. 그런 다음, 앱을 다시 실행합니다.

잘했습니다! 앱이 예상대로 데이터베이스와 상호 작용합니다. 다음 단원에서는 기존 데이터베이스에서 엔터티 모델을 스캐폴드합니다.