Reactive MongoDB Document
#
Document
#
- MongoCollection에 query를 실행하여 bson의 Document를 반환
- bson의 Document : Map<String, Object>를 구현하고 내부에 LinkedHashMap을 저장하여 Map 메서드 override
Document 예제
#
- collection에서 findAll query를 실행
- 결과를 subscribe하여 onNext로 출력
- 모든 결과를 찾은 후, onComplete 이벤트로 종료
MongoDB BSON 인코딩
#
- 첫 줄은 전체 document의 크기를 가리킨다
- 데이터타입, 필드명, 길이(데이터 타입에 따라 optional), 값으로 구성
BSON Codec
#
- bson 라이브러리는 Codec을 제공
- Codec을 통해서 특정 java type이 주어졌을때 어떻게 encode, docode 해야할지 지정
Default codec
#
- MongoClientSettings에서 Default codec을 제공
- Java 자체 클래스와 관련된 codec들
- IterableCodecProvider: Iterable 클래스 지원
- MapCodecProvider: Map 클래스 지원
- ValueCodecProvider: Java에서 제공하는 클래스 지원
- Jsr310CodecProvider: Instant, LocalDate, LocalDateTime 등 Date, Time 관련 클래스 지원
- EnumCodecProvider: Enum 지원
- Jep395RecordCodecProvider: Record 지원
- Bson과 관련된 codec들
- BsonValueCodecProvider: Bson 타입들을 java로 1대1 맵핑한 클래스 지원
- DBRefCodecProvider: DBRef 지원
- DBObjectCodecProvider: DBObject 지원
- DocumentCodecProvider: Document 지원
- GeoJsonCodecProvider: Geometry, LineString, MultiPoint, Point, Polygon 등의 geojson 지원
- GridFSFileCodecProvider: GridFSFile 지원
- JsonObjectCodecProvider: JsonObject 지원
BsonValueCodecProvider
#
- Bson 타입들과 1 대 1 매칭
- BsonNull, BsonUndefined
- BsonBinary
- BsonBoolean
- BsonDateTime, BsonTimestamp
- BsonDBPointer
- BsonDouble, BsonInt32, BsonInt64, BsonDecimal128
- BsonMinKey, BsonMaxKey
- BsonJavaScript
- BsonObjectId
- BsonRegularExpression
- BsonString, BsonSymbol
ValueCodecProvider
#
- Java 타입들을 지원
- Binary (byte[]), Byte, ByteArray (byte[])
- Boolean, AtomicBoolean
- Date
- Short, Float, Double, Integer, Long, Decimal128, BigDecimal, AtomicInteger, AtomicLong
- MinKey, MaxKey
- Code (javascript code)
- ObjectId
- Pattern
- Character, String, Symbol
Codec 예제 - StringCodec
#
- String을 binary로 encode
- 만약 변환 대상이 Bson.STRING 라면 그대로 write
- 만약 변환 대상이 Bson.OBJECT_ID 라면 ObjectId로 변환해서 write
- binary를 String으로 decode
- 만약 Bson.STRING 에서 String 으로 변환하는 경우 readString 혹은 readSymbol
- 만약 Bson.OBJECT_ID 에서 String으로 변환하는 경우 readObjectId 후 hexString으로 변환
PojoCodec
#
- 주어진 POJO (Plain old java object)를 bson으로 bson을 POJO로 자동 변환하는 Codec
- PojoCodec은 기본으로 추가되지 않으므로 별도로 추가 필요
PojoCodec 등록
#
- PojoCodecProvider builder를 이용하여 automatic을 true로 제공
- automatic을 true로 제공해야만 pojo 변환을 지원
- getCollection의 2번째 인자로 PersonDocument 제공
- Document 대신 PersonDocument로 find
Custom Codec
#
- Codec 인터페이스를 직접 구현
- reader의 readObjectId, readString 등을 사용하면 하나의 필드를 읽고 java 클래스로 mapping
- 만약 encode 되어있는 필드 순서와 read하는 순서가 다르면 exception 발생 가능
- 이를 위해 readName을 호출하여 필드 이름을 파악한 후 해당 필드 이름과 매칭되는 readXX 메소드 호출도 가능
Custom Codec 등록
#
- fromCodecs를 이용하여 custom codec을 CodecRegistry로 변형
- 해당 CodecRegistry를 fromRegistries로 settings에 등록