전체 글(96)
-
[Kotlin] 코루틴으로 외부 API 병렬 호출 (Dispatchers.IO+MDCContext)
이번 글에서는 코루틴을 활용해서 API를 병렬로 호출함으로써 스레드를 절약해 성능을 개선하고, 코루틴을 사용함에 따른 로그 개선 필요성을 MDCContext로 해결한 과정에 대해서 공유 하려고 합니다. 왜 코루틴으로 외부 API를 병렬 호출하면 성능이 개선되는가? 외부 API를 호출하는 방식을 기존의 전통적인 방식 (Spring MVC의 동기 방식)과 코루틴을 활용해서 병렬로 호출하는 방식의 차이는 크게 두 가지 개선점을 갖습니다. 1. 하드웨어 자원 효율 극대화 (스레드 절약) 전통적인 방식에서는 API 3개를 호출하면, 호출자가 결과를 받을 때까지 스레드는 아무것도 못하고 기다려야하는데 이를 "Blocking"이라고 합니다. 기존 (Thread-per-request): 100개의 요청이 오면 10..
2026.04.22 -
[Spring Boot] OSIV(Open Session In View)
이번 글에서는 Spring Boot OSIV의 개념에 대해서 학습한 내용을 공유해보려고 합니다. 다만 OSIV의 개념을 알기 위해서 부가적으로(부가적이라고 포함했지만, 사실은 매우 중요한 개념들) 알아야 하는 내용들도 중간중간 언급하고 갈 예정임으로 설명이 중구난방이라고 생각이 드실 수도 있습니다. OSIV(Open Session In View)OSIV는 'Open Session In View'의 약자 입니다. 그런데 'OSIV'에 대한 설명을 검색하면 다음과 같이 설명하는 것을 확인할 수 있습니다.OSIV는 HTTP 요청 전체 생명주기 동안 영속성 컨텍스트(Persistence Context)와 데이터베이스 커넥션을 열어두는 패턴입니다. 그래서 저는 궁금했습니다. OSIV는 뷰 안에서 세션을 열어놓는다..
2026.04.13 -
[Spring Boot] Transaction Proxy, Self-Invocation 문제
이번글은 지금껏 당연하게 써왔던 @Transactional 어노테이션이 동작하는지에 대해서 실습을 통해서 이해해보려고 합니다. 결론부터 말하면 Spring에서 @Transactional 어노테이션을 선언하면 Spring은 해당 빈(Bean)을 직접 실행하는 대신 프록시 객체를 앞에 내세웁니다. 프록시 생성: Spring 컨테이너는 트랜잭션이 적용된 클래스에 대해 프록시 객체를 생성하여 빈으로 등록합니다. 호출 가로채기 (Intercept): 클라이언트가 메서드를 호출하면 실제 객체가 아닌 프록시의 메서드가 호출됩니다. 부가 기능 수행 (Transaction Advisor): 프록시는 실제 로직 실행 전에 Transaction Manager를 통해 트랜잭션을 시작합니다(begin). ..
2026.04.09 -
Choreography 전략 - OpenTelemetry, Jaeger를 활용한 분산 추적
마이크로서비스 아키텍처(MSA)는 기존의 모놀리식 구조가 가진 비즈니스 확장성의 한계를 극복하기 위해서 현대의 백엔드 생태계에서는 MSA가 선택이 아닌 필수가 되어가고 있습니다. 하지만 서비스를 분리하는 것보다 어려운것은 '분리된 서비스들을 어떻게 유기적으로 연결하고 관리할 것인가' 인것 같습니다. 서비스가 1~2개 수준이아니라 더 많은 수의 서비스로 분리되는데 적절한 관리 체계가 구축되어있지 않다면 오히려 유지보수 비용이 증가할것 이라고 생각합니다. 그래서 이번 글에서는 MSA에서 서비스간 통신 모델과 분산 추적 실습에 대해서 학습한 내용을 공유해보려고 합니다. Orchestration vs ChoreographyMSA 설계에서 중요한건 서비스 간의 통신 모델을 결정하는 것입니다. 이 선택은 시스템의..
2026.04.02 -
PostgreSQL MVCC: 덮어쓰지 않는 데이터베이스가 동시성을 제어하는 법
이번 글에서는 사내에서 높은 신뢰성과 확장성, 그리고 강력한 데이터 무결성을 위해 널리 채택하고 있는 PostgreSQL에 대해 학습한 내용을 공유하고자 합니다. 특히 PostgreSQL의 핵심 메커니즘 중 하나인 MVCC(Multi-Version Concurrency Control)의 동작 원리를 깊이 있게 파악하는 데 초점을 맞추었습니다1. PostgreSQL의 특징PostgreSQL는 다른 RDBMS와 비교했을 때 가장 큰 장점은 '타협하지 않는 엄격함'입니다. 이와 관련된 여러가지 특징이 있습니다. 향상된 체크 제약 조건(Check Constraints): not null 뿐만아니라 아주 복잡한 조건을 DB 레벨에서 강제할 수 있습니다. 예를 들어 "재고 수량은 반드시 0보다 커야 하며, 입고일은..
2026.03.31 -
[Java] 비동기 프로그래밍: Future에서 Virtual Threads까지
Future (Java 5) — 비동기의 시작, 블로킹의 모순자바에서는 new Thread(task).start()를 통해 비동기 실행을 할 수 있습니다. 다만, 요청마다 스레드를 새로 만들게 되면 스레드의 생성/소멸 비용이 매번 발생하고, 스레드가 무한정 늘어나서 결국에는 서버가 터질 수 있습니다. 그래서 자바에서는 Executor 클래스를 통해 스레드의 수를 제한하고 재사용함으로써 이문제를 해결합니다. ExecutorService executor = Executors.newFixedThreadPool(10);// 스레드 10개짜리 풀 생성 — 이 10개를 돌려쓰겠다는 선언Future future = executor.submit(() -> { Thread.sleep(2000); return..
2026.03.25