Spring에서의 동기와 비동기
동기식
- 테스트 코드 짜기가 굉장히 수월합니다.
- 아마 대부분의 트래픽이 많지 않은 상황에서는 동기식으로 개발을 할 것 같습니다.
- 디버깅도 쉽습니다.
- 익숙하기 때문에, 대부분의 개발자들이 바로 작업하기가 좋습니다.
- 서블릿 api와 서블릿 컨테이너를 위해서 개발 되었습니다.
비동기식
@Async
라던지 유명한게 좀 있지만 저는 Spring-Webflux
에 대하여 이야기를 해보려고 합니다. (사실, 제가 궁금했습니다..)
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ----------> |<------C--------->|
그래서 Spring-Webflux 는 ..?
- 비동기 + 논블록킹 i/o
- 적은 쓰레드로 동시 처리를 제어하고, 적은 하드웨어 리소스로 좋은 효율을 내기 위해서 논블로킹 웹 기술이 필요했습니다.
- 스프링 mvc, webflux 모두 annotated controller 를 사용할 수 있습니다. 그렇지만 mvc에서는 어플리케이션 처리중인 쓰레드가 잠시 중단 될수 있습니다.
- 주된 장점은 사실 처리 시간의 단축이라기 보다는, 적은 리소스로 좋은 효율을 내는 것과 강한 부하 속에서도 어플리케이션의 복원 능력이다.
- Node.js처럼 이벤트 루프가 돈다. 즉, 리액티브 프로그래밍이 가능하다.
- Webflux + R2DBC
- RDB 에 직접 Access 해야하는 일이 많을때 쓰기좋다.
- 그렇지만 아직 제대로 지원하고 있는 데이터베이스가 적다 현재 (4개정도가 정상적으로 지원되는듯하다.)
- Webflux + Nosql( Redis, MongoDB, …)
- 꽤 많은 Nosql이 지원하고 있습니다.
- 위에서 동시성이 높기 때문에, 같은 리소스로 더 좋은 성능을 내기 좋습니다.
