inblog logo
|
p4rksk
    reactive-web

    Reactvie-web

    박선규's avatar
    박선규
    Jul 27, 2026
    Reactvie-web
    Contents
    reactive-web

    reactive-web

    📖
    비동기와 논블로킹 방식으로 처리하되는 백엔드 웹 스택이다.

    비동기 + 논블로킹

    📖
    비동기는 하나의 일을 진행할때에 끝날 때까지 아무겄도 못하는게 아니라 일을 시켜 놓고 또 바로 다음일을 진행을 하는 동시에 일처리를 할 수있는방식을의미한다.
    논블로킹은 먼저 요청한 일이 요청되자마자 제어권을 호출자에게 넘겨줘 호출자가 먼저 요청한일 외에 다른일을 처리 할 수 있는것을 의미한다.
    두개의 차이점은 비동기: 결과 확인 시점, 논블로킹: 제어권
    • 논블로킹: 점원이 주문을 받자마자 진동벨(제어권)을 내 손에 쥐여줍니다. (내가 멈춰있지 않고 자리에 앉아서 폰을 볼 수 있음)
    • 비동기: 커피가 완성되었을 때 점원이 "커피 나왔습니다!"(알림) 하고 부를 때까지 내가 커피 만드는 과정을 계속 지켜보고 있지 않습니다.
     

    Netty 서버

    📖
    동작 방식: 요청이 10,000개가 들어와도 CPU 코어 수 수준의 적은 쓰레드(보통 코어 수 x 2개)만 생성해서 돌린다.
     

    Event Loop 쓰레드 모델

    📖
    [이벤트 루프 (Event Loop Thread)]
    • 단일/소수 쓰레드가 큐를 돌면서 이벤트를 하나씩 처리
    • DB나 외부 네트워크 호출이 필요하면? ➔ "결과 나오면 알려줘!" 하고 이벤트를 등록한 뒤 기다리지 않고 바로 다음 요청 처리하러 이동!
     

    WebFlux 프레임워크

    📖
    구분
    Mono<T>
    Flux<T>
    데이터 개수
    0개 또는 1개 (단건)
    0개 ~ N개 (다건 / 무한 스트림)
    비유
    선물 상자 1개 (안에 물건이 1개 있거나 없음)
    데이터가 계속 흘러나오는 수도꼭지/컨베이어 벨트
    주요 사용 예시
    유저 단건 조회, 단건 수정/삭제 응답
    목록 조회, SSE 실시간 알림, 센서 데이터 스트리밍
    @RestController public class UserController { // 1. 단건 조회: Mono 반환 @GetMapping("/users/{id}") public Mono<User> getUser(@PathVariable String id) { // 스레드는 멈추지 않고 즉시 Mono(약속)를 반환함! return userService.findById(id); } // 2. 실시간 스트리밍(SSE): Flux 반환 @GetMapping(value = "/stream/messages", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<Message> streamMessages() { // 메시지가 생길 때마다 연결된 브라우저로 계속 쏴줌! return messageService.getMessageStream(); } } 이렇게 있다고 가정할 때에 A 스레드가 getUser 메서드가 끝날때까지 다른 일을처리 못하는게 아닌 DB에 조회 요청하는 일을 이벤트로 등록을 해놓고 곧 바로 streamMessages 메서드에 실시간으로 들어오는 메시지들을 화면에 보내는 일을한다. 그러다 이벤트로 등록해놓은 조회가 끝나면 놀고있는 스레드가 결과 데이터를 챙겨서 A 유저의 HTTP 응답으로 쏴준다
     

    I/O

    • 네트워크 I/O (Network I/O):
      • Input: 클라이언트(브라우저, 앱)가 보낸 HTTP 요청을 서버가 받음, DB가 반환한 데이터를 서버가 받음
      • Output: 서버가 클라이언트에 응답 데이터를 보냄, 서버가 DB나 외부 API로 쿼리/요청을 보냄
    • 파일/디스크 I/O (File/Disk I/O):
      • Input: 하드디스크(SSD)에 저장된 파일이나 로깅 데이터를 읽어옴
      • Output: 서버가 파일이나 로그를 디스크에 저장함
    • DB I/O:
      • 사실상 네트워크/디스크 I/O의 연장선으로, DB에 SQL 쿼리를 날리고 결과를 가져오는 모든 과정
     

    CDC(Change Data Capture)

    📖
    데이터의 변경 사항을 감지해서 추출하는 기술이다. DB에 어떤 테이블에 데이터가 insert, update delete 되면 순간 실시간 이벤트로 낚아채 다른 시스템 (Web Flux)로 전달해주는것을 기술이다.
    방식: DB는 데이터가 바뀔 때마다 복구용으로 '트랜잭션 로그(MySQL의 Binlog, PostgreSQL의 WAL)'라는 일기장을 쓴다. CDC 도구(예: Debezium, Kafka Connect)는 DB를 괴롭히지 않고 이 일기장만 몰래 실시간으로 읽어온다.
    MongoDB는 Change Streams(체인지 스트림)이라는 자체적인 실시간 이벤트 감지 기능을 내장하고 있다
     
    장점: 계속 서버가 계속 주기적으로 쿼리를 날려 바뀐게 있는지 체크하지 않고변경사항이 있을 때 서버로 알려주니까 서버 부하가 엄청 준다.

    SSE(Server-Sent Events)

    📖
    서버가 클라이언트(브라우저)에게 이벤트를 일방적으로 보낸다
    핵심 특징: 서버 ➔ 클라이언트 방향의 단방향(Unidirectional) 스트리밍
    작동 원리:
    1. 클라이언트가 서버에 "나 실시간 구독할게!" 하고 HTTP 요청을 한 번 보냅니다.
    1. 서버는 이 연결을 끊지 않고 계속 유지합니다.
    1. 이후 서버에 새 데이터가 생길 때마다 연결된 빨대를 통해 브라우저로 데이터를 톡-톡- 밀어넣어 줍니다(Push).
    notion image
    위 보라색 박스가 SSE 방식으로 되게끔 만드는거다
     
    Share article
    Contents
    reactive-web

    p4rksk

    RSS·Powered by Inblog