객체지향 프로그래밍을 할 때 DTO(Data Trasnport Object)와 VO(Value Object) 그리고 Entity를 다루는데, 이때 각각의 객체로 형변환 하는 Mapping 과정이 필요하다. Kotlin에서는 apply 확장 함수를 통해 그나마 조금 더 쉽게 할 수 있지만 역시 map struct가 근본임을 부정할 수 없다.
* 컴파일 시점에 체크
* 속도 빠르다
* 간단하다
문제는 그동안 써온 java, kotlin이 아닌 protobuf를 변환할 때 일어난다.
protobuf에는 `repeated` 라는 키워드가 있는데 list 같은 자료구조를 표현하기 위해 사용된다.
repeated string을 compile시에 ProtocolStringList로 변환된다. 하지만 kotlin에서는 protocolStringList를 List<String>으로 인식하지 못하여 제대로 매핑이 되지 않는다. 그래서 하나하나 매핑해주거나 https://github.com/entur/mapstruct-spi-protobuf 요 라이브러리를 사용해야 한다.
implementation"org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor"org.mapstruct:mapstruct-processor:${mapstructVersion}"
annotationProcessor"no.entur.mapstruct.spi:protobuf-spi-impl:LATEST.VERSION"
@Mapper(
componentModel = "spring",
uses = [LocalDateTimeConverter::class],
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // null 값 체크
collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // Protobuf repeated 와 List 매핑 위함
)
그리고 이런식으로 ADDER_PREFERRED 설정을 해야한다.
근데 변환하려고 하니 무조건 repeated 설정한 변수 네이밍에 -List가 붙는다. 그래서 만약 dto의 변수명이 events 라면 target에 이렇게 해줘야한다.
@Mapping(source = "events", target = "eventsList") // proto에 repeated 쓰면 자동으로 suffinx로 -List가 붙음
fun toProto(dto: Dto): ProtobufResponse
'Back-end' 카테고리의 다른 글
Nest.js에 대한 개인적인 생각 (7) | 2024.10.26 |
---|---|
실시간 게시글 추천 초간단 구현 (0) | 2024.10.23 |
[Redis] 나야 조회수 (3) | 2024.10.15 |
[Redis] Redis 데이터 저장 근데 protobuf를 곁들인 (3) | 2024.10.14 |
[gRPC] Armeria + gRPC 띄워보기 (7) | 2024.10.07 |