Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화
Backend/FastAPI 💨2026. 3. 24. 12:07Java 레거시 SQL을 Python으로 옮겼더니 5초나 걸렸다: 0.5초로 줄인 5가지 최적화

Java 레거시 환경의 입출결 조회 API를 Python(FastAPI + SQLAlchemy)으로 마이그레이션하면서 예상치 못한 성능 저하를 겪었어요.기능은 완전히 동일한데도, 학생 118명 기준 응답 시간이 약 5초나 걸렸죠. 처음엔 "비동기 프레임워크를 썼는데 왜 더 느려졌을까?"라는 의문부터 들었어요. 하지만 병목 구간을 추적해 보니 프레임워크 자체의 문제는 아니었습니다. 레거시 SQL 패턴을 그대로 가져온 점, 실행 계획과 어긋난 인덱스, 불필요한 데이터 조회, 그리고 비동기 환경에 맞지 않는 세션 관리가 복합적으로 얽혀 있었거든요. 이번 글에서는 단순히 쿼리 하나를 튜닝한 경험을 넘어, SQL 패턴과 실행 계획부터 인덱스, 애플리케이션의 호출 구조까지 전반적으로 개선해 응답 시간을 5초에서 0..

Spring Boot에서 PostgreSQL Master–Slave Replication 적용하기
Backend/Spring 🌱2025. 11. 27. 19:09Spring Boot에서 PostgreSQL Master–Slave Replication 적용하기

오늘은 Replication이 구성된 PostgreSQL 환경에서 Spring Boot가 Master(Write) 와 Slave(Read) 를 자동으로 구분해 사용하는 방법을 설명해볼게요. Spring Boot는 기본적으로 다중 데이터소스를 자동 구성하지 않으므로, Master/Slave 분리를 위해 다음 작업이 필요합니다.Master / Slave 각각 별도의 DataSource 정의트랜잭션의 readOnly 여부에 따른 DB 라우팅AbstractRoutingDataSource를 활용한 동적 선택LazyConnectionDataSourceProxy로 실제 커넥션 생성 시점에 데이터소스 결정이 과정을 완료하면 Spring Boot는 읽기 요청은 Slave, 쓰기 요청은 Master 로 자동 라우팅하여 안..

Spring에서 ServiceImpl, 정말 써야 할까요?
Backend/Spring 🌱2024. 6. 14. 12:04Spring에서 ServiceImpl, 정말 써야 할까요?

안녕하세요! 최근에 본 한 유튜브 영상을 계기로 정리해보고 싶은 이야기가 있어 글을 쓰게 되었어요.아래 영상은 제가 개인적으로 존경하는 개발자 제미니님 채널의 콘텐츠인데요.영상을 보고 나서 “아… 나는 지금까지 너무 관성적으로 개발해온 건 아닐까?” 하는 생각이 강하게 들더라고요.그래서 이번 글에서는 ServiceImpl 패턴을 당연하게 사용하는 관행을 한 번 돌아보고자 해요.가볍게 읽어주세요. (영상을 함께 보시면 더 좋아요!) 이 글에서 이야기할 내용ServiceImpl 패턴이 무엇이며, 왜 스프링에서 거의 국룰처럼 쓰이게 되었는지이 패턴이 실제로 제공하는 장점은 무엇인지그런데도 왜 “무조건 쓰지 말자”는 말이 나오는지마지막으로, 언제 인터페이스를 도입하는 것이 진짜 가치 있는 선택인지결론부터 말씀드..

Redis 캐싱으로 API 성능 개선하기
Backend/Spring 🌱2024. 4. 1. 17:26Redis 캐싱으로 API 성능 개선하기

이길어때 프로젝트의 장소 상세 화면에서는 리뷰 개수, 댓글 수, 좋아요 수, 평균 평점 등 여러 집계 정보가 필요합니다. 그런데 이 값들을 계산할 때마다 여러 개의 COUNT 쿼리가 실행되면서 DB 부담이 점점 커지는 문제가 생겼습니다. 이 글에서는 이 문제를 Redis 캐싱으로 어떻게 해결했는지, 그리고 마지막에 Spring Cache 추상화(@Cacheable)를 적용해 비즈니스 로직을 깔끔하게 정리한 과정을 소개합니다. 이 글을 읽으면 다음 내용을 알 수 있을거에요Count 기반 데이터를 언제 캐싱하면 좋은지Spring + Redis로 Cache-Aside 패턴을 구현하는 방법Spring Cache 추상화를 활용해 캐시 로직을 서비스 코드에서 분리하는 실전 패턴 문제 상황: 장소 상세 화면에 반복되..

Spring SSE와 Redis Pub/Sub으로 구현하는 실시간 알림 (다중 서버 환경까지 스케일링하기)
Backend/Spring 🌱2024. 3. 19. 12:38Spring SSE와 Redis Pub/Sub으로 구현하는 실시간 알림 (다중 서버 환경까지 스케일링하기)

제가 개발 중인 이길어때 프로젝트는 최근 SNS 서비스 형태로 확장되고 있습니다.SNS라면 빠질 수 없는 기능이 바로 실시간 알림이죠.좋아요, 댓글, 팔로우 같은 사용자 행동을 바로 알려주면 서비스의 사용성이 크게 좋아지기 때문입니다이번 글에서는 Spring에서 SSE(Server-Sent Events) 로 실시간 알림 기능을 구현하는 방법과,운영 환경에서 실제로 마주쳤던 다중 서버 환경 문제를 Redis Pub/Sub으로 해결한 경험을 정리했습니다. 이 글을 읽으면 다음과 같은 내용에 대한 이해를 얻을 수 있을거에요 :)폴링 / 웹소켓 / SSE 중 알림 시스템에 적합한 방식 고르기Spring SseEmitter로 SSE 알림 구현하기다중 WAS 환경에서 SSE가 겪는 구조적 한계Redis Pub/Su..

스프링 컨테이너 이해하기: BeanFactory와 ApplicationContext
Backend/Spring 🌱2024. 3. 12. 19:10스프링 컨테이너 이해하기: BeanFactory와 ApplicationContext

스프링의 의존성 주입(DI)을 이해하려면 먼저 스프링 컨테이너(Spring Container) 가 어떤 역할을 하는지 파악하는 것이 중요합니다.스프링 컨테이너는 객체(Bean)를 생성하고 관리하며, 필요한 의존관계를 연결해주는 핵심 엔진입니다. 이번 글에서는 스프링 컨테이너의 기본 개념부터 시작해 BeanFactory와 ApplicationContext의 차이, 그리고 실무에서 ApplicationContext가 사실상 표준으로 쓰이는 이유까지 차근차근 살펴보겠습니다. 이 글을 읽고 나면 다음 내용을 이해할 수 있을거에요Spring Container가 무엇이며 어떤 역할을 하는지BeanFactory와 ApplicationContext의 기능과 차이점ApplicationContext가 실무에서 기본 컨테이..

image