반응형
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()
}
}
정상적으로 데이터를 확인 할 수 있다.
끝.
반응형
'개발 지식 > Backend' 카테고리의 다른 글
[Redis] All keys must map to the same slot for MSETNX command (0) | 2023.11.17 |
---|---|
[Cache] Ehcache vs Caffeine Cache (4) | 2022.09.07 |
[RPC] gRPC 프레임 워크 적용기 (3) | 2022.05.09 |
[Log] Apache Log4j2 취약점 발견 및 원인 (0) | 2021.12.13 |
[JWT] JSON Web Token? (0) | 2021.10.14 |
댓글