-->

객체지향 프로그래밍을 할 때 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

 

+ Recent posts