r2dbc 가 제공하는 녀석 중에 DatabaseClient 란게 있다는 걸 알게 되었는데 검색해서 처음 나온 샘플이 kotlin 으로 된 거라 재미 삼아 기존 자바 프로젝트에 쑤셔 넣어봤다.
@RestController
class MessageController (val dataBaseClient: DatabaseClient) {
@GetMapping("/machs")
fun get() = dataBaseClient.sql("select * from evt_mach")
.map { t, u -> EvtMachRes(t.get("MACH_ID", String::class.java)!!, t.get("MACH_TP_CD", String::class.java)!!) }
.all()
}
@JsonIgnoreProperties(ignoreUnknown = true)
class EvtMachRes(val machId: String, val machTpCd: String) {
}
뭐냐 이거 그냥 되네? 코틀린 쓰고 싶게 하네 거참 ㅎ
코틀린 샘플을 자바로는 어떻게 구현해야 하나 좀 헤매다가 또다른 샘플 보고 간단히 구현해 봤다.
기존 엔티티에 간단하게 lombok 의 @builder 애노테이션 추가하고 아래처럼.
@RestController
public class MsgController {
@Autowired
private DatabaseClient databaseClient;
public static final BiFunction<Row, RowMetadata, EvtMach> MAPPING_FUNCTION = (row, rowMetaData) -> EvtMach.builder()
.machId(row.get("MACH_ID", String.class))
.machTpCd(row.get("MACH_TP_CD", String.class))
.build();
@GetMapping("/emachs")
public Flux<EvtMach> findByTitleContains() {
return databaseClient
.sql("SELECT * FROM evt_mach")
.map(MAPPING_FUNCTION)
.all();
}
}
물론 처음 코틀린 샘플 처럼 구현하려면 자바에서도 생성자만 추가해주면 될테지만 검색해서 나온 샘플 그냥 거의 그대로 테스트해본거라 ... 그런데 이런 식으로 매핑 로직 추가 구현하지 않고 좀 더 일반적인 방식이 있을텐데 좀 더 고민(... 검색)해 봐야겠다.
건거고 요즘은 새로운 기능 샘플 소스 찾다보면 코틀린으로 구현해놓은게 점점 많아지는 듯. 보일러 플레이트한 구문들 거의 필요 없어지니 핵심만 빨리 구현해서 보여줄 수 있다는 것 때문에 그러지 않을까 싶은데 ... 코틀린 제대로 모르는 입장에서는 당장은 입맛만 쩝쩝 거릴 수 밖에 ... 이래저래 코틀린은 공부해봐야 할 듯.
'Lang' 카테고리의 다른 글
[Julia]첫 공부는 이런 식으로 어떨런지 (0) | 2021.09.27 |
---|---|
[julia]Decimal to Binary conversion (0) | 2021.09.23 |
[Python, Rust]ConnectorX - load data from DBs in the fastest and most memory efficient way. (0) | 2021.08.31 |
[Java]r2dbc 첫 테스트 (0) | 2021.07.09 |
[Java]spring-cloud-stream mqtt binder (0) | 2021.07.08 |