현재 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"
}
정리
KeyObject 에 Salt 가 추가되었는데 이는 당장에 그런 case 가 없다고 가정했지만 추후에 Timestamp가 중복이 됬을 때를 위한 random seed 를 추가하기 위함입니다.
원래는 server 쪽에서 client 에서 보여질 구조로 formatting 을 해서 리턴을 하게끔 했었는데,
~서버는 불친절해야 하므로~ 이를 정형화 된 format 으로 맞춰놓고 주고 받는 것으로 바꾸는게 좋을 것 같다고 의논이 되었습니다. 크게 데이터(meta,real)를 주고받는 struct / Query 를 요청하고 파싱하는데 사용하는 struct 로 나뉜다고 생각하면 될 것 같습니다.
부분은
```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 등 변경이 필요할 것 같습니다.
이 이슈는 #41 에서 처음 시작되어...
현재 types.go 의 가독성 및 복잡한 구조 때문에 전체적인 간소화를 위해 같이 고민해봤습니다. 전체적으로 지금은 client, server 자체에서 marshal, unmarshal 할 때 간단하게 사용하는 struct 모두 types 에 정의를 해서 사용중인데, 너무 많아지기도하고 중복되고 보기도 어려운 것 같아서 최소한의 구조로 변경하도록 구조변경이 필요해 보입니다.
정리
KeyObject 에 Salt 가 추가되었는데 이는 당장에 그런 case 가 없다고 가정했지만 추후에 Timestamp가 중복이 됬을 때를 위한 random seed 를 추가하기 위함입니다.
원래는 server 쪽에서 client 에서 보여질 구조로 formatting 을 해서 리턴을 하게끔 했었는데, ~서버는 불친절해야 하므로~ 이를 정형화 된 format 으로 맞춰놓고 주고 받는 것으로 바꾸는게 좋을 것 같다고 의논이 되었습니다. 크게 데이터(meta,real)를 주고받는 struct / Query 를 요청하고 파싱하는데 사용하는 struct 로 나뉜다고 생각하면 될 것 같습니다.
kevin의 comment(https://github.com/paust-team/paust-db/issues/41#issuecomment-455406199) 에 보듯이
client에서 처리해서 console에 보여주는 Response
[ {"key":{"timestamp":1546507007394725000}, "data":"YWJj"}, {"key":{"timestamp":1546507017394748000}, "data":"dGVzdA=="} ]
같은 형식으로 변경되어야 합니다. client단에서는 rowkey 가 어떤 데이터로 구성되어있는지 알 필요가 없으며 timestamp 에 대한 값과 meta data 와 matching 이 되는 id(rowkey) 값만 보여 주도록 변경되는게 좋을 것 같습니다. 또한 전체적으로
# client에서 처리해서 console에 보여주는 Response
같은 부분에서 사용되는 struct 들은 client 에서만 사용되는 일회성 struct 이기 때문에 types.go 에 기술하지 않고 해당 부분에서 바로 선언해서 쓰는것이 좋을 것 같습니다.server/client 전체적으로 method 에서 사용하는 struct param, naming 등 변경이 필요할 것 같습니다.
추가적으로 types 에 필요한 부분들은 같이 고민이 필요해 보입니다.