Project 27

[Spring/JPA] refresh token 통합 테스트 중 데이터 불일치 문제 삽질기 (@Modifying의 flushAutomatically 옵션)

1. 문제 상황: "분명히 지웠는데 왜 남아있지?"최근 진행 중인 사이드 프로젝트의 access, refresh token 인증 로직을 검증하기 위해 통합 테스트 코드를 작성하고 있었다. 로그인, 토큰 갱신, 로그아웃으로 이어지는 전체 플로우를 테스트하던 중, 로그아웃 시 DB에서 Refresh Token이 삭제되지 않는 문제가 생겼다.// 문제의 테스트 코드 일부@Test@DisplayName("로그아웃 -> RefreshToken 삭제 확인")void logout_ShouldDeleteRefreshToken() throws Exception { // 1. 로그인하여 토큰 생성 userService.login(loginRequest); // 2. 로그아웃 수행 (내부적으로 de..

[Spring 트래픽 제한] 인증 없는 API에 안전장치 달기: Bucket4j로 Rate Limiting 구현

서비스를 운영하다 보면 보안상 가장 고민되는 지점 중 하나가 바로 '인증되지 않은 사용자의 요청' 이다. 특히 파일 업로드 API는 악의적인 사용자의 타겟이 되기 쉽다. 주변에서도 왕왕 그러 악의적인 접근 때문에 aws 요금을 폭탄맞았다는 경우도 왕왕 들었다. 오늘은 최근 프로젝트 코드 리뷰 중 발견한 보안 취약점을 해결하기 위해, Bucket4j를 도입하여 트래픽 제한(Rate Limiting)을 적용한 과정을 공유하려 한다. 1️⃣ 현재 필자의 상황 (왜 트래픽 제한이 필요한가)현재 개발 중인 프로젝트의 판매자 회원가입 로직은 다음과 같다.판매자가 회원가입 폼을 작성하며 사업자등록증 등 증빙 서류를 업로드한다.이 서류는 S3의 temp/ 경로에 임시 저장된다. (아직 가입 전이므로 비로그인 상태)회원..

[프로젝트/구현] Redis Replication 마스터-슬레이브 구조를 통한 분산 처리 적용 과정

이전 글2025.05.01 - [Project/대용량 트래픽 프로젝트] - [기술적 의사결정] MSA 환경에서 배송 정보 임시 저장소로 Redis를 사용한 이유 [기술적 의사결정] MSA 환경에서 배송 정보 임시 저장소로 Redis를 사용한 이유💡문제 상황우리 프로젝트에서는 주문을 생성할 때 배송 정보도 함께 입력받는 구조를 채택하고 있다. 현재 주문 처리 흐름은주문 ➡️ 재고 확인 ➡️ 결제 ➡️ 재고 차감 ➡️ 배송 ➡️ 주developer-jinnie.tistory.com 이전 글에서는 배송 데이터 임시 저장소로 Redis를 선택해 사용하게 된 기술적 의사결정 과정을 기술해보았다. 이번 글에서는 해당 구조에서 오는 문제점을 인지하고 해결하는 과정을 공유해보려 한다. 💡문제 상황현재 개발 중인 서..

[기술적 의사결정] MSA 환경에서 배송 정보 임시 저장소로 Redis를 사용한 이유

💡문제 상황우리 프로젝트에서는 주문을 생성할 때 배송 정보도 함께 입력받는 구조를 채택하고 있다. 현재 주문 처리 흐름은주문 ➡️ 재고 확인 ➡️ 결제 ➡️ 재고 차감 ➡️ 배송 ➡️ 주문 완료순으로 진행된다. 여기서 맞닥뜨렸던 고민이 있었다. "배송 정보는 결제가 완료되어야만 유효한데, 주문 생성 시점에서 이 정보를 어떻게 안전하게 처리할 수 있을까?" 예를 들어, 사용자가 주문을 시작하면서 배송지 정보를 함께 입력했다고 해보자. 그런데 결제를 하지 않고 중간에 이탈해버린다면? 결과적으로 결제가 완료되지 않은 주문과 배송지 정보가 DB에 불필요하게 영구 저장될 수 있다. 사용자 수가 많아질수록, 예컨대 100명이 결제 없이 이탈한다면 그만큼 불필요한 주문 데이터와 함께 민감한 개인정보(주소, 연락처 ..

[프로젝트/구현] Redis 분산락으로 재고 감소 동시성 이슈 해결하기 (2/2) (feat. Facade 패턴)

이전 글 [프로젝트/기술적 의사결정] Redis 분산락으로 재고 감소 동시성 이슈 해결하기 (1/2)필자는 MSA 기반 이커머스 프로젝트에서 상품/재고/예약구매 도메인을 맡아 진행중이다. 지난 프로젝트에서 쿠폰 도메인을 맡아 개발했을 때 Race condition 문제를 예상치 못하게 겪고 (..) 이번 프developer-jinnie.tistory.com 이전 글에서 redisson 라이브러리를 사용해 분산락을 구현하기로 결정했었다. 이번 글에선 분산락으로 재고 감소 동시성 이슈를 해결하는 과정을 기술해보려 한다. 1. Redis 및 Redisson 의존성 추가 // Redis implementation 'org.springframework.boot:spring-boot-starter-dat..

[프로젝트] Windows 환경에서 JMeter 설치 및 부하 테스트 하기

부하 테스트를 위해 JMeter 설치가 필요했던 나 ,, 윈도우에서 JMeter 설치를 비롯해 테스트를 해야 하는 분들이 이 포스팅 하나만 읽어도 쉽게 가능했으면 하는 마음으로 포스팅한다. 설치1. JMeter를 아래 링크에 가서 설치해주자.https://jmeter.apache.org/ Apache JMeter - Apache JMeter™Apache JMeter™ The Apache JMeter™ application is open source software, a 100% pure Java application designed to load test functional behavior and measure performance. It was originally designed for testing ..

[프로젝트] QueryDSL 사용 시 페이징 응답 JSON 데이터 최적화 하기

문제 상황spring 3.3.4 버전, QueryDSL로 검색 기능을 구현하다, API 테스트 과정에서 처음 보는 WARN 로그를 발견했다.2024-10-06T20:38:53.327+09:00 WARN 36852 --- [user-service] [io-19093-exec-1] ration$PageModule$WarningLoggingModifier : Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure!For a stable JSON structure, please use Spring Data's Pa..

[프로젝트/기술적 의사결정] Redis 분산락으로 재고 감소 동시성 이슈 해결하기 (1/2)

필자는 MSA 기반 이커머스 프로젝트에서 상품/재고/예약구매 도메인을 맡아 진행중이다. 지난 프로젝트에서 쿠폰 도메인을 맡아 개발했을 때 Race condition 문제를 예상치 못하게 겪고 (..) 이번 프로젝트에서 상품/재고 도메인을 맡았을 땐 어느 정도 동시성 이슈가 생기리라고 예상을 했었다. 그래서 이번 포스팅에선 해당 이슈가 왜 발생하는지 원인을 분석하고, 문제를 해결하기 위한 방법과 그에 따른 기술적 의사결정 과정을 적어보려 한다. 문제 상황 바로 테스트 코드를 작성해보자.동시에 100개의 요청이 들어올 때의 테스트 코드를 작성하고 돌려보니 역시나 실패다. 실패하는 이유는 역시나 위에 언급해 둔 Race condition 문제 때문이다. 💡Race Condition 이란?두 개 이상의 스..