005 R2dbc Metadata Mapping

05. Metadata mapping #

Entity 클래스에 어노테이션을 추가 #

  • @Id: primary key에 해당하는 필드에 적용
  • @Table: entity class에 적용. Table 이름을 변경 가능
  • @Transient: 기본적으로 모든 필드는 mapping 대상. @Transient가 붙은 필드는 mapping 에서 제외
  • @Column: entity의 property 필드에 적용. @Column이 붙은 필드에 대해서는 convention 기반 대신 Column에 주어진 name으로 적용
  • @Version: 낙관적 잠금 (Optimistic Lock)에 이용. entity가 update 될때마다 자동으로 update
  • @PersistenceConstructor: 특정 constructor에 대해서 Object creation할 때 사용하게끔 지정. constructor의 argument 이름에 따라서 mapping

Metadata mapping 예제 #

  • @Id : id 필드 지정
  • @Column(“name”) : fullName 필드에 row의 name 필드와 mapping
  • @Transient : score 필드를 mapping 대상에서 제외
  • @PersistenceCreator : id, fullName, age, gender를 인자로 받는 생성자 설정
  • @Version : version 필드 설정 img.png

Metadata mapping 실행 #

  • update 수행 후, version 1 증가
  • update된 결과에서 score를 20으로 변경
    • 데이터베이스에는 반영되지 않지만 변경된 score를 두번째 update된 결과에 포함 img_1.png img_2.png

Metadata mapping 실패 #

  • version을 강제로 1 증가시킨다. (마치, 다른 쓰레드가 증가시킨것처럼)
  • OptimisticLockingFailureException 발생 img_3.png img_4.png

어떻게 property mapping에서 MySQL 타입을 java 타입으로 바꿀 수 있나? #

property mapping 타입 변환 #

  • Row로부터 get을 통해서 특정 Java 클래스로 변환 img_5.png

MySqlRow #

  • Row의 구현체인 MySqlRow는 Codecs를 포함
    • 해당 codecs를 이용하여 column의 정보, 값을 전달하고 type을 갖는 객체를 반환
      • FieldValue: column의 실제 값에 해당하는 ByteBuf 혹은 List 포함
      • MySqlColumnDescriptor: MySqlType, column name, nullable, size 등의 column meta 정보 포함 img_6.png

MySQL DefaultCodecs #

  • MySQL defaultCodecs에는 기본적으로 codec들을 포함
  • 각각의 codec은 canDecode, decode를 구현
    • canDecode : columnMetadata를 기반으로 target(특정 java 타입)으로 변경 가능한지 여부 반환
    • decode : 주어진 column의 value를 특정 타입의 객체로 반환 img_7.png

Codec 예제 - IntegerCodec #

  • canPrimitiveDecode 메소드에서 주어진 column이 numeric 타입인지 체크
  • 아래의 MySQL 타입인 경우 true
    • DECIMAL
    • TINYINT, TINYINT_UNSIGNED
    • SMALLINT, SMALLINT_UNSIGNED
    • INT, INT_UNSIGNED
    • FLOAT
    • DOUBLE
    • BIGINT, BIGINT_UNSIGNED
    • MEDIUMINT, MEDIUMINT_UNSIGNED
    • YEAR
  • decodeInt에서 MySQL 타입에 따라서 int로 변환 img_8.png

MySQL DefaultCodecs 지원 #

  • 기본적으로 26개의 Codec 지원
    • Byte, Short, Integer, Long, BigInteger
    • BigDecimal, Float, Double
    • Boolean, BitSet
    • ZonedDatetTime, LocalDateTime, Instant, OffsetDateTime
    • LocalDate
    • LocalTime, Duration, OffsetTime
    • Year
    • String
    • Enum
    • Set
    • Clob, Blob
    • ByteBuffer, ByteArray img_9.png img_10.png

  1. 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_