노력과 삽질 퇴적물
DB: NoSQL과 Amazon DynamoDB 본문
0. 필요한 파일
파일명 | 예시 경로 |
이클립스[#] | C:\eclipse |
AWS Toolkit for Eclipse [#] | (이클립스 플러그인) |
JDK, JAVA SE [#] | C:\Java\jdk1.8.0_111 |
Java용 AWS SDK [#] | D:\dev_lib\aws_java_sdk > aws-java-sdk-1.11.111 |
1. NoSQL
* MySQL같은 RDBMS(relational database management system)와 달리
NoSQL(Not Only SQL)은 분산처리에 촛점을 둔 비관계형 데이터 저장기술이다.
1) 장점
> 데이터간의 관계를 정의X: Join등의 관계형 연산 없음.
> 빅데이터에 최적화: 페타바이트급 용량 가능.
> 데이터 처리 완결성(Transaction) 보장하지 않음.
> Schemaless: 데이터의 스키마와 속성들을 다양하게 수용하고 동적으로 정의
: 테이블 생성시 고정된 Hashkey, RangeKey만 맞으면 put/update등의 처리 입력이 자유롭다.
> 높은 레벨의 트랜잭선이 제공되지 않고, 데이터 검증이 없기때문에 저장이 빠르다.
> 대다수의 제품이 오픈소스
2) 단점
> Join 연산이 없으므로 복잡한 검색이 어렵다.
> 대체로 순서가 보장되지 않음.
> RDBMS에 비해 안정성 검증이 덜되었다.
: 특히 금융권에 부적합.
> 용도가 한정된 상황이다.
: 댓글, 메신져 로그 등등
3) 종류
key-value 형식 |
문서 형식 |
그래프 형식 |
컬럼 형식 |
가장 일반적인 종류.
예. Riak, Vodemort, Tokyo등 |
JSON, XML과 같은 Collection 데이터 모델 예. Mongo DB, Cough DB, DynamoDB |
Nodes, Relationship, Key-Value 데이터 모델 예. AgensGraph, Neo4j, SAP HANA 등등. |
데이터의 컬럼을 읽고 쓰는 데 최적화 예. HBase, Cassandra, Hypertable |
2. DynamoDB
* JAVA기준입니다.
1) 테이블 기본 제어
① getItem
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 | private final String TABLE_NAME = "my_dynamoDB_table_name"; private final String TABLE_RANGED_KEY = "hashTag_or_category_key"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); ... ... ... Table table = dynamoDB.getTable( TABLE_NAME ); GetItemSpec spec = new GetItemSpec(); spec.withPrimaryKey("p_key_label", "this is unique val", "r_key_label", TABLE_RANGED_KEY ); spec.withAttributesToGet( "col_name_1", ...,"col_name_k");// as like as 'SELECT col_name_1, ..., col_name_k' Item tableResultItem = null; try { tableResultItem = table.getItem(spec); if(tableResultItem==null){ //do-somthing return; } } catch (AmazonServiceException exception) { // REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html //do-somthing } } catch (AmazonClientException exception) { //do-somthing } | cs |
② putItem
> withConditionExpression으로 신규 아이템 추가 OR 기존 아이템 갱신 처리도 가능.
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 | private final String TABLE_NAME = "my_dynamoDB_table_name"; private final String TABLE_RANGED_KEY = "hashTag_or_category_key"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); ... ... ... Table table = dynamoDB.getTable( TABLE_NAME ); Item tableResultItem = null; HashSet<String> hashSet = new HashSet<String>( Arrays.asList("item_1", "item_2")); tableResultItem = new Item(); tableResultItem.withPrimaryKey("p_key_label", "this is unique val", "r_key_label", TABLE_RANGED_KEY ); tableResultItem.withInt("col_name_1", 2017); tableResultItem.withString("col_name_2", "ANALOG-GREEN"); tableResultItem.withStringSet( "col_name_3", hashSet );//WARN. DynamoDB does not allow empty sets. PutItemSpec putItemSpec = new PutItemSpec(); putItemSpec.withItem(tableResultItem); putItemSpec.withConditionExpression("attribute_not_exists(p_key_label)"); try{ table.putItem(putItemSpec); }catch(ConditionalCheckFailedException e){ //do something }catch (AmazonServiceException exception) { // REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html //do-somthing } } catch (AmazonClientException exception) { //do-somthing } | cs |
③ updateItem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private final String TABLE_NAME = "my_dynamoDB_table_name"; private final String TABLE_RANGED_KEY = "hashTag_or_category_key"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); ... ... ... Table table = dynamoDB.getTable( TABLE_NAME ); UpdateItemSpec updateItemSpec = new UpdateItemSpec(); updateItemSpec.withPrimaryKey("p_key_label", "this is unique val", "r_key_label", TABLE_RANGED_KEY); updateItemSpec.withUpdateExpression("SET date=:newDate, cnt=:newCnt"); updateItemSpec.withConditionExpression("date<:newDate AND attribute_exists(p_key_label)"); updateItemSpec.withValueMap( new ValueMap() .withNumber( ":newDate", newDate) .withNumber( ":newCnt", newCnt) ); // update to dynamoDB try{ table.updateItem(updateItemSpec); }catch(ConditionalCheckFailedException exception){ // do something } | cs |
2) 추가제어
① BatchGetItem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | private final String TABLE_NAME = "my_dynamoDB_table_name"; private final String TABLE_RANGED_KEY = "hashTag_or_category_key"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); ... ... ... BatchGetItemOutcome outcome = null; Map<String, List<Item>> profileTableItems = null; TableKeysAndAttributes tableKeysAndAttributes = new TableKeysAndAttributes( TABLE_NAME ); tableKeysAndAttributes.addHashAndRangePrimaryKey("p_key_label", "this is unique val_1", "r_key_label", 1234); tableKeysAndAttributes.addHashAndRangePrimaryKey("p_key_label", "this is unique val_2", "r_key_label", 5678); try { outcome = dynamoDB.batchGetItem(ReturnConsumedCapacity.TOTAL, tableKeysAndAttributes); profileTableItems = outcome.getTableItems(); } catch (AmazonServiceException exception) { //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html //do-somthing } catch (AmazonClientException exception) { //do-somthing } | cs |
> [#추가 샘플코드]
> putItem이나 updateItem과 달리 다수의 테이블 아이템을 hashKey, rangedKey를 지정해서 가져올수 있지만, 결과값이 100개로 제한됨. 특정 randgedKey로 다수의 아이템 검색이 필요하면 Query가 권장되고 있음.
> 검색할 몇백개를 제한갯수에 맞춰 분할해서 BatchGetItem하면 결과로 받는 갯수상 누락이 발생하는거 확인한 상태.
② BatchWriteItem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private final String TABLE_NAME = "my_dynamoDB_table_name"; private final String TABLE_RANGED_KEY = "hashTag_or_category_key"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); Item item = null; ... ... ... TableWriteItems tableWriteItems = new TableWriteItems( TABLE_NAME ); item = new Item(); ... tableWriteItems.addItemToPut(item); ... item = new Item(); ... tableWriteItems.addItemToPut(item); try { dynamoDB.batchWriteItem(tableWriteItems); } catch (AmazonServiceException exception) { //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html //do-somthing } catch (AmazonClientException exception) { //do-somthing } | cs |
> [#샘플코드]
> putItem이나 updateItem과 달리 다수의 테이블 아이템 갱신을 한번에 가능하지만, 조건문을 걸수 없다.
③ Scan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private final String TABLE_NAME = "my_dynamoDB_table_name"; DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient()); ... ... ... Table table = dynamoDB.getTable( TABLE_NAME ); ItemCollection<ScanOutcome> tableItems = null; ScanFilter primaryKeyFilter = new ScanFilter("p_key_label").contains( "something_word" ); ScanSpec spec = new ScanSpec(); spec.setMaxResultSize( 100 ); spec.withScanFilters(primaryKeyFilter); try { tableItems = table.scan(spec); } catch (AmazonServiceException exception) { //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html //do-somthing } catch (AmazonClientException exception) { //do-somthing } | cs |
> [#Scan 예제]
④ Query
> [#Query 예제]
> rangedKey등으로 검색범위 지정해서 결과 아이템을 뽑아내는 방법은 BatchGet과 거의 유사.
3. 비교문
Comparison Operator and Function Reference - Amazon DynamoDB참조.
update조건문을 걸때,
[<>]가 [!=]와 같은 처리이고 [=]가 [==]인거 빼고는 다른 언어에서의 연산자와 같습니다.
기타. 참조문서
1) NoSQL
NoSQL이란 무엇입니까? – Amazon Web Services(AWS)
* 공개SW 기술팁 - [빅데이터] NoSQL이란 무엇인가?
2) DynamoDB
Amazon DynamoDB란 무엇입니까? - Amazon DynamoDB [#html] [#pdf]
Amazon DynamoDB 시작하기 - Amazon DynamoDB
Amazon DynamoDB - Amazon DynamoDB
Using DynamoDB with AWS Explorer — User Guide
이 개발자 안내서의 코드 샘플 실행 - Amazon DynamoDB
AWS Toolkits for Eclipse and Visual Studio Now Support DynamoDB | AWS Blog
com.amazonaws.services.dynamodbv2.document.quickstart.F_UpdateItemTest in aws-sdk-java | Insight.io
3) 기타
기타. 변경이력
일자 |
변경이력 |
2017-05-11 | 초안 |
2017-09-28 | [3. 비교문] 항목 추가 |
'📂기초 및 세팅 note > DB & NW' 카테고리의 다른 글
NoSql: MongoDB 기초 (0) | 2019.07.28 |
---|---|
Memcached&Redis(레디스) (0) | 2018.04.27 |
DB: MS-SQL, (1)설치 (0) | 2013.01.15 |
DB: 오라클 계정 비밀번호 분실 (0) | 2012.09.24 |
DB: 오라클 기초 (3) (0) | 2012.07.25 |