JAVA(247)
-
직접 구현한 소셜 로그인을 왜 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 -
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 -
@EventListener vs @TransactionalEventListener
@EventListener@EventListener는 스프링 이벤트 리스너를 등록하는데 사용되는 애노테이션입니다. 이 애노테이션을 적용한 메서드는 특정한 이벤트가 발생했을 때 수신하여 애노테이션을 적용한 메서드를 실행시킵니다. @EventListener 애노테이션을 적용한 리스너 메서드는 다음과 같은 특징을 가지고 있습니다. 앞으로의 설명에서 @EventListener 애노테이션을 적용한 메서드를 리스너 메서드라고 표현합니다.기본적인 동기적 처리 : 리스너 메서드는 기본적으로 이벤트를 동기적으로 처리합니다. 이벤트를 동기적으로 처리하게 되면 이벤트를 발생시킨 곳에서 이벤트를 호출하고나서 이벤트를 처리한 다음에 그 이후의 코드를 실행하게 됩니다.비동기 처리 가능 : @Async 애노테이션을 리스너 메서드에..
2024.08.31 -
모던 자바 인 액션: 함수형 프로그래밍 기법
이 글은 모던 자바 인 액션 도서의 내용을 개인적으로 정리한 글입니다. 틀린 내용이 있을 수 있습니다.1. 함수는 모든 곳에 존재한다자바 8 이후부터 일급 함수를 지원합니다. 일급 함수란 함수를 일종의 값으로 취급하여 메서드 인수로 전달하거나 반환값으로 전달하는 함수를 의미합니다. 자바 8에서는 메서드 참조 또는 람다 표현식을 사용하여 함숫값을 메서드의 인수로 전달하거나 반환값으로 전달할 수 있습니다. 예를 들어 다음과 같이 메서드 참조를 이용하여 변수에 함숫값을 저장할 수 있습니다.Function strToInt = Integer::parseInt; 1.1 고차원 함수고차원 함수는 여러 함수들의 순차적인 동작을 하나의 함수로 묶어서 새로운 함수로 표현하는 함수입니다. 고차원 함수를 사용하는 대표적인 사..
2024.07.17