Pingu
영차영차! Backend
46
BULLMQ Delayed Job 톺아보기
BULLMQ Delayed Job 톺아보기
2026.02.06
9

BullMQ의 delayed job이 실제로 어떻게 동작하는지 궁금하셨나요? Polling 방식일까요? 아니면 다른 방식일까요? 이 글에서는 BullMQ의 소스코드를 직접 분석하여 delayed job이 event-driven 방식으로 동작하며, Redis의 BZPOPMIN blocking primitive를 사용한다는 것을 확인합니다. TypeScript 코드가 어떻게 컴파일되고 실행되는지, Redis와 어떻게 통신하는지까지 깊이 파고 들어봅니다.

BullMQ
Delayed Job
Redis
Event-driven
BZPOPMIN
Lua Script
TypeScript
Node.js
Job Queue
Kotlin JDSL 마이그레이션과 Fetch Join을 통한 N+1 문제 해결
2026.02.02
8

Native Query를 Kotlin JDSL로 마이그레이션하면서 확장 함수 패턴을 도입했습니다. 일반 join을 fetchJoin으로 변경하여 N+1 쿼리 문제를 해결하고, 데이터베이스 레벨에서 직접 집계 연산을 수행하여 쿼리 성능을 개선했습니다. Kotlin JDSL의 타입 안전성과 확장 함수 패턴을 활용하여 유지보수성을 크게 향상시켰습니다.

Kotlin JDSL
JPA
N+1 쿼리
Fetch Join
성능 최적화
Spring Boot
Kotlin
확장 함수
N+1 쿼리 최적화와 Connection Pool 튜닝으로 해결한 Connection Timeout 문제
N+1 쿼리 최적화와 Connection Pool 튜닝으로 해결한 Connection Timeout 문제
2026.02.01
8

HikariCP 대시보드에서 Connection Timeout이 27회 발생하는 문제를 발견했습니다. 원인은 N+1 쿼리 문제와 작은 Connection Pool 크기였습니다. 배치 조회로 N+1 쿼리를 해결하고 Connection Pool 크기를 5에서 20으로 증가시켜 Timeout을 0으로 만들었습니다. 쿼리 수는 161개에서 3개로 98% 감소했습니다.

N+1 쿼리
Connection Pool
HikariCP
성능 최적화
Spring Boot
Kotlin
JPA
배치 조회
Spec-Driven Development로 개발 효율 2배 높이기
Spec-Driven Development로 개발 효율 2배 높이기
2026.02.01
9

단순 CRUD 개발은 이제 AI도 혼자 할 수 있는 시대입니다. 하지만 복잡한 비즈니스 로직이 필요한 경우, 요구사항이 명확해질 때까지 AI와 대화하여 비즈니스 요구사항을 정의한 후 개발을 시작하는 것이 중요합니다. s-class 프로젝트에 GitHub Spec-Kit 방법론을 도입하여 개발 효율과 정확도를 크게 향상시킨 실전 경험을 공유합니다.

Spec-Driven Development
Spec-Kit
GitHub Spec-Kit
OpenAPI
Contract Testing
명세 우선 개발
Kotlin
Spring Boot
마이크로서비스
DDoS 공격을 겪고 나서 알게 된 모니터링의 가치
DDoS 공격을 겪고 나서 알게 된 모니터링의 가치
2026.02.01
7

DDoS 공격을 겪고 나서 알게 된 모니터링의 가치. 실제 운영 환경에서 발생한 문제 상황을 바탕으로, Spring Boot에 Prometheus + Grafana 모니터링을 구축하는 과정을 스토리텔링 형식으로 공유합니다.

Prometheus
Spring Boot
모니터링
Observability
Micrometer
Grafana
Kotlin
마이크로서비스에서 Common Package를 도입하게 된 계기와 경험
마이크로서비스에서 Common Package를 도입하게 된 계기와 경험
2026.01.30
8

Multi-Repo 구조의 마이크로서비스에서 코드 중복 문제를 해결하기 위해 Common Package를 도입한 경험을 공유합니다. Mono-Repo vs Multi-Repo 고민, Common Package 설계 원칙, GitHub Packages 배포, 그리고 실제 적용 과정에서 얻은 교훈을 담았습니다.

마이크로서비스
Common Package
Multi-Repo
GitHub Packages
Kotlin
Spring Boot
코드 중복
공통 라이브러리
console.log는 어떻게 동작할까?
console.log는 어떻게 동작할까?
2026.01.28
5

console.log가 어떻게 동작하는지 Node.js 소스 코드 레벨에서 완전히 파헤쳐본다. JavaScript 레벨의 console.log 구현부터 포맷팅, Stream 쓰기, C++ 바인딩, libuv까지 전체 실행 흐름을 실제 소스 코드와 함께 단계별로 분석한다. 각 단계에서 어떤 코드가 실행되는지, 왜 그렇게 구현되었는지를 깊이 있게 다룬다.

nodejs
console.log
internal
source-code
logging-series
console.log 성능 측정과 최적화: 실제 서버에서의 부하 분석
2026.01.28
5

console.log의 성능을 실제로 측정하고 분석한다. 다양한 시나리오에서의 성능 테스트 결과를 바탕으로 병목 지점을 파악하고, 실제 서버 환경에서의 부하 테스트를 수행한다. 그리고 프로덕션 환경에서 사용할 수 있는 최적화 방안들을 제시한다.

nodejs
console.log
performance
optimization
logging-series
Pino는 어떻게 구현되어 있을까? 내부 코드와 실제 벤치마크 분석
Pino는 어떻게 구현되어 있을까? 내부 코드와 실제 벤치마크 분석
2026.01.28
6

Pino는 프로덕션 환경에서 널리 사용되는 고성능 로깅 라이브러리다. 이 글에서는 Pino의 실제 소스 코드를 분석하고, 실제 벤치마크 결과를 통해 언제, 왜 Pino가 유리한지 파헤쳐본다. JSON 직렬화 최적화, 비동기 로깅, SonicBoom을 통한 고속 쓰기, 그리고 실제 I/O 환경에서의 성능 차이를 실제 코드와 벤치마크 결과와 함께 살펴본다.

nodejs
pino
logging
performance
internal
logging-series
헥사고날 아키텍처로 비즈니스 로직 보호하기: s-class 프로젝트 실전 사례
헥사고날 아키텍처로 비즈니스 로직 보호하기: s-class 프로젝트 실전 사례
2026.01.26
6

마이크로서비스 환경에서 비즈니스 로직을 외부 의존성으로부터 보호하기 위해 헥사고날 아키텍처를 적용했습니다. Domain, Application, Adapter 계층으로 명확히 분리하고, Port와 Adapter 패턴으로 유연한 구조를 만든 실전 사례를 공유합니다.

헥사고날 아키텍처
hexagonal architecture
포트 앤 어댑터
클린 아키텍처
Kotlin
Spring Boot
팩토리 패턴으로 알림 채널 확장하기: Notification Service 실전 사례
팩토리 패턴으로 알림 채널 확장하기: Notification Service 실전 사례
2026.01.26
7

여러 알림 채널(이메일, 카카오톡, Discord)을 지원하는 Notification Service에서 팩토리 패턴을 적용한 실전 사례입니다. 채널별로 다른 구현을 가진 Provider들을 Factory를 통해 동적으로 선택하여 확장하기 쉽고 유지보수하기 좋은 구조를 만든 과정을 공유합니다.

팩토리 패턴
factory pattern
전략 패턴
strategy pattern
알림 시스템
Kotlin
Spring Boot
Saga 패턴으로 분산 트랜잭션 처리하기: Payment Service 실전 사례
Saga 패턴으로 분산 트랜잭션 처리하기: Payment Service 실전 사례
2026.01.26
6

마이크로서비스 환경에서 여러 서비스를 거치는 결제 프로세스를 Saga 패턴으로 구현했습니다. PG 승인, Order 생성, 완료 처리의 각 단계에서 실패 시 보상 트랜잭션을 실행하여 데이터 일관성을 유지하는 실전 사례를 공유합니다.

saga pattern
분산 트랜잭션
마이크로서비스
보상 트랜잭션
Kotlin
Spring Boot
GCP Pub/Sub으로 구축하는 마이크로서비스 비동기 알림 시스템
GCP Pub/Sub으로 구축하는 마이크로서비스 비동기 알림 시스템
2026.01.25
7

마이크로서비스 아키텍처에서 동기식 HTTP 호출의 한계를 해결하기 위해 GCP Pub/Sub을 도입하여 비동기 알림 시스템을 구축했습니다. lms-service와 payment-service에서 notification-service로의 알림 전송을 Pub/Sub을 통해 처리하여 서비스 간 결합도를 낮추고 안정성을 높였습니다.

GCP Pub/Sub
비동기 처리
마이크로서비스
알림 시스템
Spring Boot
Kotlin
메시지 큐
멀티테넌시 LMS 서비스 구축: Organization Subdomain 기반 아키텍처
멀티테넌시 LMS 서비스 구축: Organization Subdomain 기반 아키텍처
2026.01.25
7

멀티테넌시 LMS 서비스를 구축하면서 Organization Subdomain 기반 라우팅과 도메인 설계를 통해 각 조직의 데이터를 안전하게 격리하는 아키텍처를 구현했습니다. OrganizationIdArgumentResolver를 통한 자동 OrganizationId 추출과 Shared Database 전략을 중심으로 설명합니다.

멀티테넌시
LMS
아키텍처
Subdomain
Spring Boot
Kotlin
도메인 설계
Spring Mail로 구축하는 SMTP 이메일 전송 시스템
Spring Mail로 구축하는 SMTP 이메일 전송 시스템
2026.01.25
7

Spring Mail과 JavaMailSender를 활용하여 SMTP 프로토콜로 이메일을 전송하는 시스템을 구축했습니다. HTML 템플릿 기반 이메일, 파라미터 치환, Gmail SMTP 설정 등을 중심으로 실제 구현 과정을 공유합니다.

Spring Mail
SMTP
이메일 전송
JavaMailSender
Gmail
템플릿
Kotlin
PostgreSQL jsonb 타입을 Hibernate에서 처리하기: hypersistence-utils 활용
PostgreSQL jsonb 타입을 Hibernate에서 처리하기: hypersistence-utils 활용
2026.01.23
6

Spring Boot와 Hibernate를 사용하여 PostgreSQL의 jsonb 타입을 다룰 때 발생하는 타입 불일치 문제를 해결한 경험을 공유합니다. hypersistence-utils 라이브러리를 활용해 간단하고 안전하게 jsonb 컬럼을 Map 타입으로 매핑하는 방법을 설명합니다.

PostgreSQL
Hibernate
JPA
jsonb
Kotlin
Spring Boot
GitHub Actions Reusable Workflows로 GitOps 패턴 구현하기
GitHub Actions Reusable Workflows로 GitOps 패턴 구현하기
2026.01.22
6

여러 마이크로서비스를 운영하다 보면 각 서비스마다 비슷한 배포 파이프라인을 중복으로 관리하게 됩니다. GitHub Actions의 Reusable Workflows를 활용해 중앙에서 배포 로직을 관리하고, 각 서비스에서는 간단한 설정만으로 배포를 트리거할 수 있는 GitOps 패턴을 구축했습니다.

GitHub Actions
GitOps
Reusable Workflows
CI/CD
Cloud Run
GCP
폼 빌더 조건부 로직 구현: 동적 질문 표시와 상태 관리 전략
폼 빌더 조건부 로직 구현: 동적 질문 표시와 상태 관리 전략
2026.01.21
6

폼 빌더 서비스에서 조건부 로직 기능을 구현하며, 조건이 연쇄적으로 적용되는 경우와 사용자가 답변을 변경할 때 발생하는 상태 관리 문제를 해결한 과정을 공유합니다.

조건부 로직
폼 빌더
비즈니스 로직
설문조사
상태 관리
동적 폼
설문조사 폼 임시저장 기능 구현하기: SQLite와 MongoDB 하이브리드 아키텍처 (1)
설문조사 폼 임시저장 기능 구현하기: SQLite와 MongoDB 하이브리드 아키텍처 (1)
2026.01.21
7

설문조사용 폼 서비스에 임시저장 기능을 개발하며, MongoDB의 NoSQL 기반 대량 JSON 데이터 관리 방식이 고속·고빈도 데이터 송수신 요구사항에 적합하지 않음을 발견했습니다. 이 글에서는 이를 해결하기 위한 설계 과정과 아키텍처를 소개합니다.

임시저장
SQLite
MongoDB
Nestjs
아키텍처
데이터베이스
Better-SQLite3
설문조사 폼 임시저장 기능 구현하기: Drizzle ORM으로 SQLite 데이터베이스 설계 (2)
설문조사 폼 임시저장 기능 구현하기: Drizzle ORM으로 SQLite 데이터베이스 설계 (2)
2026.01.21
8

SQLite 임시 저장소에 데이터를 저장하기 위해 TypeORM, Sequelize, Drizzle ORM과 RAW 쿼리 방식을 비교 검토한 후, 유지보수성과 성능을 고려해 Drizzle ORM을 선택한 과정을 소개합니다.

임시저장
ORM
TypeORM
Drizzle ORM
SQLite
데이터베이스
Better-SQLite3
RAW 쿼리
설문조사 폼 임시저장 기능 구현하기: WebSocket 실시간 통신과 Kubernetes 세션 관리 (3)
설문조사 폼 임시저장 기능 구현하기: WebSocket 실시간 통신과 Kubernetes 세션 관리 (3)
2026.01.21
8

HTTP 통신의 반복적 요청 부하를 해결하기 위해 WebSocket을 활용한 실시간 임시저장 기능을 구현했습니다. NestJS Gateway, Kubernetes 다중 Pod 환경에서의 세션 관리, Redis를 활용한 중앙 집중식 세션 저장 전략을 소개합니다.

임시저장
WebSocket
Socket.io
Nestjs
Kubernetes
Pod
네임스페이스
Gateway
설문조사 폼 임시저장 기능 구현하기: BullMQ를 활용한 백업 전략과 Graceful Shutdown (4)
설문조사 폼 임시저장 기능 구현하기: BullMQ를 활용한 백업 전략과 Graceful Shutdown (4)
2026.01.21
7

휘발성 임시 저장 데이터의 일관성을 보장하기 위해 BullMQ의 repeatable job을 활용한 주기적 백업, 소켓 연결 해제 시 즉시 백업, Kubernetes Pod 종료 시 Graceful Shutdown을 통한 데이터 보존 전략을 구현했습니다.

임시저장
Cron Job
백업
Bull Queue
Nestjs
반복 작업
Graceful Shutdown
설문조사 폼 임시저장 기능 구현하기: 전체 아키텍처 정리와 데이터 흐름 분석 (5)
설문조사 폼 임시저장 기능 구현하기: 전체 아키텍처 정리와 데이터 흐름 분석 (5)
2026.01.21
3

임시저장 기능 고도화 연재의 마지막 글입니다. SQLite 임시 저장소, WebSocket 실시간 통신, Redis 세션 관리, MongoDB 영구 저장소, 백업 전략을 포함한 전체 아키텍처를 정리합니다.

임시저장
마무리
아키텍처
Google Sheets API 연동: Rate Limit 대응과 데이터 유실 방지 전략
Google Sheets API 연동: Rate Limit 대응과 데이터 유실 방지 전략
2026.01.21
8

Google Sheet API의 rate limit으로 인한 데이터 유실 문제를 해결하기 위해 Redis 버퍼링, 배치 처리, 슬라이딩 윈도우 rate limiter를 활용한 안정적인 연동 시스템을 구축한 과정을 소개합니다.

Google Sheets
API
Rate Limit
Redis
배치 처리
데이터 동기화
Queue
재시도
마케팅 트래킹을 위한 고정 URL 구현: Redis 캐싱과 미들웨어 설계
마케팅 트래킹을 위한 고정 URL 구현: Redis 캐싱과 미들웨어 설계
2026.01.21
7

동일한 설문 폼을 여러 회차에 걸쳐 사용할 때 URL 변경으로 인한 마케팅 데이터 분산 문제를 해결하기 위해, Redis 캐싱과 MongoDB를 활용한 고정 URL 매핑 미들웨어를 구현한 과정을 소개합니다.

마케팅
트래킹
고정 URL
Redis
캐싱
UTM
데이터 분석
AWS SES로 이메일 발송 시스템 구축하기: 대량 발송과 반송 처리 전략
AWS SES로 이메일 발송 시스템 구축하기: 대량 발송과 반송 처리 전략
2026.01.21
8

AWS SES를 활용한 자동화된 이메일 발송 시스템을 구축했습니다. 대량 메일 발송, AWS SNS와 Lambda를 통한 반송/불만 처리, 블랙리스트 관리 등 실제 운영 환경에서 필요한 기능들을 구현한 과정을 공유합니다.

AWS SES
이메일
메일 발송
Nestjs
SNS
Lambda
AWS SDK
템플릿
배치 시스템 성능 분석: Grafana와 APM으로 메모리 누수와 이벤트 루프 지연 진단하기 (1)
배치 시스템 성능 분석: Grafana와 APM으로 메모리 누수와 이벤트 루프 지연 진단하기 (1)
2026.01.21
6

운영 중인 애플리케이션의 성능과 지표를 제대로 측정하지 않았던 문제를 인식하고, Grafana와 Elastic APM을 활용해 메모리, CPU, 네트워크, 이벤트 루프 지연 등을 분석한 결과를 공유합니다.

모니터링
성능 측정
메모리
CPU
Node.js
APM
배치 시스템 성능 분석: 배치 vs 즉시 처리 시뮬레이션과 하이브리드 접근법 (2)
배치 시스템 성능 분석: 배치 vs 즉시 처리 시뮬레이션과 하이브리드 접근법 (2)
2026.01.21
6

비동기 큐를 활용한 배치 작업이 메모리 누수의 주요 원인임을 확인했습니다. 배치 방식과 즉시 적재 방식을 시뮬레이션하여 각각의 장단점을 분석하고, 스케줄러 제거와 Redis 버퍼 최적화를 통한 하이브리드 접근 방식을 제안합니다.

모니터링
배치 처리
Google Sheets
데이터 수집
Queue
스케줄링
배치 시스템 성능 분석: 이벤트 기반 큐 설계와 Dead Letter Queue 에러 처리 (3)
2026.01.21
4

스케줄러를 제거하고 이벤트 기반 큐 시스템으로 전환했습니다. Redis 버퍼에 ID만 저장하는 방식으로 메모리를 최적화하고, BullMQ를 활용한 배치 처리, 슬라이딩 윈도우 rate limiter, Dead Letter Queue를 통한 에러 처리까지 포함한 전체 설계를 소개합니다.

모니터링
성능 분석
데이터 분석
대시보드
배치 시스템 성능 분석: 개선 임팩트 측정과 개발자 성장 회고 (4)
배치 시스템 성능 분석: 개선 임팩트 측정과 개발자 성장 회고 (4)
2026.01.21
5

큐 시스템 개선의 임팩트를 메모리, CPU, 네트워크, 이벤트 루프 지표로 측정하고 분석했습니다. 또한 기술 코드/설계, 기술 운영, 제품, 커뮤니케이션 관점에서 프로젝트를 회고하며 개발자로서의 성장을 점검합니다.

모니터링
성능 최적화
Node.js
이벤트 루프
메모리 최적화
MongoDB CSFLE로 개인정보 필드 암호화 구현: AWS KMS 연동과 접근 감사 로깅
MongoDB CSFLE로 개인정보 필드 암호화 구현: AWS KMS 연동과 접근 감사 로깅
2026.01.21
6

MongoDB Client-Side Field Level Encryption(CSFLE)과 AWS KMS를 활용해 개인정보 필드 암호화 시스템을 구축했습니다. CsfleService, AnonymousApplicantService, RevealLoggerInterceptor를 통한 암호화/복호화 및 접근 감사 로깅 구현 과정을 공유합니다.

MongoDB
암호화
CSFLE
보안
Field-Level Encryption
AWS KMS
MongoDB WriteConflict 해결: MVCC 이해와 트랜잭션 동시성 제어
MongoDB WriteConflict 해결: MVCC 이해와 트랜잭션 동시성 제어
2026.01.21
5

지원서 수정 기능 개발 중 MongoDB WriteConflict와 Race Condition 문제를 마주했습니다. WiredTiger의 MVCC 메커니즘을 이해하고, 단일 트랜잭션과 분산 락을 활용해 동시성 문제를 해결한 과정을 상세히 설명합니다.

MongoDB
Write Conflict
MVCC
트랜잭션
동시성
WebSocket API 문서화: AsyncAPI 커스텀 구현과 동적 스펙 생성 시스템
WebSocket API 문서화: AsyncAPI 커스텀 구현과 동적 스펙 생성 시스템
2026.01.21
7

소켓 API 문서화를 위해 AsyncAPI를 도입했습니다. nest-asyncapi의 한계를 극복하기 위해 데코레이터 기반 메타데이터 수집과 동적 AsyncAPI 스펙 생성 시스템을 직접 구현한 과정을 공유합니다.

WebSocket
AsyncAPI
API 문서화
Nestjs
소켓
이벤트 기반
데코레이터
데이터베이스 인덱스 완전 정리: B-Tree 인덱스 vs 역인덱스
2026.01.12
2

## 개요

Inverted Index
Index
MongoDB Atlas Search Index: 한국어 검색과 고급 검색 기능
2026.01.11
4

MongoDB Atlas Search Index는 한국어 검색과 고급 검색 기능을 지원하는 Apache Lucene 기반의 검색 엔진으로, Text Index보다 평균 40% 더 빠른 성능을 제공합니다. 이 글에서는 Atlas Search Index의 개념, 설정 방법, 한국어 검색 최적화 전략, 마이그레이션 방법 및 실무 활용 전략을 다루며, 다양한 검색 쿼리 작성법과 성능 최적화 기법도 포함되어 있습니다.

MongoDB
Atlas Search
Search Index
Full-Text Search
MongoDB Text Index로 빠른 텍스트 검색 구현하기
2026.01.10
6

MongoDB Text Index는 대량의 데이터에서도 빠르고 정확한 텍스트 검색을 가능하게 하며, $regex보다 성능이 우수합니다. 하나의 컬렉션에 하나의 Text Index만 생성할 수 있으며, 필드별 가중치 설정을 통해 검색 품질을 향상시킬 수 있습니다. 검색 점수를 활용하여 결과를 관련성 순으로 정렬할 수 있으며, 고급 검색 기능이 필요할 경우 Atlas Search Index를 고려해야 합니다.

MongoDB
Text Index
Full-Text Search
Database
Indexing
Performance
AI Agent 구축 가이드: RAG, 벡터 검색, LangGraph 활용
2026.01.06
6

AI Agent는 LLM을 넘어서 자율적으로 도구를 사용하고 정보를 검색하며 복잡한 작업을 수행할 수 있는 시스템이다. 주요 구성 요소로는 LLM, Agent, 도구, 메모리 등이 있으며, RAG(정보 검색 증강 생성)와 벡터 검색을 통해 최신 정보에 접근하고 개인화된 데이터 처리가 가능하다. LangGraph는 복잡한 AI Agent 구축을 위한 프레임워크로, 상태 관리와 도구 사용을 효율적으로 지원한다. 일반적인 실행 흐름은 사용자 입력, Agent 분석, 도구 실행, 결과 통합, 상태 저장으로 구성된다.

transaction
MongoDB
Vector Search
AsyncLocalStorage
LangChain
LangGraph
Spring @Transactional 완전 정리: Propagation 옵션과 내부 구현 원리
2025.12.31
3

Spring의 @Transactional 어노테이션은 선언적 트랜잭션 관리 기능을 제공하며, Propagation 옵션을 통해 트랜잭션의 동작 방식을 설정할 수 있다. 주요 Propagation 옵션으로는 REQUIRED, REQUIRES_NEW, SUPPORTS, MANDATORY, NOT_SUPPORTED, NEVER, NESTED가 있으며, 각 옵션은 트랜잭션의 참여 및 생성 방식에 따라 다르게 작동한다. 실제 프로젝트에서의 활용 예시와 성능 최적화 팁도 포함되어 있으며, AOP 프록시 패턴을 기반으로 내부 구현 원리를 설명한다.

AOP
JPA
Spring
JPA 지연 로딩 vs JOIN FETCH: 성능 비교와 선택 가이드
2025.12.22
3

JPA에서 지연 로딩과 JOIN FETCH의 차이를 설명하며, 과제 취소 기능 구현을 통해 성능 비교를 진행했다. 지연 로딩은 필요할 때 데이터를 로딩하는 반면, JOIN FETCH는 연관된 엔티티를 한 번의 쿼리로 조회하여 성능을 개선한다. 실제 성능 측정 결과, JOIN FETCH를 사용했을 때 약 32-43%의 성능 향상이 있었다. 조건부로 사용되는 연관 엔티티에는 지연 로딩을, 항상 함께 사용되는 경우에는 JOIN FETCH를 사용하는 것이 바람직하다.

JPA
LazyLoading
Join
Spring WebFlux에서 Kotlin Coroutine으로 마이그레이션하기
2025.12.20
2

Spring WebFlux에서 Kotlin Coroutine으로의 마이그레이션을 통해 코드 가독성과 유지보수성을 향상시킬 수 있다. Coroutine을 사용하면 예외 처리가 직관적이고 디버깅이 쉬워지며, 코드가 간결해진다. 마이그레이션 과정에서는 Controller, Service, Repository 레이어의 변화를 포함하여, 의존성 설정과 트랜잭션 처리 방법도 개선된다. 최종적으로 Coroutine을 사용하는 것이 코드의 가독성과 개발자 경험을 크게 향상시킨다.

coroutine
kotlin
Spring Data R2DBC에서 낙관적 락(Optimistic Locking) 구현하기
2025.12.20
1

낙관적 락은 충돌이 적을 때 사용되며, 저장 시 버전을 확인하여 충돌을 감지한다. Spring Data R2DBC를 통해 자동으로 버전 관리가 이루어지고, 동시성 충돌 발생 시 재시도 메커니즘이 작동한다. 장점으로는 읽기 성능과 동시성 처리, 데드락 방지가 있으며, 단점으로는 충돌 시 재시도 필요성과 복잡성이 있다.

optimistic lock
JPA vs R2DBC: I/O 모델 비교와 선택 가이드
2025.12.20
3

JPA는 블로킹 I/O 모델을 사용하여 각 요청마다 별도의 스레드를 할당하고, 높은 동시성에서 많은 메모리와 스레드가 필요하다. 반면 R2DBC는 논블로킹 I/O 모델로 적은 수의 스레드로 많은 요청을 처리하며, 메모리 사용이 적고 높은 성능을 보인다. JPA는 복잡한 관계 매핑과 자동 쿼리 생성에 유리하고, R2DBC는 높은 동시성 요구사항과 리액티브 스택에 적합하다.

kotlin
r2dbc
rdbms
Google Gemini CLI 오픈소스 기여: 토큰 에러 핸들링 시스템 구현
2025.09.28
3

Google Gemini CLI 오픈소스 프로젝트에 기여하여 토큰 에러 핸들링 시스템을 구현하였습니다. 이 시스템은 자동 복구 및 재시도 메커니즘을 통해 긴 입력에 대한 처리 문제를 해결하며, 사용자 친화적인 에러 메시지와 실시간 토큰 모니터링 기능을 제공합니다. 또한, 다양한 에러 형태를 지원하고, 성능 최적화를 위해 비동기 처리 및 지수 백오프를 적용하였습니다. 향후 스마트 컨텍스트 압축 및 실시간 대시보드와 같은 추가 기능을 고려하고 있습니다.

gemini
google
test
DTO (Data Transfer Object)
2025.09.28
3

DTO는 계층 간 데이터 전송을 위한 가변 객체로, API 요청/응답에 주로 사용되며 검증 로직이 최소화된다. 반면, VO는 값 자체를 표현하는 불변 객체로, 데이터의 목적과 특성이 다르다.

DDD
Decorator
VO
MongoDB 멀티 도큐먼트 트랜잭션: AsyncLocalStorage와 Mongoose 미들웨어 활용
2025.03.10
6

MongoDB의 멀티 도큐먼트 트랜잭션을 Node.js에서 안전하게 구현하기 위해 AsyncLocalStorage와 Mongoose 미들웨어를 사용하는 방법을 설명하며, 자동 세션 관리, 재시도 메커니즘, 에러 처리 및 성능 최적화의 중요성을 강조합니다. 다양한 구현 방식을 비교하고, @Transactional 데코레이터를 통해 복잡한 비즈니스 로직을 안전하게 처리하는 방법을 제시합니다.

MongoDB
transaction
AsyncLocalStorage
Nodejs
Mongoose
Nestjs
NestJS AOP로 Kafka Consumer 데코레이터 만들기
2025.01.03
4

Kafka 메시지 처리를 위해 각 토픽마다 개별 컨슈머 그룹을 구성하고, 커스텀 데코레이터(@Consume)를 통해 컨트롤러의 특정 메서드를 Kafka Consumer로 등록하는 방법을 설명합니다. NestJS에서 데코레이터는 마킹, 조회, 등록의 3단계로 동작하며, 이를 통해 독립적인 오프셋 관리, 맞춤형 소비 로직, 리밸런싱 영향 최소화 등의 장점을 제공합니다.

Nestjs
AOP
Decorator
kafka