Couchbase의 새로운 EF 코어 공급자 는 기존에 관계형 데이터베이스에 묶여 있던 강력한 .NET 통합의 문을 열어줍니다. 이 게시물에서는 Identity, GraphQL 및 OData가 모두 Couchbase에서 어떻게 작동하는지 설명합니다.
이 게시물에서는 다음과 같이 안내해 드리겠습니다. 세 가지 고급 EF Core 통합 Couchbase로 성공적으로 테스트했습니다:
-
- ASP.NET 핵심 아이덴티티
- GraphQL(핫 초콜릿을 통한)
- OData
참고: 이러한 통합 기능은 제한된 테스트를 기반으로 하며 아직 공식적으로 지원되지 않습니다. 마일리지는 다를 수 있지만 지금까지는 많은 가능성을 보여주고 있습니다.
ASP.NET 핵심 아이덴티티
Microsoft.AspNetCore.Identity.EntityFrameworkCore 는 ASP.NET 앱을 위한 플러그 앤 플레이 인증 및 사용자 관리 시스템을 제공합니다.
Couchbase의 EF Core 제공업체가 잘 작동합니다. 한 가지 주의해야 할 점은 적절한 컬렉션이 먼저 존재합니다. (예: AspNetUsers, AspNetRoles 등).
참고: 다음 컬렉션을 미리 만들어야 합니다: AspNetUsers, AspNetRoles, AspNetUserRoles, AspNetUserClaims, AspNetUserLogins, AspNetUserTokens, AspNetRoleClaims.
EF 설정 예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public 클래스 AppDbContext : IdentityDbContext<애플리케이션 사용자> { public AppDbContext(DbContextOptions<AppDbContext> 옵션) : base(옵션) { } 보호됨 오버라이드 void 모델 생성(모델 빌더 빌더) { base.모델 생성(빌더); 빌더.엔티티<애플리케이션 사용자>().카우치베이스 컬렉션(이, "AspNetUsers"); 빌더.엔티티<신원 역할>().카우치베이스 컬렉션(이, "AspNetRoles"); 빌더.엔티티<신원 사용자 역할<문자열>>().카우치베이스 컬렉션(이, "AspNetUserRoles"); 빌더.엔티티<신원 사용자 클레임<문자열>>().카우치베이스 컬렉션(이, "AspNetUserClaims"); 빌더.엔티티<신원 사용자 로그인<문자열>>().카우치베이스 컬렉션(이, "AspNetUserLogins"); 빌더.엔티티<신원 사용자 토큰<문자열>>().카우치베이스 컬렉션(이, "AspNetUserTokens"); 빌더.엔티티<신원 역할 클레임<문자열>>().카우치베이스 컬렉션(이, "AspNetRoleClaims"); } } public 클래스 애플리케이션 사용자 : IdentityUser { } |
MVC 인증 예제
다음은 등록, 로그인, 로그아웃 및 사용자 지정 역할이 있는 ASP.NET Core MVC 컨트롤러입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public 클래스 AuthController : 컨트롤러 { 비공개 읽기 전용 사용자 관리자<애플리케이션 사용자> _userManager; 비공개 읽기 전용 로그인 관리자<애플리케이션 사용자> _signInManager; 비공개 읽기 전용 RoleManager<신원 역할> _roleManager; public AuthController(사용자 관리자<애플리케이션 사용자> userManager, 로그인 관리자<애플리케이션 사용자> 로그인 관리자, RoleManager<신원 역할> 역할 관리자) { _userManager = userManager; _signInManager = 로그인 관리자; _roleManager = 역할 관리자; } public IActionResult 등록하기() => 보기(); [HttpPost] public 비동기 작업<IActionResult> 등록하기(등록 모델 모델) { 만약 (!모델 상태.IsValid) 반환 보기(모델); var 사용자 = new 애플리케이션 사용자 { 사용자 이름 = 모델.이메일, 이메일 = 모델.이메일 }; var 결과 = 기다림 _userManager.CreateAsync(사용자, 모델.비밀번호); 만약 (결과.성공) { var 역할 이름 = "CustomRole"; 만약 (!기다림 _roleManager.RoleExistsAsync(역할 이름)) 기다림 _roleManager.CreateAsync(new 신원 역할(역할 이름)); 기다림 _userManager.추가 역할 동기화(사용자, 역할 이름); 기다림 _signInManager.SignInAsync(사용자, isPersistent: false); 반환 RedirectToAction("색인", "홈"); } foreach (var 오류 in 결과.오류) 모델 상태.추가 모델 오류("", 오류.설명); 반환 보기(모델); } public IActionResult 로그인() => 보기(); [HttpPost] public 비동기 작업<IActionResult> 로그인(로그인 모델 모델) { 만약 (!모델 상태.IsValid) 반환 보기(모델); var 결과 = 기다림 _signInManager.PasswordSignInAsync(모델.이메일, 모델.비밀번호, false, false); 만약 (결과.성공) 반환 RedirectToAction("색인", "홈"); 모델 상태.추가 모델 오류("", "잘못된 로그인 시도입니다."); 반환 보기(모델); } public 비동기 작업<IActionResult> 로그아웃() { 기다림 _signInManager.SignOutAsync(); 반환 RedirectToAction("색인", "홈"); } } |
데이터는 표준 ID 구조를 따르며, Couchbase 문서에 저장됩니다. 예를 들어 AspNetUser 컬렉션:
핫 초콜릿을 사용한 그래프QL
핫 초콜릿 는 널리 사용되는 .NET용 GraphQL 서버입니다. 이 서버는 공급자의 LINQ 기능(Couchbase가 제공하는 기능)을 활용하여 EF Core와 통합할 수 있습니다. 즉, GraphQL 쿼리가 LINQ로 변환된 다음 Couchbase SQL++로 변환됩니다.
설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public 클래스 위젯 쿼리 { [사용필터링] [사용소팅] public IQueryable<위젯> GetWidgets([서비스] 위젯Db컨텍스트 dbContext) => dbContext.위젯; } // Program.cs: 빌더.서비스 .AddGraphQLServer() .추가 쿼리 유형<위젯 쿼리>() .필터링 추가() .추가 정렬() .프로젝션 추가(); 앱.MapGraphQL(); |
사용 예
- 다음으로 이동 /graphql 을 클릭합니다(웹 인터페이스가 나타납니다).
- 다음과 같은 쿼리를 시도해 보세요:
1 2 3 4 5 6 7 8 9 |
쿼리 { 위젯(어디: { 이름: { 포함: "foo" } }, 주문: { createdDt: DESC }) { id 이름 가격 눔인스톡 createdDt } } |
다음과 같은 결과가 반환됩니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "데이터": { "위젯": [ { "id": "b5c494fe-135f-4f01-bf12-6e4ad1eee829", "name": "foobar", "가격": 1.99, "numInStock": 50, "createdDt": "2025-06-18T18:11:19.149Z" } ] } } |
팁
-
- GraphQL 쿼리는 GSI 인덱스와 일치해야 합니다(내부적으로는 SQL++ 쿼리일 뿐입니다).
- 다음을 사용할 수 있습니다. 표지 인덱스 및 기타 SQL++ 인덱스를 사용하여 성능을 개선합니다.
OData
Microsoft.AspNetCore.OData 는 EF Core 데이터를 OData 엔드포인트로 노출하므로 Excel, Power BI, Tableau와 같은 도구를 Couchbase에 쉽게 연결할 수 있습니다.
프로그램.cs 샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
빌더.서비스.추가 컨트롤러 위드 뷰() .데이터 추가(opt => { var 데이터 빌더 = new ODataConvention모델빌더(); 데이터 빌더.엔티티 세트<위젯>("위젯"); opt.추가 경로 구성 요소("odata", 데이터 빌더.GetEdmModel()) .필터() .주문 기준() .선택() .확장() .Count() .SetMaxTop(100); }); |
컨트롤러
1 2 3 |
[HttpGet("/데이터/위젯")] [EnableQuery] public IQueryable<위젯> GetOData() => _context.위젯; |
OData 쿼리 예제
-
- https://localhost:7037/odata/Widgets?$filter=price gt 1&$orderby=name
- https://localhost:7037/odata/Widgets?$select=name,price&$top=10
참고: EF Core LINQ 쿼리를 SQL++로 변환할 수 있는지, 필터링/소팅된 필드가 Couchbase에서 인덱싱되는지 확인하세요.
마무리
이러한 모든 통합은 EF Core에 의해 지원되며, 이제 Couchbase 지원을 통해 코드에서 이를 최대한 활용할 수 있습니다. 안전한 웹 애플리케이션을 구축하든, GraphQL API를 구축하든, BI 도구와 통합하든, EF Core와 Couchbase의 조합을 통해 모든 것이 가능합니다.
더 자세히 알고 싶으신가요? 다음에 어떤 통합 기능을 살펴보고 싶은지 알려주세요!