ASP.NET CRUD 앱에는 만들기, 읽기, 업데이트 및 삭제로 구성된 데이터와의 상호 작용이 포함되어 있습니다. In 파트 1를 사용하여 기본 ASP.NET Core 프로젝트를 설정합니다. In 파트 2에 첫 번째 읽기 엔드포인트에서 위시리스트 데이터에 대한 SQL++ 쿼리를 사용합니다. In 파트 3에서 이번에는 키-값 API를 사용하여 또 다른 읽기 엔드포인트를 추가했습니다.
지금까지 저희가 수정한 유일한 데이터는 Couchbase Capella UI에서 직접 수정한 것이었습니다. 이 글에서는 위시리스트 데이터 생성 및 업데이트를 처리하는 엔드포인트를 추가해 보겠습니다.
SQL++ 대 키-값: 재검토
SQL++에는 다음이 포함됩니다. 삽입, 업데이트, 삭제 구문을 사용합니다. 따라서 SQL++를 사용하여 데이터 변형을 위한 엔드포인트를 구축할 수 있습니다. 이는 다음과 같이 작성된 코드와 매우 유사합니다. 파트 2.
SQL++에서 이전에 보지 못했을 수도 있는 한 가지 키워드는 다음과 같습니다. UPSERT. 짐작할 수 있듯이 다음과 같은 조합입니다. 업데이트 그리고 삽입. 데이터가 이미 존재하면 업데이트가 이루어지고, 존재하지 않으면 삽입이 이루어집니다. 다음은 SQL++를 사용하는 업서트 엔드포인트의 모습입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[HttpPost] [경로("api/editWithSql")] public 비동기 작업<IActionResult> CreateOrEditWithSql(위시리스트 항목 항목) { var 버킷 = 기다림 _버킷 공급자.GetBucketAsync("demo"); var 클러스터 = 버킷.클러스터; var id = 항목.Id ?? Guid.NewGuid(); var 결과 = 기다림 클러스터.QueryAsync<위시리스트 항목>( @"데모_기본.위시리스트에 UPSERT INTO (KEY, VALUE) VALUES ($id, { ""name"" : $name });", 옵션 => 옵션 .매개변수("id", id) .매개변수("name", 항목.이름) ); 반환 확인(결과); } |
이 코드에 대해 두 가지 중요한 점을 짚고 넘어가야 합니다:
-
- 생성 및 업데이트를 모두 처리합니다. 만약 항목 의 ID가 null이면 이 코드는 새 위시리스트 항목이 생성되고 있다고 가정합니다.
- 매개변수화: 관계형 데이터베이스에서와 마찬가지로 SQL++는 다음에 취약할 수 있습니다. SQL 주입를 사용할 수 있으므로 매개변수화를 적극 권장합니다. SQL++ 구문은 $ 를 사용하여 명명된 매개변수를 나타냅니다(예 $id 그리고 $name).
이 엔드포인트는 작동합니다. 하지만 파트 3를 사용하면 Couchbase와 상호 작용하기 위해 SQL++를 사용할 필요가 없습니다. 사실 키-값을 사용할 때와 SQL++를 사용할 때를 결정할 때도 매우 유사한 기준이 적용됩니다:
사용 사례 | 키 값? | 왜 또는 왜 안 될까요? |
키 "73892"로 새 사용자 만들기 | 예 | 직접 액세스 |
키 "73892"로 사용자 수정하기 | 예 | 직접 액세스 |
키 "73892"로 사용자의 이메일 주소만 수정합니다. | 예 | 사용자 문서가 크더라도 Couchbase는 키 기반 하위 문서 API를 클릭해 문서의 일부를 수정할 수 있습니다. |
키 "73892", "47212", "90491"을 사용하여 사용자 그룹 수정하기 | 예 | 이 경우 여러 키-값 연산이 필요할 수 있지만 여전히 SQL 선택 ... 어디에서 ... 쿼리. |
"Ohio" 대신 "OH"를 사용하도록 모든 주소를 수정합니다. | 아니요 | 사용자의 상태는 키가 아닌 '보조' 속성일 가능성이 높습니다(여러 사용자가 오하이오에 있을 수 있음). 이는 SQL++의 좋은 사용 사례입니다. 업데이트 |
이 엔드포인트는 하나의 위시리스트 항목만 추가하거나 변경하면 되므로 대신 키-값 API를 사용하겠습니다.
CreateOrEdit CRUD 엔드포인트 작성
코딩을 시작하기 전에 다음과 같은 사항을 고려하는 것이 좋습니다. 생성 또는 편집 는 단일 엔드포인트여야 하며, 그렇지 않으면 만들기 엔드포인트와 편집 엔드포인트. 이 매우 간단한 위시리스트 앱의 경우 유효성 검사, 인증 또는 기타 시스템 전반의 크로스 커팅 문제가 없습니다. 그러나 프로덕션 시스템에서는 데이터 '추가'와 데이터 '업데이트'가 서로 다른 비즈니스 규칙을 따르고 서로 다른 권한이 필요할 수 있습니다. 이 경우 작업을 두 개의 엔드포인트로 나눌 수 있습니다.
지금은 '업서트'를 사용하는 단일 엔드포인트부터 시작하겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[HttpPost] [경로("API/편집")] public 비동기 작업<IActionResult> 생성 또는 편집(위시리스트 항목 항목) { var 버킷 = 기다림 _버킷 공급자.GetBucketAsync("demo"); var 컬렉션 = 기다림 버킷.CollectionAsync("위시리스트"); var id = 항목.Id ?? Guid.NewGuid(); 기다림 컬렉션.UpsertAsync(id.ToString(), new { 이름 = 항목.이름 }); 반환 확인(new { 성공 = true}); } |
SQL++ 엔드포인트와 마찬가지로 이 엔드포인트는 다음을 확인합니다. Id 를 사용하여 '만들기'인지 '업데이트'인지 확인합니다.
그리고 UpsertAsync 함수도 마찬가지입니다:
-
- 다음을 사용하여 새 문서를 만듭니다. id.ToString() 를 키로
- 키를 사용하여 기존 문서를 변경합니다. id.ToString()
두 경우 모두 이 엔드포인트의 실행이 완료되면 다음과 같은 JSON 문서가 생성됩니다. { "name" = "위시리스트 항목 이름"} 를 키로 지정하고 GUID를 키로 지정합니다(엄밀히 말하면 Couchbase의 모든 키는 문자열이지만 우리는 GUID 문자열이라는 것을 알고 있습니다).
참고: 두 API의 미묘한 차이점 중 하나는 UPSERT 문은 하나의 필드(이름), 키-값 방식은 UpsertAsync 는 전체 문서를 변경합니다( 이름 )로 변경합니다.
ASP.NET CRUD 사용
Visual Studio에서 CTRL+F5로 애플리케이션을 실행하면 OpenAPI/Swagger UI에 몇 가지 새로운 엔드포인트가 표시될 것입니다:
API 소비자의 관점에서 보면 /api/편집 그리고 /api/editWithSql 엔드포인트는 동일하게 작동합니다. ID를 비워둔 채로 한 번 시도하여 새 항목을 만든 다음 알려진 ID로 다시 시도합니다( /api/getall )에 접속하여 어떤 일이 일어나고 어떤 변화가 있는지 관찰하세요.
예를 들어, ID를 비워 두어 "디지털 사진 프레임"이라는 새 항목을 추가했습니다(내 .NET 코드에서 생성된 "1c3de2e7-70ea-4ee2-803b-425bbf6251cb"), ID가 "2dab198b-1836-4409-9bdf-17275a2b2462"를 "스카이라인 칠리 2XL 티셔츠"라는 이름으로 변경합니다. 다음은 카우치베이스 아카펠라 UI에 표시되는 결과입니다:
다음 단계는 무엇인가요?
ASP.NET Core 프로젝트는 Couchbase Capella에 연결되어 있으며, 이제 키-값(권장) 또는 SQL++(이 특정 상황에는 권장되지 않음)로 데이터를 생성/업데이트("업서트")하고 있습니다.
다음 블로그 게시물에서는 "삭제"의 "D"로 CRUD를 마무리하겠습니다."
그동안은 그렇게 하셔야 합니다:
-
- 아카펠라 무료 체험 신청하기
- 다음 내용을 확인하세요. .NET용 카우치베이스 플레이그라운드 브라우저에서 바로 실행할 수 있는 예제입니다.