연습 - 앱 실행
이전 연습에서는 데이터베이스 작업을 구현하기 위해 팀의 API에 대한 코드를 작성했습니다. 이 연습에서는 데이터베이스에 연결된 API를 테스트합니다.
API 실행
터미널 창에서 앱을 실행합니다.
dotnet run
앱을 실행하여 출력을 검사하고 다음 정보를 확인합니다.
- EF Core는 SQL 명령이 실행될 때
info
로그 이벤트로 에코합니다. - 데이터베이스가 아직 없는 경우 SQL
CREATE
명령을 사용하여 테이블과 인덱스를 정의합니다. - 데이터베이스가 아직 시드되지 않은 경우 시드 데이터를 추가하기 위해
INSERT
명령이 실행됩니다. - 보안을 위해 매개 변수 값은 콘솔에 에코되지 않습니다. EnableSensitiveDataLogging을 사용하여 이 설정을 변경할 수 있습니다.
- EF Core는 SQL 명령이 실행될 때
SQLite 탐색기를 사용하여 시드된 데이터베이스를 탐색합니다. 각 테이블에는 데이터가 있습니다.
Swagger로 이동
이제 API가 실행되고 있으므로 API를 테스트하여 작업이 예상대로 작동하는지 확인하려고 합니다. API는 Swagger를 사용하여 테스트 UI를 제공하도록 구성됩니다. Swagger는 RESTful 웹 서비스를 설계, 빌드, 문서화, 사용하는 데 도움이 되는 도구입니다.
앱을 실행한 후 표시되는 출력에서 앱이 수신 대기하는 HTTP URL을 찾습니다. 출력은 다음 예제와 유사합니다.
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5200
URL을 열려면 Ctrl 키를 누른 상태에서 해당 URL을 선택합니다. 브라우저는 API의
/
위치로 열리고 다음Contoso Pizza management API. Go to /swagger to open the Swagger test UI.
텍스트를 반환합니다.브라우저 주소 표시줄에서 URL의 끝에
/swagger
를 추가한 후 Enter 키를 누릅니다.
CRUD 작업 테스트
다음 단계에서는 Swagger UI를 사용하여 클라이언트 애플리케이션과 동일한 방식으로 각 API의 작업을 테스트합니다. 각 작업 후 SQLite Explorer에서 데이터베이스를 검사하여 데이터베이스 변경 내용이 발생하는지 확인합니다.
피자의 전체 목록을 요청합니다.
- Pizza 제목 아래에서 GET /Pizza 작업을 확장하고 시도 단추를 선택합니다.
- 실행 단추를 선택합니다.
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 } ]
팁
sauce
및toppings
속성이 null인 이유는 무엇인가요? 이 결과는PizzaService.GetAll
메서드에서Include
확장 메서드를 사용하여 탐색 속성을 로드하도록 지정하지 않았기 때문에 예상되는 결과입니다.피자 한 판을 요청해 보겠습니다.
- GET /Pizza/{id} 작업까지 아래로 스크롤하여 확장한 다음 시도 단추를 선택합니다.
- id 필드에 2를 입력한 다음 실행을 선택합니다.
API는 "Hawaiian" 피자를 반환합니다.
PizzaService.GetById
메서드가Include
확장 메서드를 사용하므로sauce
및toppings
속성이 채워진 것을 알 수 있습니다.새 피자를 추가합니다.
POST /Pizza 작업(사용한 GET 작업 사이에 있음)까지 위로 스크롤하여 확장한 다음 시도 단추를 선택합니다.
요청 본문 텍스트 상자에 다음 JSON을 붙여넣습니다.
{ "name": "BBQ Beef", "sauce": { "name": "BBQ", "isVegan": false }, "toppings": [ { "name": "Smoked Beef Brisket", "calories": 250 } ] }
실행을 선택합니다.
API는
id
속성이 채워진 새 피자를 반환합니다.BBQ Beef 피자에 또 다른 토핑을 추가합니다.
- PUT /Pizza/{id}/addtopping 작업까지 아래로 스크롤하여 확장한 다음 시도 단추를 선택합니다.
- ID 필드에 4를 입력합니다.
- toppingId 필드에 5를 입력합니다.
- 실행을 선택합니다.
API는 피자를 업데이트하고 성공 코드를 반환합니다. 데이터베이스에서 피자를 토핑과 연결하는 레코드가
PizzaTopping
에 추가됩니다.BBQ Beef 피자의 소스를 변경합니다.
- PUT /Pizza/{id}/updatesauce 작업까지 아래로 스크롤하여 확장한 다음 시도 단추를 선택합니다.
- ID 필드에 4를 입력합니다.
- sauceId 필드에 2를 입력합니다.
- 실행을 선택합니다.
API는 피자를 업데이트하고 성공 코드를 반환합니다. 데이터베이스에서
Pizza
레코드가 업데이트되어 피자를 새 소스와 연결합니다.GET /Pizza/{id} 작업으로 돌아가서 id 필드를 4로 설정하고 BBQ Beef 피자를 요청합니다. 그런 다음, 실행을 선택합니다.
sauce
및toppings
속성이 채워집니다.{ "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 } ] }
당신은 방금 알프레도 소스와 파인애플을 곁들인 훈제 양지머리 피자는 끔찍한 아이디어라는 것을 깨달았습니다.
피자를 삭제합니다.
- DELETE /Pizza/{id} 작업을 찾아 확장한 다음 시도 단추를 선택합니다.
- ID 필드에 4를 입력합니다.
- 실행을 선택합니다.
API는 피자를 삭제하고 성공 코드를 반환합니다. 데이터베이스에서
Pizza
레코드 및PizzaTopping
에서 연결된 레코드가 삭제됩니다.앱이 실행 중인 터미널에서 Ctrl+C를 눌러 실행 중인 앱을 중지합니다.
팁
앱을 실험할 수 있습니다. 새 데이터베이스로 시작하려는 경우 언제든지 앱을 중지하고 ContosoPizza.db, .db-shm, .db-wal 파일을 삭제합니다. 그런 다음, 앱을 다시 실행합니다.
잘했습니다! 앱이 예상대로 데이터베이스와 상호 작용합니다. 다음 단원에서는 기존 데이터베이스에서 엔터티 모델을 스캐폴드합니다.