전체 (40) 썸네일형 리스트형 [DataBase] OFFSET 페이지네이션, 11초에서 2초로 줄인 과정 상품 목록 조회 API가 페이지가 깊어질수록 눈에 띄게 느려지는 문제가 있었다.이 글은 그 원인을 EXPLAIN ANALYZE로 분석하고 인덱스 설계와 2단계 조회 방식으로 응답 시간을 약 77% 개선한 과정을 정리한 것이다.들어가기 전에 — 데이터베이스는 SQL을 실행하기 전에 옵티마이저(Optimizer) 를 통해 가능한 실행 방법들을 비교한다.테이블 전체를 스캔할지, 어떤 인덱스를 사용할지, 정렬을 어떻게 처리할지를 통계 기반으로 판단하고 예상 비용이 가장 낮은 실행 계획을 선택한다. 1. EXPLAIN ANALYZE로 성능 분석하기EXPLAIN ANALYZE는 DB가 이 SQL을 어떤 방식으로 실행했고 실제로 시간이 얼마나 걸렸는지를 보여주는 분석 명령어다.초기 상태(PK = sku)에서 이름순 .. [Spring] Redis ZSet 기반 대기열 시스템 정리 1. 구현 목적예매 요청이 한 번에 몰렸을 때 모든 사용자를 바로 예매 페이지로 보내지 않고, Redis 대기열을 통해 순서대로 입장시키는 구조를 만들었다.핵심은 다음과 같다.사용자는 먼저 대기열에 진입한다.서버는 사용자에게 token을 발급한다.token은 Redis ZSet에 저장된다.입장 가능한 token만 예매 페이지로 이동할 수 있다.실제 예매 요청 시에도 token을 다시 검증한다. 2. Redis 구조대기열은 Redis ZSet 2개로 분리했다.waiting:{productId}entry:{productId} waiting:{productId}아직 대기 중인 token 저장소다.waiting:1- token119- token120- token121member: tokenscore: 대기열 .. [Spring] Kafka 기반 예매 시스템 성능 개선기: MySQL 병목, Redis 재고 차감, 그리고 정합성 트레이드오프 1. 문제 상황: API는 빠른데 Consumer가 밀렸다 이번 프로젝트에서는 Kafka를 활용해 비동기 기반 예매 시스템을 구현했다.초기 목표는 사용자의 예매 요청을 API 서버에서 직접 모두 처리하지 않고, Kafka 이벤트로 분리해 각 Consumer가 역할별로 처리하도록 만드는 것이었다.초기 흐름은 다음과 같았다.Client가 예매 요청Producer API가 reservation_requested 이벤트 발행ReservationHistoryConsumer가 예약 내역을 MySQL에 저장StockConsumer가 상품 재고를 확인하고 차감StockConsumer가 stock-result 이벤트 발행ReservationHistoryConsumer가 예약 상태를 CONFIRMED 또는 FAILED로 .. [Spring] CaffeineCache TTL 설정 오류로 인한 NPE 발생 사례 이 글은 Spring Security + JWT 기반 인증 구조를 Keycloak/OIDC 기반 구조로 전환하며 겪은 과정을 정리한 시리즈입니다.현재 글: 5편 - 로그아웃에서만 500 에러가 발생한 이유: Caffeine Cache TTL 불일치시리즈 순서 1. Spring Security + JWT에서 Keycloak/OIDC 구조로 전환한 이유1 2. Direct Access Grants에서 Authorization Code + PKCE로 전환하기 3. issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정 4. JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유 5. 로그아웃에서만 500 에러가 발생한 이유: Caffeine Cache TTL 불일치 .. [Spring Security] JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유 이 글은 Spring Security + JWT 기반 인증 구조를 Keycloak/OIDC 기반 구조로 전환하며 겪은 과정을 정리한 시리즈입니다.현재 글: 4편 - JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유시리즈 순서 1. Spring Security + JWT에서 Keycloak/OIDC 구조로 전환한 이유 2. Direct Access Grants에서 Authorization Code + PKCE로 전환하기 3. issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정 4. JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유 5. 로그아웃에서만 500 에러가 발생한 이유: Caffeine Cache TTL 불일치 1. 문제 .. [Spring Security] issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정 이 글은 Spring Security + JWT 기반 인증 구조를 Keycloak/OIDC 기반 구조로 전환하며 겪은 과정을 정리한 시리즈입니다.현재 글: 3편 - issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정시리즈 순서 1. Spring Security + JWT에서 Keycloak/OIDC 구조로 전환한 이유 2. Direct Access Grants에서 Authorization Code + PKCE로 전환하기 3. issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정 4. JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유 5. 로그아웃에서만 500 에러가 발생한 이유: Caffeine Cache TTL 불일치 1. 기존에는 JW.. [Server Migration] 구형 미니PC 서버 장애 및 신규 미니 PC 구축기 1. 사건의 흐름AM 02:30 : 서버 하드웨어(쿨러)에서 극심한 소음 발생. 긴급 재부팅 후 임시 조치AM 09:00 : 오전 중 정상 작동 확인 후 안심AM 11:00 : 외부에서 접근 시도 → 서버 전원 완전 다운으로 접근 불가능PM 14: 00 : 집으로 복귀 및 재부팅 시도 → 하드웨어 소음 발생PM 16:00 : 컴퓨터 수리점 방문 → "수리 불가" 판정PM 17:00 : 미니 PC 당근으로 좋은 매물 가져오기PM 18:00 : OS Windows -> Ubuntu 설치 및 이전 서버에서 Nginx 및 docker-compose 설정 백업PM 19:00 : 신규 서버 인프라 구축 (보안 설정 및 접근 간편화)PM 20:00 ~ : CI/CD 재구축 및 기존 서비스 정상화 2. 새로운 서버 해.. [Spring Security] Direct Access Grants에서 Authorization Code + PKCE로 전환하기 이 글은 Spring Security + JWT 기반 인증 구조를 Keycloak/OIDC 기반 구조로 전환하며 겪은 과정을 정리한 시리즈입니다.현재 글: 2편 - Direct Access Grants에서 Authorization Code + PKCE로 전환하기시리즈 순서 1. Spring Security + JWT에서 Keycloak/OIDC 구조로 전환한 이유 2. Direct Access Grants에서 Authorization Code + PKCE로 전환하기 3. issuer-uri 한 줄로 Keycloak JWT가 검증되는 과정 4. JWT에는 ADMIN이 있는데 hasRole(“ADMIN”)이 실패한 이유 5. 로그아웃에서만 500 에러가 발생한 이유: Caffeine Cache TT.. 이전 1 2 3 4 5 다음