| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 데이터베이스
- mysql
- 성능 최적화
- spring boot
- helm
- grafana
- GitOps
- webflux
- RDBMS
- 백엔드개발
- jvm
- netty
- 성능최적화
- NIO
- redis
- docker
- 동시성제어
- 트랜잭션
- monitoring
- kafka
- Kubernetes
- JPA
- CloudNative
- selector
- 백엔드
- DevOps
- prometheus
- Java
- SpringBoot
- Kotlin
- Today
- Total
목록Spring (11)
유성
서버 운영 중에는 서버가 요청을 처리할 수 있는 여력이 있음에도, 의도적으로 요청을 차단해야 하는 순간이 있다.이는 특정 서비스의 문제가 전체 시스템으로 번지는 '장애 전파'를 막가 위한 필수적인 선택이다. 1. 왜 요청을 차단해야 할까? (장애 전파의 위험성)다음과 같은 서비스 구조를 가정해보자.A 서비스: 사용자 요청을 직접 받는 게이트웨이 역할 (리소스 풍부)B 서비스: 비즈니스 로직 처리 및 DB와 연결된 서비스DB: 현재 리소스 과부하 상태정상적인 요청 흐름: 사용자 -> A 서비스 -> B 서비스 -> DB 장애 발생 시나리오:DB 부하 발생: DB응답이 느려진다.B 서비스 병목: B 서비스는 DB응답을 기다리다 설정된 타임아웃(Timeout)에 걸리거나, 커넥션 풀이 고갈된다.A 서비스 장애..
R2DBC와 Mono를 사용하면서 기본적인 CRUD를 만들어보며 경험했던 것들 중 경험한 것들에 대해서 설명한다.아마 새롭게 Webflux를 도입하면 비슷한 문제들과 새로운 경험을 할 수 있을것이다.1. WebFlux, 왜 쓰는 걸까?전통적인 Spring MVC는 Thread-per-request 모델로, 요청이 오면 스레드 하나를 할당하고, DB응답이 올 때까지 그 스레드는 아무것도 못 하고 기다린다. 반면 WebFlux는 적은 수의 스레드로 수많은 요청을 처리하는 이벤트 루프 방식이다. 기다리는 시간 동안 스레드가 다른 일을 할 수 있게 해주는 것이 핵심이다. 이번 글에서는 가장 기초적인 R2DBC를 활용한 비동기 CRUD를 살펴보자. 2. 의존성 설정 (R2DBC)WebFlux를 쓰면서 가장 복잡한..
백엔드 개발을 하다 보면 한 번쯤은 마주하게 되는 에러가 있다. "Stream closed" 혹은 "Required request body is missing".분명 요청은 정상적으로 보냈는데, 정작 컨트롤러에 도달하면 바디(Body)가 증발해 버리는 현상이다. 이 현상은 OkHttp3의 ResponseBody를 처리할 때나, 필터에서 로깅을 시도할 때 자주 발생한다. 도대체 무엇이 우리의 데이터를 중간에 가로챈 것일까?1. 범인 찾기: InputStream의 일회성HttpServletRequest의 getInputStream()은 데이터를 스트림 방식으로 읽어온다.스트림은 말 그대로 '흐르는 물'과 같아서, 한 번 읽기 시작하면 포인터가 데이터의 끝(EOF)으로 이동한다.일반적인 서블릿 환경에서 이 포..
이 글은 Netty + WebFlux가 작동하는 방식에 대한 기본 개념들을 설명합니다. Netty + WebFlux의 특징을 보면 적은 리소스로 많은 사용자의 동시 요청을 받을 수 있고,I/O 작업이 많은 경우 더 효율적입니다. Spring WebFlux는 "비동기", "논블로킹", "리액티브 스트림" 이라는 용어로 소개되지만, 처음 접할때는 다소 복잡하게 느껴질 수 있습니다. 그런데 WebFlux의 구조는 아래 개념만 알고있으면 사실 크게 복잡하지 않습니다.이벤트 루프지연 평가구독-발행 이벤트 루프이벤트 루프는 하나의 스레드가 반복적으로 이벤트를 감지하고, 이를 순차적으로 처리하는 실행 모델입니다 Java 개발자가 이해하기 쉽도록 코드로 표현하면 아래 코드와 같습니다.void eventWorker() ..
이전부터 작성하고 싶었던 주제였습니다. @Transactional 같은 AOP를 사용할 때 종종 발생하는 문제 중 하나는"어노테이션을 붙였는데 값이 업데이트되지 않지? AOP가 작동하지 않지?" 같은 상황입니다.코드상으로도 문제없어 보이고 에러도 나지 않지만, 기능이 제대로 작동하지 않을 때가 있죠. 다음 예제 코드에서 그 문제를 확인해 보겠습니다.updateUserWithLogging() 메서드를 호출하면 로그는 정상적으로 출력되지만,user 객체의 업데이트가 이루어지지 않는 문제가 있습니다. 여기서 @Transactional이 적용되어 있으므로 TransactionManager가 실행되어야 합니다. 그러나 UserController에서 updateUserWithLogging() 메서드를 호출할 경우 ..
Spring 프레임워크의 핵심 기능 중 하나는 의존성 주입(DI, Dependency Injection)입니다. DI는 객체 간의 결합을 줄이고 코드의 유연성과 확장성을 높이는 설계 방식으로, 스프링에서는 이를 통해 객체 간의 관계를 간단하게 설정할 수 있습니다. 1. 의존성 주입(DI)란?의존성 주입(DI)이란 객체가 사용할 의존성을 외부에서 주입해주는 설계 패턴입니다. 전통적인 객체 지향 프로그래밍에서는 객체 내부에서 필요한 의존성을 직접 생성하거나 설정합니다. 하지만 DI를 사용하면 외부에서 필요한 의존성을 전달받아 객체가 스스로 관리할 필요 없이 주어진 의존성만 사용할 수 있게 됩니다. 예시public class OrderService { private final PaymentService ..