문제

  • r2dbc는 orm이 아니다.
  • 몇몇 타입들은 custom converter가 있어야 data mapping이 된다. 참고

해결

    @Bean
    public R2dbcCustomConversions customConversions() {
        List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(new UUIDToByteArrayConverter());
        converters.add(new ByteArrayToUUIDConverter());
        return R2dbcCustomConversions.of(MySqlDialect.INSTANCE, converters);
    }

    @WritingConverter
    public class UUIDToByteArrayConverter implements Converter<UUID, byte[]> {
        @Override
        public byte[] convert(UUID source) {
            ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
            bb.putLong(source.getMostSignificantBits());
            bb.putLong(source.getLeastSignificantBits());
            return bb.array();
        }
    }

    @ReadingConverter
    public class ByteArrayToUUIDConverter implements Converter<byte[], UUID> {
        @Override
        public UUID convert(byte[] source) {
            return UUIDUtil.uuid(source);
        }
    }

이런식으로 converter를 등록하고 사용할 수 있다.

public Config extends AbstractR2dbcConfiguration  {
    @Override
    protected List<Object> getCustomConverters() {
        return List.of(new UUIDToByteArrayConverter(), new ByteArrayToUUIDConverter());
    }

    @Override
    public ConnectionFactory connectionFactory() {
        return null;
    }
}

이와 같이 AbstractR2dbcConfiguration를 상속하여도 가능하나 위와 같이 ConnectionFactory도 구현해야 한다.