004 Object Mapping

Object mapping #

Spring data의 object mapping #

  • 만약 지원하는 converter가 없다면 MappingMongoConverter는 다음 과정을 거쳐서 Document를 entity로 변환
  • Object creation
    • constructor, factory method 등을 이용해서 Document의 field들로 Object 생성
  • Property population
    • setter, with.. 메소드 등을 이용해서 Document의 field를 Object에 주입 img.png

Object creation #

  • 다음 순서로 체크하여 해당하는 알고리즘으로 Document를 Object로 변환
  1. @PersistenceCreator 어노테이션을 갖는 constructor가 있다면 해당 constructor 사용
  2. 인자가 없는 constructor가 있다면 해당 constructor 사용
  3. constructor가 정확히 하나 있다면 해당 constructor 사용 img_1.png

id mapping #

  • mongodb에서 모든 document는 _id를 필요
  • MappingMongoConverter는 다음의 방법으로 _id를 감지
    • @Id가 붙어있는 필드
    • 필드명이 id이고 @Field를 통해서 별도의 이름이 부여되지 않은 경우
  • id 필드가 제공되지 않는 경우, 자동으로 추가

Property population #

  • r2dbc에서는 property가 mutable할때만 property population 적용이 가능했지만, mongodb에서는 with 메소드 지원
  • No-args constructor를 호출하여 텅 빈 객체를 만들고, gender를 제외한 나머지 필드는 reflection으로 진행
  • gender는 withGender 메소드 호출 img_2.png img_3.png

Metadata Mapping #

  • Entity 클래스에 annotation을 추가하여 데이터베이스와 관련된 설정들을 주입
    • @Id: _id에 해당하는 필드에 적용
    • @Document: entity class에 적용. Collection 이름을 변경 가능
    • @DBRef: mongodb의 DBRef 형태로 저장해야 하는 필드
    • @Indexed: 필드에 대해서 인덱스를 생성. 기본적으론 자동 생성이 비활성화이므로 별도로 설정 필요
    • @CompoundIndex: 클래스에 적용. 여러 필드로 구성된 복합 인덱스 제공
    • @TextIndexed: 필드에 text index를 적용
    • @HashIndexed: 필드에 hash index를 적용
    • @Transient: 기본적으로 모든 필드는 mapping 대상. @Transient가 붙은 필드는 mapping에서 제외.
    • @Field: entity의 property 필드에 적용. @Field가 붙은 필드에 대해서는 convention 기반 대신 Field에 주어진 name으로 적용
    • @Version: 낙관적 잠금 (Optimistic Lock)에 이용. entity가 update 될때마다 자동으로 update
    • @PersistenceConstructor: 특정 constructor에 대해서 Object creation할 때 사용하게끔 지정. constructor의 argument 이름에 따라서 mapping

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