Spring Boot
리액티브 프로그래밍
stophyeon
2024. 1. 15. 18:21
728x90
리액티브란
리액티브 프로그래밍은 비동기적인 데이터 처리를 통해 더 높은 성능과 효율성을 제공하는 프로그래밍입니다.
리액티브 프로그래밍의 특징으로는
1. 선언형 프로그래밍
2. 비동기적
3. 논 블로킹
동기 VS 비동기
동기란 순서가 보장되는 것을 의미합니다. 비동기는 반대로 순서가 보장되지 않는다는 것입니다.
에를 들어 Client들이 순차적으로 요청을 보냈을 때 Client중 첫번째로 요청을한 Client가 가장 빨리 응답을 받는 것이
동기이고, 요청 처리에 시간에따라 세번째, 네번째와 같은 순서로 응답이 오는 것이 비동기입니다.
블로킹 VS 논 블로킹
블로킹이란 하나의 작업이 끝나기 전까지 기다리는 것이고, 논 블로킹은 하나의 작업의 결과를 기다리지 않고
다른 작업을 하는것을 의미합니다.
예를 들어 앞에서 처리중인 요청이 끝나지 않은 상태에서 요청이 들어온다면 해당 요청은 처리중인 요청의 결과가
나올 때까지 기다리다가 처리하는 것이 블로킹, 처리중인 요청의 결과를 기다리지 않고 요청이 들어온 순간 처리를
시작하는 것이 논 블로킹입니다.
동기&블로킹 VS 비동기&논 블로킹
그렇다면 동기와 블로킹 그리고 비동기와 논 블로킹은 같은 의미인것 같습니다.
같은 의미이긴 하지만 주체의 차이가 있습니다.
동기,비동기는 작업의 순서를 블로킹, 논 블로킹은 제어권을 주체로하는 것이 다르고 동작방식을 같습니다.
예를 들어 식당에 갔을 때 직원이 한명이라면 손님에게 주문을 받은 뒤에 요리를 만들고 서빙을 해야합니다.
또한, 다른 손님이 왔을 때 앞에서 받은 주문을 처리해야 한 뒤에 다른 손님의 요청을 처리합니다.
직원이 한명인 식당이라면 이 작업의 순서와 손님이 온 순서로 처리하는 것이 절대적입니다.
하지만 만약 직원이 여러명이고 동시에 주문을 받고, 요리를 만들고, 서빙을 하는 것이 가능하고 먼저온 손님의 주문이
완전히 끝나지 않은 상태에서도 다른 손님의 주문을 처리하는 것이 가능합니다.
또한 만약 메뉴가 하나인 음식점이라면 주문을 처리하는 순서가 없습니다.
여기서 주문을 받고, 요리를 만들고, 서빙을 하는것이 동기와 비동기의 주체인 작업의 순서이고
주문을 받을 때까지 음식을 만들 수 없는 것이 블로킹과 논블로킹의 주체인 제어권입니다.
Spring WebFlux의 필요성
spring에서는 @Async를 통해 비동기를 지원하지만 이것만으로는 리액티브 프로그래밍을 지원할 수 없습니다.
Spring MVC는 사용자의 요청이 들어올때마다 Thread를 생성해서 처리합니다.
하지만 사용자의 요청이 서버의 성능을 넘어가게 된다면 요청이 블로킹되어 버립니다.
이런 문제점을 개선하기 위해서 WebFlux는 비동기를 지원합니다.
Client가 요청을 하고 서버가 요청을 받은 뒤 DB에서 데이터를 꺼내고 서버가 데이터를 받은 뒤
Client에게 응답을 하는 것이 일반적인 요청에서 응답까지의 과정입니다.
하지만 DB에서 Data를 꺼내오는 시간이 길어질수록 서버가 대기하고 있는 시간도 길어집니다.
이러한 비효율성을 해결하기 위해서 DB에게 서버가 어느 정도 걸릴지를 물어보고 어느 정도 걸릴지를 Client에게
알려주는 것으로 서버는 다른 요청들을 처리할 수 있게 됩니다.
대신, 서버는 Client의 요청을 기억하고 있어야 합니다. 이렇게 요청을 기억하는 것을 이벤트 루프라고 합니다.
사용자의 요청이 많아지는 것으로 인한 성능 저하를 줄이기 위한 해결책으로 나온것이 WebFlux입니다.