본문 바로가기

Lang

r2dbc, DatabaseClient 첫 테스트

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();

    }
}

물론 처음 코틀린 샘플 처럼 구현하려면 자바에서도 생성자만 추가해주면 될테지만 검색해서 나온 샘플 그냥 거의 그대로 테스트해본거라 ... 그런데 이런 식으로 매핑 로직 추가 구현하지 않고 좀 더 일반적인 방식이 있을텐데 좀 더 고민(... 검색)해 봐야겠다.

건거고 요즘은 새로운 기능 샘플 소스 찾다보면 코틀린으로 구현해놓은게 점점 많아지는 듯. 보일러 플레이트한 구문들 거의 필요 없어지니 핵심만 빨리 구현해서 보여줄 수 있다는 것 때문에 그러지 않을까 싶은데 ... 코틀린 제대로 모르는 입장에서는 당장은 입맛만 쩝쩝 거릴 수 밖에 ... 이래저래 코틀린은 공부해봐야 할 듯.