ec2 1개로 채팅+소모임+판매 기능을 제공하는 서버애플리케이션을 구현 해야함.
스프링 리액티브와 MongoDB를 활용해서 비동기적으로 처리해서 많은 양의 채팅 데이터처리(Transactions per Second=TPS)가 가능한 애플리케이션을 만드려고함.
동기 : 요청을 하고 응답을 받고 동작
비동기 : 요청을 하고 응답을 받지 않고 다음 동작을 동작
비동기는 요청에 대한 응답을 받지 않고 다음 동작이 가능하므로 복잡해 보일 수 있으나 MongoDB로 전성된 결과가 반환될 때까지 대기하지 않아도 되므로 해당 스레드가 다른 작업이 가능하다.
비동기 방식의 이점:

출처 : https://learnjs.vlpt.us/async/

DAOImpl과 MongoDB는 비동기적으로 데이터를 처리하지만, Spring MVC는 동기적으로 동작하므로 비동기 데이터 처리의 이점을 살리지 못하고 요청이 동기적으로 처리된다.
따라서, DAOImpl과 MongoDB만 비동기적으로 처리한다고 될 문제는 아니다.
애플리케이션 전체에서 비동기적 프로세스를 고려해야 한다.
Spring MVC는 요청을 처리할 때 스레드를 블로킹하는 방식으로 동작하고, WebFlux는 논블로킹 방식입니다. 이 두 방식이 혼합되면, 블로킹 방식과 논블로킹 방식 간의 전환에서 성능 저하가 발생할 수 있습니다.
동기 비동기간 전환을 최소화하고 비동기 처리와 동기 처리를 명확히 분리하면서 비동기 컨트롤러로 요청 처리 전환할 경우 고려해 볼 수 있지만 간단한 프로젝트에서 너무 많은 복잡성이 증가하는 것 같아서 채택하지 않기로 했다.
동기로직 안에서 비동기 로직을 사용해도 결국에 동기적으로 처리 되므로 애플리케이션 자체를 비동기적으로 동작하도록 만들어야 한다.
따로 서버를 빼서 WebFlux, MVC 각각 처리하도록 분리하거나 함께 사용하더라도 명확하게 분리해서 사용하자.