Spring (8) 썸네일형 리스트형 [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] 예외 처리 종류 & 상태 코드 1. HTTP 상태 코드 (자주 쓰이는 것)✅ 2xx (성공)200 OK : 조회 / 수정 성공, 일반적인 성공 응답201 Created : 리소스 생성 성공 (보통 Location 헤더 포함)204 No Content : 성공했지만 응답 바디 없음 (삭제 성공 등)❌ 4xx (클라이언트 요청 문제)400 Bad Request : 요청 / 값 형식이 잘못됨(검증 실패, 타입 변환 실패, JSON 파싱 실패 등)401 Unauthorized : 인증 실패 (로그인, 토큰 없음, 만료 등)403 Forbidden : 인증은 됐지만 권한 없음 (ROLE 부족)404 Not Found : 리소스 없음 (id로 조회했는데 없음)405 Method Not Allowed : GET만 되는데 POST로 호출 시409 .. [Spring] 출금 및 장부 시스템 구현 개요 목적앞서 충전 기능을 구현하면서 자연스럽게 출금 기능과 장부(내부 정산용)의 필요성이 느꼈다.2025.11.29 - [Spring] - [Spring] 충전 기능 구현 with. TossPayments또한, 서비스 관리자는 내부 지갑의 돈의 흐름을 기록하고 이를 통해 검산이 가능해야 한다고 생각했다.모든 충전/출금 내역을 기록해 두고," 총 충전액 = (모든) 유저 잔액 + 출금 완료 잔액 + 출금 대기 잔액"이 성립해야 손실 없이 정상적으로 동작하다고 볼 수 있기 때문이다.따라서 모든 충전/출금 에 대한 기록을 남기고 그 기록을 기반으로 서비스 정합성 체크를 할 수 있는 장부를 만드는 것이 이번 구현의 목적이다. 설계 고민출금 수단 선택충전은 토스페이먼츠를 API 를 사용했지만, 출금까지 PG로 .. [Spring] 충전 기능 구현 with. TossPayments 개요 목적사용자들이 카드, 계좌이체로 금액을 충전해 서비스 내부 지갑을 통해 개인 간 거래가 목적이다.현 서비스에서 내부 화폐 처럼 동작하도록 설계하고, 중고거래 등 개인 ↔ 개인의 결제 흐름 전체를 스스로 설계하고 운영해 보는 것을 목표로 했다. 설계 고민현실감 있는 결제 경험단순히 금액만 더해 주는 충전 보다는, 실제 결제 서비스와 최대한 비슷한 UI/UX와 승인 흐름 구현을 원했다.결제 요청 → 인증(카드/간편결제 선택) → 승인/실패 콜백까지 실제 상용 결제처럼 동작하도록 설계했다.도메인 모델(엔티티, Enum)과 PG 응답의 정합성결제수단, 간편결제 종류 등 필드를 서비스의 Entity와 Enum에 어떻게 똑같이 녹여낼지 고민했다. 단순 문자열 저장이 아닌, 결제수단, 간편결제 타입, PG상태.. [Spring] 웹소켓(STOMP) 을 이용한 채팅 구현 웹소켓이란?웹 서버와 브라우저 즉, 클라이언트 간의 지속적인 TCP연결을 통해 양방향 실시간 통신을가능하게 하는 컴퓨터 통신 프로토콜이다. STOMP란?Simple Text Oriented Messaging Protocol의 약자로,웹소켓 위에서 동작하는 서브 프로토콜이다.클라이언트와 서버 간에 메시지 형식과 내용을 정의하여 효율적으로 메시지를 주고받을 수 있게하며,메시지 브로커를 활용한 pulisher - subscriber 방식으로 메시지를 쉽게 처리하도록 돕는다. 따라서 Spring Boot, Websocket(STOMP), JPA, MySQL을 이용해서1:1 채팅을 구현해보았다. 구현 1. 핵심 아키텍처 프로토콜/전달 : Websocket + STOMPController : STOMP 메시지처리.. [Spring] 카카오 로그인 API 연결 해보기 https://developers.kakao.com/ Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com1. kakao developers 가입하기 2. 애플리케이션 추가하기 3. 앱 이름, 회사명, 카테고리 입력 및 서택 후 저장 4. REST API 키 확인하기 5. 플랫폼 등록하기javaspring 로컬 서버주소 -> http://localhost:8080 6. Redirect URL 등록하러가기 7. Redirect URL 등록 8. 동의항목 선택하기 (사용자의 정보 중 필요한 것만) 9. 문서 > 카카오 로그인 > 디자인 가이드 .. 이전 1 다음