paust-team / paust-db

GNU General Public License v3.0
6 stars 5 forks source link

Simplify Struct Objects in Types #76

Closed elon0823 closed 5 years ago

elon0823 commented 5 years ago

이 이슈는 #41 에서 처음 시작되어...

현재 types.go 의 가독성 및 복잡한 구조 때문에 전체적인 간소화를 위해 같이 고민해봤습니다. 전체적으로 지금은 client, server 자체에서 marshal, unmarshal 할 때 간단하게 사용하는 struct 모두 types 에 정의를 해서 사용중인데, 너무 많아지기도하고 중복되고 보기도 어려운 것 같아서 최소한의 구조로 변경하도록 구조변경이 필요해 보입니다.

백문이 불여일견이므로 샘플 코드를 들고 왔습니다.


// RowKey 로 사용할 key obj struct
type KeyObj struct {
    Timestamp uint64 json:"timestamp"
    Salt uint8 json:"salt" //Timestamp 의 중복방지를 위한 rnd salt 
}

//RowKey is marshaled KeyObj
//type RowKeyType []byte

// ------------------------------------------------------

//주고 받는 데이터구조인 BaseDataObj struct. 
//Server 에선 struct 변경을 따로 하지 않고 아래와 같은 형태로만 return
//Client 에서 Write 시 BaseDataObj 형태로 만들어서 전송
// {"meta":{"rowkey":12314, "ownerkey":"1234", "qualifier":1234}, "real":{"rowkey":12314, "data":1234}}

type MetaDataObj struct {
    RowKey  []byte json:"rowKey"
    OwnerKey  []byte json:"ownerKey"
    Qualifier  []byte json:"qualifier"
}

type RealDataObj struct {
    RowKey  []byte json:"rowKey"
    Data   []byte json:"data"
}

type BaseDataObj struct {
    MetaData MetaDataObj json:"meta"
    RealData  RealDataObj json:"real"
}

// ------------------------------------------------------
// Client -> Query Request 할 때 사용하는 struct
// Server -> Client Query 를 받을 때 사용하는 struct

// Server 에서 리턴하는 구조는 위의 MetaDataObj 구조
type MetaDataQueryObj struct {
    Start uint64 json:"start"
    End   uint64 json:"end"
    OwnerKey []byte json:"ownerKey"
    Qualifier []byte json:"qualifier"   
}

// Server 에서 리턴하는 구조는 위의 RealDataObj 구조
type RealDataQueryObj struct {
    RowKeys [][]byte json:"rowKeys"
}

정리

  1. KeyObject 에 Salt 가 추가되었는데 이는 당장에 그런 case 가 없다고 가정했지만 추후에 Timestamp가 중복이 됬을 때를 위한 random seed 를 추가하기 위함입니다.

  2. 원래는 server 쪽에서 client 에서 보여질 구조로 formatting 을 해서 리턴을 하게끔 했었는데, ~서버는 불친절해야 하므로~ 이를 정형화 된 format 으로 맞춰놓고 주고 받는 것으로 바꾸는게 좋을 것 같다고 의논이 되었습니다. 크게 데이터(meta,real)를 주고받는 struct / Query 를 요청하고 파싱하는데 사용하는 struct 로 나뉜다고 생각하면 될 것 같습니다.

  3. kevin의 comment(https://github.com/paust-team/paust-db/issues/41#issuecomment-455406199) 에 보듯이

    
    # client가 server로부터 받는 실제 RRealDataResObj
    [
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "data":"YWJj"},
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMTczOTQ3NDgwMDB9", "data":"dGVzdA=="}
    ]

client에서 처리해서 console에 보여주는 Response

[ {"key":{"timestamp":1546507007394725000}, "data":"YWJj"}, {"key":{"timestamp":1546507017394748000}, "data":"dGVzdA=="} ]


부분은 

```go
# client가 server로부터 받는 실제 RealDataObj
[
    {"rowKey":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "data":"YWJj"},
    {"rowKey":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMTczOTQ3NDgwMDB9", "data":"dGVzdA=="}
]

# client에서 처리해서 console에 보여주는 Response 
[
    {"id":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "timestamp":1546507007394725000, "data":"YWJj"},
    {"id":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "timestamp":1546507007394725000, "data":"YWJj"},
]

같은 형식으로 변경되어야 합니다. client단에서는 rowkey 가 어떤 데이터로 구성되어있는지 알 필요가 없으며 timestamp 에 대한 값과 meta data 와 matching 이 되는 id(rowkey) 값만 보여 주도록 변경되는게 좋을 것 같습니다. 또한 전체적으로 # client에서 처리해서 console에 보여주는 Response 같은 부분에서 사용되는 struct 들은 client 에서만 사용되는 일회성 struct 이기 때문에 types.go 에 기술하지 않고 해당 부분에서 바로 선언해서 쓰는것이 좋을 것 같습니다.

server/client 전체적으로 method 에서 사용하는 struct param, naming 등 변경이 필요할 것 같습니다.

추가적으로 types 에 필요한 부분들은 같이 고민이 필요해 보입니다.