라트노팜 차크라바티 는 현재 에릭슨에서 근무하는 소프트웨어 개발자입니다. 그는 오랫동안 IoT, 기계 간 기술, 커넥티드 카, 스마트 시티 분야에 집중해 왔습니다. 그는 새로운 기술을 배우고 이를 실무에 적용하는 것을 좋아합니다. 일하지 않을 때는 3살 난 아들과 함께 시간을 보내는 것을 즐깁니다.
일련 키(자동 번호)로 문서 삽입하기
소프트웨어 개발 과정에서 (엔티티의) 고유 키를 순서대로 순차적으로(증가 또는 감소 순서로) 생성해야 하는 상황에 종종 직면하게 됩니다. 일반적인 예는 다음과 같습니다:
-
각 데이터 행에 자동 생성된 시퀀스 번호가 할당된 로그 파일의 항목을 저장합니다.
-
데이터베이스에 비즈니스 엔티티를 저장하고 증분 시퀀스 번호로 생성된 기본 키가 있습니다.
관계형 데이터베이스 세계에서는 "데이터베이스 시퀀스"라는 것을 사용하여 이를 달성합니다. 시퀀스는 대부분의 데이터베이스 제품에서 제공하는 기능으로, 단순히 고유 번호 값을 질서정연하게 생성하는 기능입니다. 값을 증가시켜 반환하기만 하면 됩니다. 데이터베이스 시퀀스가 없으면 특정 순서로 고유 번호를 생성하기가 쉽지 않습니다. 그렇기 때문에 기본 키(또는 고유 키)를 고유한 자동 증가 값으로 채울 때 많이 사용됩니다.
무작위로 고유한 키를 생성하는 다른 방법으로는 GUID 또는 UUID와 같은 기능을 사용하는 방법이 있습니다. 그러나 데이터베이스 시퀀스 생성기를 사용할 때 얻을 수 있는 자동 증가 특성은 보장할 수 없습니다.
NoSQL 데이터베이스에 시퀀스 없음
관계형 데이터베이스 세계와 달리, 시중에 나와 있는 대부분의 NoSQL 데이터베이스에는 간단한 내장 시퀀스 생성 기능이 없습니다. 자유 형식 데이터를 사용하는 분산 시스템에서는 서로 다른 노드와 샤드 간에 데이터를 교차 복제할 때 생성되는 번호가 충돌할 수 있기 때문에 고유한 자동 증가 번호를 문서의 고유 키로 사용하는 것이 일반적이지 않다고 주장할 수도 있습니다. 대신 UUID를 구현하는 것이 고유성을 보장하는 훨씬 더 실용적인 옵션으로 보입니다. 그러나 시퀀스에서 무작위로 생성된 고유 ID가 필요한 경우, UUID 솔루션은 생성된 번호의 시퀀싱 특성을 보존하지 못하므로 어떻게든 NoSQL 데이터베이스에 자동 증가 시퀀스 열을 만들어야 합니다. 주요 질문입니다: Couchbase를 사용하면 어떻게 처리할 수 있을까요? 이 글에서는 Couchbase를 사용하여 이 문제를 해결할 수 있는 방법을 설명합니다.
데이터를 저장할 Couchbase 버킷을 설정하세요.
제품 카탈로그의 상품을 Couchbase 버킷에 저장하는 동안 각 제품 데이터 JSON에 생성된 시퀀스를 설정하여 고유하게 식별 가능한 문서의 '키'로 사용할 수 있도록 해야 한다고 가정해 보겠습니다.
이렇게 하려면 아래 단계에 따라 "prodcat"이라는 이름의 버킷을 만드세요.
- 먼저 Couchbase의 관리 콘솔에 로그인합니다.
- 유형 http://localhost:8091/ui/index.html 를 클릭합니다.
- 관리자 사용자 아이디와 비밀번호로 로그인합니다.
- 데이터 버킷 탭으로 이동하여 새 데이터 버킷 만들기를 클릭합니다.
- 버킷 이름 필드에 "prodcat"을 입력하고 노드당 RAM 할당량 필드에 512를 입력합니다.
- 다른 모든 필드는 기본값으로 두고 "만들기"를 클릭합니다.
- 버킷이 성공적으로 생성되면 항목이 0개로 나열됩니다.
카운터 문서 사용
카우치베이스는 "카운터" 문서로 알려진 시퀀스 생성을 처리합니다. 카운터는 순차적으로 증가하거나 감소할 수 있는 문서입니다. 여기서 주목해야 할 중요한 점은 카운터의 증가 또는 감소 연산이 원자적이라는 것입니다. 비즈니스 엔티티(예: 이 경우 Product)를 JSON 문서로 삽입하면 키 패턴이 있는 카운터 문서를 사용하여 시퀀스를 생성할 수 있습니다.
다음 코드 스니펫은 초기값이 20인 카운터 문서를 초기화합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 카우치베이스 클러스터 및 버킷에 대한 연결 만들기 클러스터 클러스터 = 카우치베이스클러스터.create("127.0.0.1"); 버킷 버킷 = 클러스터.오픈버킷(BUCKET_NAME); // 여기서는 BUCKET_NAME = "prodcat"(Couchbase 관리자 콘솔을 사용하여 생성한 것)입니다. 문자열 키 = "idGeneratorForProducts"; 시도 { 버킷.제거(키); } catch (문서가 존재하지 않음 예외 e) { } 시도 { 버킷.카운터(키, 0, 20); } catch (문서가 존재하지 않음 예외 e) { 로그.정보("카운터가 아직 존재하지 않으며 초기값이 제공되지 않았습니다."); } |
이 시점에서 카운터 문서는 20의 값으로 초기화됩니다.
다음 코드를 루프에서 실행하여 제품 데이터를 순차적으로 삽입합니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
long nextIdNumber = 버킷.카운터(키, 1).콘텐츠(); 로그.정보("nextIdNumber = "+ nextIdNumber); 문자열 id = "Prod::" + nextIdNumber; //이제 문서를 저장할 준비가 되었습니다: 제품 제품 = 제품 활용.getProduct(nextIdNumber); JsonObject 콘텐츠 = JsonObject.create() .put("type", 제품.유형) .put("id", 제품.getId()) .put("설명", 제품.getDescription()) .put("가격", 제품.getPrice()); 버킷.삽입(JsonDocument.create(id, 콘텐츠)); |
다음은 위 코드에 대한 설명입니다:
다음Id는 카운터를 1씩 증가시켜 계산합니다.
다음Id를 사용하여 제품 문서의 'id' 필드를 채웁니다.
여기서 "idGeneratorForProducts"는 카운터의 현재 값을 저장하는 카운터 문서입니다. 각 제품 문서에는 시퀀스로 채워진 "id"가 있습니다:
1 2 3 4 5 6 |
{ "id": "제품 21", "가격": "20", "type": "제품", "설명": "이것은 유틸리티 제품입니다" } |
이 시퀀스를 내림차순으로 구현할 수도 있다는 점을 언급할 가치가 있습니다. 이 경우 우리가 해야 할 유일한 작업은
- 카운터를 최대값으로 초기화합니다.
- 카운터를 1씩 감소시켜 다음Id를 순차적으로 생성합니다.
- 다음Id를 사용하여 버킷에 문서를 삽입합니다.
결론
이 문서에 사용된 코드는 Java로 작성되었으며, 다음과 같이 스프링 부트 및 스프링 데이터 카우치베이스 종속성. 동일한 개념을 모든 카우치베이스 클라이언트 SDK에 적용할 수 있습니다.
애플리케이션의 소스 코드는 다음 링크에서 확인할 수 있습니다. https://github.com/ratchakr/prodcat.
이 기능은 관리자 API에서 사용할 수 있나요(또는 SDK에서만 사용할 수 있나요)...?