본문 바로가기
개발 지식/Backend

[WebFlux] WebFlux Kotlin MapStruct 적용

by 에르주 2022. 5. 10.
반응형

entity(document) -> DTO 로 변환시  mapStruct를 자주 활용한다.

WebFlux kotlin 환경에서는 다음과 같은 설정으로 활용할 수 있다.

// build.gradle.kts
implementation("org.mapstruct:mapstruct:1.5.0.RC1")
kapt("org.mapstruct:mapstruct-processor:1.5.0.RC1")



plugins {
...
    kotlin("kapt") version "1.6.21"
...
}

 

 

mapper 인터페이스에서 toBaseDto 함수를 선언하였다 .  BaseDocument -> BaseDTO로 변경할 것이다.

// Mapper 인터페이스
import reactor.core.publisher.Flux

@Mapper
interface BaseMapper {
//    fun toDto(baseDocumentMono : Flux<BaseDocument>) : Flux<BaseDTO>
    fun toBaseDto(baseDocument : BaseDocument) : BaseDTO
}

// Document(Entity)
@Document(value = "testCollection")
class BaseDocument(

    @Id
    val id: Any?,
    val baseId: String,
    val baseName: String,
    var baseNumber: String

)

// DTO 22.05.24 수정 -> kotlin은 해당 lombok 설정 필요 없이 사용 가능
// @Getter
// @Setter
// @RequiredArgsConstructor
class BaseDTO (

    val baseId: String?,
    val baseName: String?,
    val baseNumber: String?
)

 

mapper 인터페이스를 build 하면 인터페이스가 구현된 다음과 같은 클래스가 생성된다.

package com.er.kotlintoy.mapper;

import com.er.kotlintoy.document.BaseDocument;
import com.er.kotlintoy.dto.BaseDTO;
import javax.annotation.processing.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-05-09T03:18:50+0900",
    comments = "version: 1.5.0.RC1, compiler: IncrementalProcessingEnvironment from kotlin-annotation-processing-gradle-1.6.21.jar, environment: Java 11.0.15 (Amazon.com Inc.)"
)
public class BaseMapperImpl implements BaseMapper {

    @Override
    public BaseDTO toBaseDto(BaseDocument baseDocument) {
        if ( baseDocument == null ) {
            return null;
        }

        String baseId = null;
        String baseName = null;
        String baseNumber = null;

        baseId = baseDocument.getBaseId();
        baseName = baseDocument.getBaseName();
        baseNumber = baseDocument.getBaseNumber();

        BaseDTO baseDTO = new BaseDTO( baseId, baseName, baseNumber );

        return baseDTO;
    }
}

 

 

mongoDB를 조회하여 가져온 값은 Flux<BaseDocument> 형태로 반환되는데 이를 Flux<BaseDTO>로 변경하고자 하였다.

@GrpcService
class BaseGrpcServerService(var baseRepository: BaseRepository) : BaseProtoServiceGrpcKt.BaseProtoServiceCoroutineImplBase() {


    override suspend fun retrieveBaseOnDB(request: BaseRequest): BaseResponse {

        val converter = Mappers.getMapper(BaseMapper::class.java) // or PersonConverterImpl()
        val getBaseDocument = baseRepository.findByBaseId(request.baseId)
        var baseDTO = getBaseDocument.map(converter::toBaseDto)

        return BaseResponse.newBuilder()
            .setBaseId(withContext(Dispatchers.IO) {
                baseDTO.blockFirst()
            }?.baseId)
            .setBaseName(withContext(Dispatchers.IO) {
                baseDTO.blockFirst()
            }?.baseName)
            .setBaseNumber(withContext(Dispatchers.IO) {
                baseDTO.blockFirst()
            }?.baseNumber)
            .build()
    }
}

 

 

정상적으로 데이터를 확인 할 수 있다.

dto 확인

 

끝.

반응형

댓글