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
- @Id : id 필드 지정
- @Column(“name”) : fullName 필드에 row의 name 필드와 mapping
- @Transient : score 필드를 mapping 대상에서 제외
- @PersistenceCreator : id, fullName, age, gender를 인자로 받는 생성자 설정
- @Version : version 필드 설정
- update 수행 후, version 1 증가
- update된 결과에서 score를 20으로 변경
- 데이터베이스에는 반영되지 않지만 변경된 score를 두번째 update된 결과에 포함
- version을 강제로 1 증가시킨다. (마치, 다른 쓰레드가 증가시킨것처럼)
- OptimisticLockingFailureException 발생
어떻게 property mapping에서 MySQL 타입을 java 타입으로 바꿀 수 있나?
#
property mapping 타입 변환
#
- Row로부터 get을 통해서 특정 Java 클래스로 변환
MySqlRow
#
- Row의 구현체인 MySqlRow는 Codecs를 포함
- 해당 codecs를 이용하여 column의 정보, 값을 전달하고 type을 갖는 객체를 반환
- FieldValue: column의 실제 값에 해당하는 ByteBuf 혹은 List 포함
- MySqlColumnDescriptor: MySqlType, column name, nullable, size 등의 column meta 정보 포함
MySQL DefaultCodecs
#
- MySQL defaultCodecs에는 기본적으로 codec들을 포함
- 각각의 codec은 canDecode, decode를 구현
- canDecode : columnMetadata를 기반으로 target(특정 java 타입)으로 변경 가능한지 여부 반환
- decode : 주어진 column의 value를 특정 타입의 객체로 반환
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로 변환
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