| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- prometheus
- grafana
- kafka
- 백엔드개발
- docker
- helm
- 동시성제어
- 성능최적화
- redis
- webflux
- 데이터베이스
- GitOps
- 백엔드
- selector
- SpringBoot
- netty
- 성능 최적화
- DevOps
- 트랜잭션
- Kotlin
- jvm
- Java
- JPA
- mysql
- NIO
- spring boot
- Kubernetes
- monitoring
- RDBMS
- CloudNative
- Today
- Total
목록webflux (9)
유성
조회수 증가는 단순히 특정 컬럼의 숫자를 하나 올리는 아주 가벼운 작업처럼 보인다.하지만 수천, 수만 명의 사용자가 동시에 "클릭"을 누르는 순간, 이 간단한 +1은 RDBMS의 문제를 발생시킨다. 왜 RDBMS만으로는 이 기능을 구현하는 것이 불가능에 가까운지, 그 내부를 뜯어보자. 1. Update 동작은 어떻게 수행되는가?우선 쉽게 접할수 있는 MySQL의 InnoDB를 기준으로 update가 어떻게 수행되는지 알아야 한다.UPDATE posts SET views = views + 1 WHERE id = 1; 위와 같은 쿼리를 실행할 때, MySQL(InnoDB) 내부에서는 개발자가 명시하지 않아도 배타적 락이 발동된다.배타적 락의 선언: "내가 이 데이터를 수정할 거니까, 내가 끝날 때까지 아무도..
Spring Data JPA를 사용하다가 R2DBC로 넘어오면 가장 먼저 마주치는 당황스러운 지점이 있다.바로 Page를 반환하는 메서드를 만들 수 없다는 것이다. 왜 R2DBC는 그 편리한 페이지네이션을 공식적으로 지원하지 않을까? 1. 근본적인 원인: DB는 'Page'라는 개념이 없다.우리가 SQL에서 사용하는 LIMIT과 OFFSET은 데이터를 끊어서 가져오는 도구일 뿐, DB 엔진 자체가 "전체 10페이지 중 1페이지" 라는 객체를 만들어 주지는 않는다.(만약 이러한 객체가 있었다면 충분히 리액티브 스타일이 가능했다) Page 객체를 만들기 위해서는 반드시 두 가지 정보가 필요하다.조회 데이터: LIMIT, OFFSET으로 잘라낸 데이터 뭉치전체 카운트: SELECT COUNT(*)로 계산한 전..
이 글에서는 WebFlux, 정확히 말하면 Netty의 이벤트 루프 스레드가 어떤 메커니즘으로 구동되고 제어되는지 그 근본적인 원리를 알아본다. 1. 이벤트 루프의 주도권은 OS 커널에 있다.당연한 이야기지만, 이벤트 루프를 깨워 일을 시키는 실질적인 주체는 OS 커널이다.사용자가 WebFlux 서버에 요청을 보냈을 때, 데이터가 네트워크 카드에서 이벤트 루프까지 도달하는 과정을 시간 순서대로 살펴보자. 데이터 유입과 소켓 디스크립터의 생성먼저 사용자의 요청은 패킷에 담겨 네트워크를 통해 서버의 네트워크 카드(NIC)에 도달한다.이때 NIC와 CPU(커널)는 협력하여 이 전기 신호를 정리하고 조합하여 '소켓 디스크립터(Socket Descriptor)'를 생성한다. 소켓 디스크립터란? 연결 정보(IP, ..
글을 쓰기 앞서 지연로딩과 파이프라인에 대해서 알아야 하므로 필요하면 아래 글을 참고하자.https://youseong.tistory.com/97 Java Stream API의 핵심 개념과 병렬 처리의 함정Java 8에 도입된 Stream API는 반복문 위주의 명령형 코드를 선언형 스타일로 바꾸고,더 나아가 병렬 처리를 손쉽게 구현할 수 있도록 도와주는 강력한 도구입니다. 이 글에서는 기본적인 사용법은youseong.tistory.com 1. WebFlux 코딩은 "로직의 조립" 이다WebFlux 코드를 처음 접하면 "왜 바로 실행되지 않지?" 라는 의문이 든다.그 이유는 코드가 실행되는것은 맞으나, WebFlux 관점에서는 조립이라는 개념으로 등장하기 때문이다. 예를 들어 코드를 하나 보자.@GetM..
R2DBC와 Mono를 사용하면서 기본적인 CRUD를 만들어보며 경험했던 것들 중 경험한 것들에 대해서 설명한다.아마 새롭게 Webflux를 도입하면 비슷한 문제들과 새로운 경험을 할 수 있을것이다.1. WebFlux, 왜 쓰는 걸까?전통적인 Spring MVC는 Thread-per-request 모델로, 요청이 오면 스레드 하나를 할당하고, DB응답이 올 때까지 그 스레드는 아무것도 못 하고 기다린다. 반면 WebFlux는 적은 수의 스레드로 수많은 요청을 처리하는 이벤트 루프 방식이다. 기다리는 시간 동안 스레드가 다른 일을 할 수 있게 해주는 것이 핵심이다. 이번 글에서는 가장 기초적인 R2DBC를 활용한 비동기 CRUD를 살펴보자. 2. 의존성 설정 (R2DBC)WebFlux를 쓰면서 가장 복잡한..
지난 몇 년간 Java 생태계는 성능을 위해 비즈니스 로직을 Mono, FLux 같은 껍데기 속에 가두어 왔다.전통적인 Java 방식은 Blocking I/O 모델을 기반으로 하기 때문이고 이를 보완하기 위해 Event Loop 형식의 Netty, 이것을 활용할 수 있는 Webflux 등이 생겨나게 되었다.물론 I/O 성능을 획기적으로 개선시켜왔으나, Blocking이 발생하는 부분에 대해서 '워커 스레드 사용' 또는 맞춤형 라이브러리를 사용해야 하는것과 기술 부채를 발생시킬 여지가 숙제로 남아있다. 하지만 자바 21에서 정식 도입된 가상 스레드는 이러한 구조를 바꾸어놓았다.이 글에서는 가상 스레드가 어떻게 "가상화" 라고 불리는지, 그리고 정말로 리액티브 스택을 대체할 수 있는지 그 내부를 해부해 보고..