004 R2dbc Object Mapping

04. Object mapping #

Spring data의 object mapping #

  • 만약 지원하는 converter이 없다면 MappingR2dbcConverter는 다음 과정을 거쳐서 Row를 Entity로 변환한다.
      1. Object cretion : Row의 column들로 Object 생성
      1. Property population : direct set, setter, with..메서드 등을 이용해서 Row의 Column을 Objec에 주입 img.png

Object creation #

img_1.png

Object creation 테스트 #

  • R2dbcEntityTemplate의 select 호출시, R2dbcConverter를 사용하기 때문에 이를 이용해서 selet에 class를 넘기는 방식으로 테스트 img_2.png

PersistenceCreator constructor #

  • @PersistenceCreator 을 갖는 constructor가 존재한다면 해당 constructor를 사용
  • 여러개가 존재한다면 가장 마지막 @PersistenceCreator가 붙은 constructor를 사용
  • NoArgsConstructor, AllArgsConstructor 전부 패스 img_3.png img_4.png

NoArgs constructor #

  • @PersistenceCreator 을 갖는 constructor가 없는 경우
  • No-args constructor가 존재한다면 해당 constructor를 사용
  • 다른 constructor 전부 패스 img_5.png img_6.png

하나의 constructor #

  • 오직 하나의 constructor이 존재한다면 해당 constructor 사용 img_7.png img_8.png

2개 이상의 constructor가 있다면? #

  • @PersistenceCreator를 갖는 constructor도 없고, No-args constructor도 없다면, Exception 발생 img_9.png

생성자에 전체 필드가 없었어도, 결과를 보면 필드에 값이 들어가있었다. -> Property popultaion 동작

Property population #

  • r2dbc에서는 property가 mutable할때만 property population 적용
    1. id, name 필드를 채움
    1. property 순회하여 mutable한 경우에만 reflection을 사용해서 값 주입 (남은 필드들도 값이 생김) img_10.png img_11.png

Object mapping 최적화 #

  • 객체를 가능한한 Immutable하게
  • 모든 property를 인자로 갖는 All-args 제공
    • property polulation이 발생하지 않게되어 성능 향상
  • 코드 중복 방지를 위해 lombok 사용

Naming strategy #

  • 별도의 @Table, @Column 어노테이션이 없다면, naming strategy에 맞춰서 클래스명, 변수명을 변경해서 table과 column에 mapping
  • NamingStrategy interface를 구현하여 bean으로 등록하면 일괄 변경가능 img_12.png

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