tonykang22 / chat

0 stars 0 forks source link

채팅 서비스 레퍼런스 2. MongoDB #5

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

채팅 서비스 레퍼런스 2. MongoDB

개요


도입

채팅에 사용이 되나요?

image

https://tv.kakao.com/channel/3693125/cliplink/414072595



About mongoDB

특징



MongoDB: 핵심 요소



How mongodb stores data?

image



수평 확장에 용이한 MongoDB

샤딩 구성요소

image



Chunks

image

x를 shard key로 하는 chunk들이다.


image




NCP: Cloud DB for MongoDB

image



image



그외



결론

image image



References

tonykang22 commented 1 year ago

예상 비용 산출

개요



1. HWAS MySQL 사용량이라면?

image



image



2. 단일, 클러스터 비용 차이

Replica Set

image




image



image



Sharded Cluster

image



image

tonykang22 commented 1 year ago

Spring: MongoDB best practice

개요





설정

@Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class MongoConfig extends AbstractMongoClientConfiguration{

    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }

    @Override
    protected String getDatabaseName() {
        return "test";
    }

    @Override
    public MongoClient mongoClient() {
        final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
        final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
            .applyConnectionString(connectionString)
            .build();
        return MongoClients.create(mongoClientSettings);
    }
}



DB용 객체 생성

@Persistent
@Collation
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
    @AliasFor("collection")
    String value() default "";

    @AliasFor("value")
    String collection() default "";

    String language() default "";

    @AliasFor(
        annotation = Collation.class,
        attribute = "value"
    )
    String collation() default "";
}



Repository


image

JpaRepository



image

MongoRepository



Queries

@Query("{ 'name' : ?0 }")
List<User> findUsersByName(String name);


@Query("{ 'name' : { $regex: ?0 } }")
List<User> findUsersByRegexpName(String regexp);





복합키 사용

@Document
public class Ticket {
    @Id
    private TicketId id;

    private String event;

    // getters and setters
}


public class TicketId {
    private String venue;
    private String date;

    // getters and setters

    // override hashCode() and equals()
}


public interface TicketRepository extends MongoRepository<Ticket, TicketId> {
}


@Test
public void givenCompositeId_whenSearchingByIdObject_thenFound() {
    TicketId ticketId = new TicketId();
    ticketId.setDate("2020-01-01");
    ticketId.setVenue("Venue B");

    service.insert(new Ticket(ticketId, "Event B"));

    Optional<Ticket> optionalTicket = ticketRepository.findById(ticketId);

    assertThat(optionalTicket.isPresent());
    Ticket savedTicket = optionalTicket.get();

    assertEquals(savedTicket.getId(), ticketId);
}


주의 사항


{
  "id": {
    "venue":"Venue A",
    "date": "2023-05-27"
  },
  "event": "Event 1"
}


{
  "id": {
    "date": "2023-05-27",
    "venue":"Venue A"
  },
  "event": "Event 1"
}



MongoDB Reactive

@Repository
public interface AccountReactiveRepository 
  extends ReactiveMongoRepository<Account, String> { }



Reference