블로킹과 논블로킹, 동기와 비동기 - 2

yeolyeol·2023년 6월 12일
0

til

목록 보기
5/8
post-thumbnail

블로킹과 논블로킹, 동기와 비동기 - 1에서 이어진다.


Spring

Blocking/Sync로 동작하는 Spring MVC와 Non-Blocking/Async로 동작하는 Spring WebFlux를 다루기 전에 Spring에 대해 간단히 알아보자.

Spring Framework란?

전 포스트에서 프레임워크와 라이브러리에 대해 정리한 것이 있다. 그 포스트에서 Java기반의 프레임워크로 Spring을 언급한 적이 있다.

그렇다면, Spring Framework는 무엇일까?

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션

여기서, 엔터프라이즈급 개발이란 직역하면 기업을 대상으로 하는 개발이라는 말이다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 환경이라 부른다.

Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리한다. 객체의 생성 및 소멸 그리고 라이프 사이클을 관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있다.

Spring Framework의 구조

Spring_Framework의 구조

그림처럼 Spring Framework는 다양한 구조를 가지고 있다.
다른 요소는 나중에 다뤄보도록 하고, 이번 포스트에서는 Spring MVC만 다뤄보겠다.

MVC에 대한 내용은 Spring MVC에서 확인할 수 있다.

Spring MVC
Spring에서는 MVC에서는 Model2 구조로 Apllication을 만들 수 있도록 지원한다. MVC (Model-View-Controller) 프레임 워크는 웹 응용 프로그램을 작성하기위한 완전한 기능을 갖춘 MVC를 구현한다.


Spring MVC

Spring MVC는 Blocking + Synchronous로 동작한다.

그래서 다음과 같은 특징들이 존재한다.

특징

  • 사용자 요청마다 스레드를 계속 생성한다.
    • 이러한 문제를 해결하기 위해 스레드풀(Thread Pool)을 생성해서 관리한다.
  • 많은 사용자가 동시에 요청하면 이를 처리하지 못하는 문제가 발생한다.
    • 이를 Thread Pool Hell이라고 부른다.
  • Thread Pool Hell을 해결하기 위해 시스템의 트래픽을 측정해서 Thread Pool Size를 적절하게 조정한다.

즉, 사용자마다 요청이 들어오면 각 스레드를 생성해서 처리한다는 점이 핵심이다. 그리고 이러한 점을 봤을 때 Blocking + Synchronous로 동작한다는 것을 알 수 있다.

하지만, 특징에서 알 수 있듯이 Spring MVC는 사용자가 많아지면 그만큼의 요청을 받아내는데에 한계가 있다. 그리고 이를 해결해 줄 수 있는 방법으로 Spring WebFlux가 나왔다.


Spring WebFlux

Spring WebFlux는 Non-Blocking + Asynchronous로 동작한다.

간단한 특징을 알아보자

특징

  • Reactive Progmramming : 반응형 프로그래밍이다.
  • Event Loop (이벤트 루프에 대해서는 Event Loop에서 더 자세히 알 수 있다.)
  • 모든 코드가 Non-Blocking으로 동작해야만 의미가 있다.

Spring WebFlux는 요청이 발생할 경우 그것에 맞는 핸들러에게 처리를 위임하고, 처리가 완료되면 Callback 메서드를 통해 응답한다. 그렇기 때문에 수많은 요청에도 요청에 대한 응답을 Event Loop를 통해 효율적으로 동작할 수 있다.

WebFlux를 왜 사용할까?

앞의 특징을 살펴보면, 트래픽이 많은 서비스에서 사용하는 것이 바람직하다고 알 수 있다.

실제로 우아한 형제들의 배달의 민족 기술 블로그(배달의 민족 기술 블로그)를 보면 가게 노출 시스템에 WebFlux를 도입한 것을 알 수 있다. 가게 노출 시스템은 배달의 민족 앱 내에서 가장 많은 트래픽을 소화해야하는 시스템이었기 때문이다.

  1. 하나의 사용자 요청을 처리하기 위해 수십여개의 외부 시스템에 대한 요청이 필요한 시스템에서 어떻게 가장 빠른 응답을 줄 수 있을까?
  2. 수많은 요청을 처리해야할 때 어떻게 쓰레드 지옥을 벗어날 수 있을까?

이런 고민들이 생활화 되어 있는 사람이 괴물 프로그래머가 되는 것 같다.

그래서 우아한 형제들에서 WebFlux를 도입하기 시작했고 다음과 같은 성능을 확인할 수 있었다.
요청 수에 대한 쓰레드 수

하지만, WebFlux를 사용한다고 무조건 성능이 좋아지는 것이 아니다. 모든 로직이 Async/Non-Blocking으로 구현되어야 한다.


참고

Event Loop

WebFlux란 무엇인가?

배달의민족 최전방 시스템! ‘가게노출 시스템’을 소개합니다.

profile
한 걸음씩 꾸준히

0개의 댓글