분류 전체보기(604)
-
직접 구현한 소셜 로그인을 왜 Spring Security로 재구현 했을까?
개요이 글에서는 기존 시스템에서 직접 구현한 OAuth 2.0 기반 소셜 로그인 기능을, Spring Security 라이브러리를 도입하면서 해당 프레임워크에 맞게 재구현하게 된 배경과 이유를 소개합니다. 마지막으로 직접 구현한 소셜 로그인 인증 시스템의 문제점과 Spring Security를 도입하면서 어떻게 구조를 개선하였는지도 다룹니다. 직접 구현한 소셜 로그인 방식소셜 로그인의 수행 과정기존 직접 구현한 소셜 로그인 방식의 수행 과정은 다음과 같습니다.사용자는 소셜 플랫폼 인증을 위한 URL 생성을 서버에게 요청합니다.서버는 소셜 플랫폼에 맞는 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 -
Synchronous/Asynchronous 방식과 Blocking/Non-Blocking 방식에 대해서
Synchronous 방식Synchronous 방식은 스레드가 어떤 함수 작업을 수행할 때 함수 작업 안에 다른 여러가지 작은 작업들을 전체적인 관점에서 순차적으로 완료하는 방식입니다. 예를 들어 다음 그림과 같이 스레드#1 가 함수를 호출 시 함수 안에는 A,B,C I/O 작업이 존재합니다. 스레드#1이 실행하는 함수가 Synchronous 방식으로 작동한다면 전체적으로 볼때 작업들은 순차적으로 완료되어 A -> B -> C 작업 순으로 완료될 것입니다.다음 그림에서 A, C I/O 작업은 블로킹(Blocking) 방식이기 때문에 A, C 작업을 호출한 스레드는 작업이 완료될 때까지 대기하는 것을 볼수 있습니다. 반면에 B 작업은 논블로킹(Non-Blocking) 방식이기 때문에 B 작업이 끝날때까지..
2024.09.10