전체 글(605)
-
Spring JPA 대용량 데이터 조회 최적화, 300만건 포트폴리오 손익 데이터 처리 개선 사례
배경데이터베이스에 포트폴리오 손익 내역(PortfolioGainHistory) 데이터가 300만개인 상태에서 포트폴리오 종목 조회시 응답 시간이 길어지는 문제가 발생하였습니다.포트폴리오 종목 조회 API : /api/portfolio/:portfolioId/holdings 포트폴리오 손익 내역 데이터를 가져오기 위한 JPQL은 다음과 같았습니다.@Query(value = """ select p, p2 from PortfolioGainHistory p inner join Portfolio p2 on p.portfolio.id = p2.id where p.portfolio.id = :portfolioId and p.createAt findFirstLatestPortfo..
2025.04.29 -
직접 구현한 소셜 로그인을 왜 Spring Security로 재구현 했을까?
개요이 글에서는 기존 시스템에서 직접 구현한 OAuth 2.0 기반 소셜 로그인(Google, Kakao, Naver) 기능을, Spring Security 프레임워크를 도입하면서 해당 프레임워크에 맞게 재구현하게 된 배경과 이유를 소개합니다. 마지막으로 직접 구현한 소셜 로그인 인증 시스템의 문제점과 Spring Security를 도입하면서 어떻게 구조를 개선하였는지도 다룹니다. 직접 구현한 소셜 로그인 방식소셜 로그인의 수행 과정기존 직접 구현한 소셜 로그인 방식의 수행 과정은 다음과 같습니다.사용자는 소셜 플랫폼 인증을 위한 URL 생성을 서버에게 요청합니다.서버는 소셜 플랫폼에 맞는 URL을 생성하여 응답합니다.생성한 URL에는 인증 후 발급받은 인가 코드를 전달할 리다이렉션 주소가 쿼리 파라미터..
2025.04.18 -
Spring 서버 OOM 알림 메일 전송하기(Prometheus + AlertManager)
개요fineAnts 프로젝트를 진행하던 중, Prometheus와 Grafana를 도입하여 JVM 상태를 시각화하고 모니터링 할 수 있었습니다. 그러나 메모리 부족(OutOfMemory, OOM)이나 인스턴스 다운과 같은 치명적인 상황 발생 시 별도의 알림 시스템이 없어 즉각적인 대응이 어려웠습니다.이 글에서는 Spring 서버에서 OOM 상황이 발생할 때 관리자 이메일로 알림을 전송하는 방법을 정리합니다. Prometheus로 메모리 상태를 감지하고 AlertManager를 통해서 이메일 알림을 전송하는 구조입니다.목표Spring 애플리케이션의 JVM 힙 메모리 사용률이 90%를 초과하거나, OOM이 발생한 경우 관리자에게 이메일로 알림을 전송합니다.사전 준비사항Prometheus 서버가 정상 작동 ..
2025.04.12 -
Spring 다중 인스턴스 환경에서 스케줄러 단일 실행 처리
배경Spring 서버가 스케일 아웃하면서 동시 실행하는 구조가 되면서 각 인스턴스에 등록된 @Scheduled 작업이 중복 실행되는 문제가 발생할 수 있습니다. 예를 들어 5초마다 종목의 현재가를 갱신하는 스케줄러 작업이 있습니다. 해당 작업은 외부 API에 요청하여 종목의 현재가를 질의한 다음에 Redis에 저장합니다. 종목의 현재가 데이터는 여러 Spring 인스턴스가 공통적으로 사용하기 때문에 각각의 Spring 인스턴스가 스케줄러 작업을 수행 할 필요없이 하나의 Spring 인스턴스가 맡아서 수행하여 데이터를 저장하면 됩니다.문제정의다중 Spring 인스턴스 환경에서 @Scheduled 메서드가 모든 인스턴스에서 실행됩니다.한번만 실행되어야 할 작업이 중복 실행되어 불필요한 수행이 발생합니다.스케..
2025.04.11 -
실시간 데이터 전송 방식 4가지(Polling, Long Polling, SSE, WebSocket)
개요일반적으로 클라이언트가 서버로부터 데이터를 전달받기 위해서는 HTTP 프로토콜을 이용하여 전달받습니다. 클라이언트-서버 구조에서 일반적으로 HTTP 요청은 클라이언트에서 부터 시작하게 됩니다. 그러나 몇몇 상황에서는 클라이언트가 아닌 서버에서 먼저 데이터를 전달해야 하는 경우가 있습니다. 대표적인 예시로 알림이나 실시간 채팅과 같은 사례가 있습니다. 이번 글에서는 클라이언트에게 데이터를 전송하는 4가지 방법을 알아봅니다.PollingPolling은 무엇인가?Polling 방식은 클라이언트가 먼저 HTTP Request를 서버에게 전송하여 응답을 받는 방식입니다. 이 방식은 우리가 아는 일반적인 클라이언트-서버 구조에서 HTTP 프로토콜을 이용하여 데이터를 주고받는 방식입니다.위 그림을 보면 클라이언트..
2025.03.31 -
Spring Cache: CaffeineCache 설정
CaffeineCache는 무엇인가?CaffeineCache는 Java 기반의 고성능 캐시 라이브러리인 Caffeine을 사용하여 데이터를 메모리에 캐시하는 기능입니다. Spring Boot CaffeineCache 설정의존성 라이브러리 추가implementation 'org.springframework.boot:spring-boot-starter-cache'implementation 'com.github.ben-manes.caffeine:caffeine' Cache 설정 클래스 추가다음과 같이 설정 클래스를 구현하여 CaffeineCacheManager 스프링 빈을 정의합니다. 저 같은 경우 weatherCache 캐시를 10분으로 설정하기 위해서 다음과 같이 인스턴스 생성시 "weatherCache"..
2024.11.06