회사에서 필요해서 사용한 후기를 간단하게 적어둡니다.
불편했던 점
1. 사용시에 .proto 파일이 변경되면 빌드가 필요했습니다.
2. Map 같은 구조가 아니기 때문에 여러개 필요하다면, DataStore 객체를 만들어 낼 때, FileName 을 변경하여 처리했습니다.(물론 같은 이름으로 동시에 열수 없도록 처리되어 있습니다)
장점
1. 사용하기가 편합니다.
2. 빌드 이후 Generate 되는 코드를 보며 코드를 작성하면 되서 큰 어려움이 없었습니다.
아래와 같은 데이터 형식을 저장한다고 하면
val foodStores = listOf<FoodStore>(FoodStore(....), FoodStore(....), FoodStore(....) ....)
data class FoodStore(
val name: String,
val mainFood: Food,
var otherFoods: List<Food>,
val allFoodSize: Int,
)
data class Food(var name: String, var amount: Float)
아래와 같이 간단하게 변경하여 사용할 수 있습니다.
syntax = "proto3";
option java_package = "com.proto.example";
option java_multiple_files = true;
message FoodStores {
repeated FoodStore packet = 1;
}
message FoodStore {
string name = 1;
Food mainFood = 2;
Foods otherFoods = 3;
int32 pointSize = 4;
}
message Foods {
repeated Food packet = 1;
}
message Food {
string name = 1;
float amount = 2;
}
리스트와 같은 자료형을 사용하실 때는 repeated 와 packet 을 지정해주면 됩니다.
저장할 때는 빌드이후 만들어진 객체에서 newBuilder 메서드를 사용하여 원하는대로 추가할 수 있습니다.
List 의 경우(FoodStores, Foods) addAllPacket 으로 간편하게 처리할 수 있습니다.
그리고 각 message 안에 선언한 변수들에 대해서 setter 가 생성되어 있습니다.
예시)
Food.newBuilder().setName("치킨").setAmount(20000).build()
Foods.newBuilder().addAllPacket(
listOf(
Food.newBuilder().setName("치킨").setAmount(20000).build(),
Food.newBuilder().setName("피자").setAmount(25000).build(),
Food.newBuilder().setName("햄버거").setAmount(10000).build()
).asIterable()
)
로드하는 쪽에서는 flow 를 사용하여 packetList 를 반환해줍니다.
// 계속 해서 데이터를 받는다면
foodStoreRepository.foodStoreFlow.collect {
// it.packetList.something()..
}
// 한번만 받고싶다면
foodStoreRepository.foodStoreFlow.onEach {
// it.packetList.something()..
}.singleOrNull()
// 처럼 사용하시면 됩니다.
'Android > Development Tips' 카테고리의 다른 글
Domain 모듈에서 Paging, Room(RemoteMediator) 라이브러리 의존성 해결하기 (0) | 2022.09.30 |
---|---|
2.4.1 이상 버전에서 Navigation Component 사용할 때 주의점 (0) | 2022.02.23 |
알고 계시나요 Fragment 가 복원되는 시점? (1) | 2021.12.12 |
BroadcastReceiver 사용할 때 유의점 (0) | 2021.12.12 |
Coil 썸네일 구현하기 (0) | 2021.11.23 |