Pingu
영차영차! Backend

Spring Boot” 태그의 포스트

(11개)

Kotlin JDSL 마이그레이션과 Fetch Join을 통한 N+1 문제 해결

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

2026. 2. 2.
읽기 →
Kotlin JDSL
JPA
N+1 쿼리
Fetch Join
성능 최적화
Spring Boot
Kotlin
확장 함수

N+1 쿼리 최적화와 Connection Pool 튜닝으로 해결한 Connection Timeout 문제

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

2026. 2. 1.
읽기 →
N+1 쿼리
Connection Pool
HikariCP
성능 최적화
Spring Boot
Kotlin
JPA
배치 조회

Spec-Driven Development로 개발 효율 2배 높이기

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

2026. 2. 1.
읽기 →
Spec-Driven Development
Spec-Kit
GitHub Spec-Kit
OpenAPI
Contract Testing
명세 우선 개발
Kotlin
Spring Boot
마이크로서비스

DDoS 공격을 겪고 나서 알게 된 모니터링의 가치

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

2026. 2. 1.
읽기 →
Prometheus
Spring Boot
모니터링
Observability
Micrometer
Grafana
Kotlin

마이크로서비스에서 Common Package를 도입하게 된 계기와 경험

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

2026. 1. 30.
읽기 →
마이크로서비스
Common Package
Multi-Repo
GitHub Packages
Kotlin
Spring Boot
코드 중복
공통 라이브러리

헥사고날 아키텍처로 비즈니스 로직 보호하기: s-class 프로젝트 실전 사례

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

2026. 1. 26.
읽기 →
헥사고날 아키텍처
hexagonal architecture
포트 앤 어댑터
클린 아키텍처
Kotlin
Spring Boot

팩토리 패턴으로 알림 채널 확장하기: Notification Service 실전 사례

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

2026. 1. 26.
읽기 →
팩토리 패턴
factory pattern
전략 패턴
strategy pattern
알림 시스템
Kotlin
Spring Boot

Saga 패턴으로 분산 트랜잭션 처리하기: Payment Service 실전 사례

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

2026. 1. 26.
읽기 →
saga pattern
분산 트랜잭션
마이크로서비스
보상 트랜잭션
Kotlin
Spring Boot

GCP Pub/Sub으로 구축하는 마이크로서비스 비동기 알림 시스템

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

2026. 1. 25.
읽기 →
GCP Pub/Sub
비동기 처리
마이크로서비스
알림 시스템
Spring Boot
Kotlin
메시지 큐

멀티테넌시 LMS 서비스 구축: Organization Subdomain 기반 아키텍처

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

2026. 1. 25.
읽기 →
멀티테넌시
LMS
아키텍처
Subdomain
Spring Boot
Kotlin
도메인 설계

PostgreSQL jsonb 타입을 Hibernate에서 처리하기: hypersistence-utils 활용

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

2026. 1. 23.
읽기 →
PostgreSQL
Hibernate
JPA
jsonb
Kotlin
Spring Boot