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에 주입
Object creation
#
- 다음 순서로 체크하여 해당하는 알고리즘으로 Document를 Object로 변환
- @PersistenceCreator 어노테이션을 갖는 constructor가 있다면 해당 constructor 사용
- 인자가 없는 constructor가 있다면 해당 constructor 사용
- constructor가 정확히 하나 있다면 해당 constructor 사용
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 메소드 호출
- 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