002 Mongodb Document

Reactive MongoDB Document #

Document #

  • MongoCollection에 query를 실행하여 bson의 Document를 반환
  • bson의 Document : Map<String, Object>를 구현하고 내부에 LinkedHashMap을 저장하여 Map 메서드 override img.png

Document 예제 #

  1. collection에서 findAll query를 실행
  2. 결과를 subscribe하여 onNext로 출력
  3. 모든 결과를 찾은 후, onComplete 이벤트로 종료 img_1.png img_2.png

MongoDB BSON 인코딩 #

  1. 첫 줄은 전체 document의 크기를 가리킨다
  2. 데이터타입, 필드명, 길이(데이터 타입에 따라 optional), 값으로 구성 img_3.png

BSON Codec #

  • bson 라이브러리는 Codec을 제공
  • Codec을 통해서 특정 java type이 주어졌을때 어떻게 encode, docode 해야할지 지정 img_4.png

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 지원 img_5.png

BsonValueCodecProvider #

  • Bson 타입들과 1 대 1 매칭
    • BsonNull, BsonUndefined
    • BsonBinary
    • BsonBoolean
    • BsonDateTime, BsonTimestamp
    • BsonDBPointer
    • BsonDouble, BsonInt32, BsonInt64, BsonDecimal128
    • BsonMinKey, BsonMaxKey
    • BsonJavaScript
    • BsonObjectId
    • BsonRegularExpression
    • BsonString, BsonSymbol img_6.png

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 img_7.png

Codec 예제 - StringCodec #

  1. String을 binary로 encode
  • 만약 변환 대상이 Bson.STRING 라면 그대로 write
  • 만약 변환 대상이 Bson.OBJECT_ID 라면 ObjectId로 변환해서 write img_8.png
  1. binary를 String으로 decode
  • 만약 Bson.STRING 에서 String 으로 변환하는 경우 readString 혹은 readSymbol
  • 만약 Bson.OBJECT_ID 에서 String으로 변환하는 경우 readObjectId 후 hexString으로 변환 img_9.png

PojoCodec #

  • 주어진 POJO (Plain old java object)를 bson으로 bson을 POJO로 자동 변환하는 Codec
  • PojoCodec은 기본으로 추가되지 않으므로 별도로 추가 필요 img_10.png

PojoCodec 등록 #

  • PojoCodecProvider builder를 이용하여 automatic을 true로 제공
    • automatic을 true로 제공해야만 pojo 변환을 지원
  • getCollection의 2번째 인자로 PersonDocument 제공
  • Document 대신 PersonDocument로 find img_11.png img_12.png

Custom Codec #

  • Codec 인터페이스를 직접 구현
  • reader의 readObjectId, readString 등을 사용하면 하나의 필드를 읽고 java 클래스로 mapping
    • 만약 encode 되어있는 필드 순서와 read하는 순서가 다르면 exception 발생 가능
    • 이를 위해 readName을 호출하여 필드 이름을 파악한 후 해당 필드 이름과 매칭되는 readXX 메소드 호출도 가능 img_13.png

Custom Codec 등록 #

  • fromCodecs를 이용하여 custom codec을 CodecRegistry로 변형
  • 해당 CodecRegistry를 fromRegistries로 settings에 등록 img_14.png img_15.png

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