
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) 스트리밍
작동 원리:
- 클라이언트가 서버에 "나 실시간 구독할게!" 하고 HTTP 요청을 한 번 보냅니다.
- 서버는 이 연결을 끊지 않고 계속 유지합니다.
- 이후 서버에 새 데이터가 생길 때마다 연결된 빨대를 통해 브라우저로 데이터를 톡-톡- 밀어넣어 줍니다(Push).

위 보라색 박스가 SSE 방식으로 되게끔 만드는거다
Share article