배포 이후 커뮤니케이션을 0으로. feat.토스 러너스하이 2기
·
카테고리 없음
토스 러너스하이를 마치며 – 한 달 동안, 어디까지 해볼 수 있을까토스 러너스하이를 마치게 되었다.돌이켜보면, 가장 먼저 들었던 생각은 “나는 정말 운이 좋았다”였다.이 프로그램이 나에게 던진 질문은 굉장히 단순했다고 생각한다.“한 달이라는 시간을 줄 테니, 어디까지 해볼 수 있습니까?” 문제를 찾고 해결하는 사람이 되고 싶었다(이전 글에 이어서 - 테스트 코드 기반 Swagger 문서를 생성)나는 항상 “코드를 잘 짜는 개발자”보다“부족한 부분을 찾아서 더 이롭게 만드는 개발자”가 되고 싶었다.그리고 현업에서 일하면서 느낀 건 내가 개발자로서 가장 재미를 느끼는 순간은새로운 기술을 쓰는 순간보다성능을 튜닝하는 순간보다“문제를 진단하고, 구조를 바꾸는 순간”이었다.그게 ‘아, 나 지금 개발하고 있구나’라..
실시간 채팅에서 메시지가 한쪽에만 도착하는 문제를 해결한 이야기
·
카테고리 없음
고객-상담사 실시간 채팅 솔루션을 운영하면서, 가장 찾기 어려웠던 버그 중 하나가 "부분 전달" 문제였다. 메시지가 완전히 유실되는 게 아니라, 한쪽에만 도착하고 다른 쪽에는 안 가는 현상. 이 글에서는 이 문제를 어떻게 발견하고, 어떤 판단을 거쳐 해결했는지 정리해본다.시스템 개요먼저 간단하게 시스템 구조를 설명하면, 이 채팅 솔루션은 고객이 웹 브라우저에서 상담을 요청하면 상담사와 실시간으로 대화하는 구조다. Spring Boot 2.5 / Java 8 기반 멀티모듈 프로젝트STOMP over WebSocket — 클라이언트 실시간 통신RabbitMQ — STOMP Broker Relay로 메시지 라우팅 (AMQP 5672 + STOMP Plugin 61613)Elasticsearch — 상담 세션(..
이직 후 첫 회고록 - MSA 멀티모듈 API 명세서 도입기
·
카테고리 없음
AI 백엔드 팀으로 이직 후 작성하는 첫 회고록이다.새로운 환경에서 업무를 시작하면서 가장 먼저 중요하게 여긴 것은 도메인 파악이었다.이를 빠르게 진행하기 위해 설계도와 프로젝트 셋업을 우선적으로 시작했다. 이 프로젝트는 MSA 환경에서 동작하는 멀티 모듈 기반이었으며, 브랜치 전략 또한 이전 회사와 달라서 별도로 분석이 필요했다. 업무 중 자사 서비스를 이용하며 API를 살펴보던 중, 하나의 Request 객체가 여러 Controller에서 전역적으로 사용되고 있다는 점을 발견했다. 다양한 곳에서 재사용되는 구조였지만, 필드에 @Nullable 등의 명시적 제약이 없어 어떤 필드가 필수인지 파악이 어려웠다. API 명세서는 postman, request 파일, openapi 파일 등으로 따로 관리되고 ..
'Diagram_AI' 플러그인 개발
·
Plugin
평소 새로운 프로젝트에 투입되거나 여러 프로젝트를 동시에 진행할 때, 도메인 구조를 빠르게 파악할 수 있도록 도와주는 프로그램이 있으면 좋겠다고 생각했습니다. 제가 주력으로 사용하는 Spring Framework는 Bean 간의 관계를 잘 분석하면 도메인 구조를 다이어그램으로 시각화하는 것이 충분히 가능하다고 판단했고, 이를 자동화하는 도구를 개발하게 되었습니다. 우선 SpringFramework의 동작 과정에 대해서 학습이 필요했습니다.Spring Boot가 실행될 때 내부적으로 어떤 과정이 발생하는가?SpringApplication.run(...) 실행Spring Boot 애플리케이션을 시작하는 가장 기본적인 엔트리 포인트로, 내부적으로 SpringApplication 객체를 생성하고 실행함.이 과정..
만만하지 않았던 블랙프라이데이
·
카테고리 없음
블랙 프라이데이 초과 결제, 세 번 실패하고 Redis로 해결한 이야기전기 자전거 180대 한정 판매에서 7건 초과 결제가 발생했다. 단순히 락 하나 추가하는 게 아니라, 왜 그게 문제인지를 반복해서 틀리면서 이해하게 된 과정을 정리한다.사건의 경위블랙 프라이데이 선착순 할인 이벤트였다. 전기 자전거 180대 한정, 최초 구매자에게 30% 할인.이벤트가 시작되자마자 동시 인입이 3천 건을 넘었다. 그리고 결과는 180대 재고에 187건 결제 승인이었다. 초과된 7명에게 환불을 해야 했다. 금전적 손실은 물론, CS 공수와 브랜드 신뢰도 손상까지 따라왔다.왜 초과 결제가 발생했나 — 구조의 문제로그를 역추적해보니 원인이 명확했다. 당시 결제 플로우는 이랬다사용자: 결제하기 클릭 → PG사 confir..
MSA (2) Spring Cloud Gateway - Filter
·
Infra
FIlter Spring Cloud Gateway에서 Filter는 요청(Request) 및 응답(Response)을 처리하거나 변환하는 데 사용된다. 필터를 설정 이유공통 로직 처리:모든 요청에 대해 동일한 작업(예: 인증, 로깅)을 중앙에서 처리가 가능하다.유연한 요청 처리:서비스별로 맞춤형 필터를 적용해 요청을 동적으로 변환이 가능하다.관리와 확장성:개별 서비스에 중복 코드를 작성할 필요 없이 Gateway에서 일괄 관리 가능하다..yml 필터 작성server: port: 8000eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8..
MSA (1) - Spring Cloud Netflix Eureka
·
Infra
Spring Cloud Netflix EurekaService DiscoveryEureka는 Spring Cloud Netflix에서 제공하는 서비스 디스커버리 도구로, MSA 환경에서 각 서비스의 위치(IP와 포트)를 동적으로 관리한다.서비스 디스커버리란?MSA에서는 각 서비스가 독립적으로 배포되고 확장되므로, 고정된 IP와 포트를 사용하는 것이 어렵다.Eureka는 서비스 레지스트리로 작동하여 각 서비스의 위치 정보를 등록하고, 다른 서비스가 이를 검색할 수 있도록 돕는다.Eureka Server와 Eureka ClientEureka Server: 모든 서비스의 위치 정보를 저장 및 관리.Eureka Client: 애플리케이션이 Eureka Server에 자신의 위치를 등록하거나, 다른 서비스의 위치..
서비스 이자율 정책
·
카테고리 없음
미납 회수를 위한 연체 이자 도입 기획구독 시스템의 미납 회수율을 개선하고, 결제 없이 서비스를 지속적으로 이용하는 연체 사용자 문제를 해결하기 위해 연체 이자 시스템을 도입하고자 합니다.주요 신용카드사의 연체 관리 방식을 참고하고, 관련 법적 요구 사항을 기반으로 구체화하였습니다.현재 로직 분석1. 미납 결제 시도 시bill_id가 존재하는지 확인가장 최근 데이터의 status 확인status = success이면 정상 결제 완료 → 결제 시도 ❌status != success이면 미납 상태 → 결제 재시도 retry_count에 따라 이자율 증가2. 문제점같은 구독자라도 연체 기간이 다르면 부담하는 이자가 다를 수 있음현재 방식은 retry_count만 고려하여 이자율을 증가시키기 때문에, 장기 연체..
Redis Pub/Sub - 모니터링 w.Prometheus & Grafana
·
DB
Redis Pub/Sub - 모니터링 w/ Prometheus & Grafana1. Redis Pub/Sub (Publish/Subscribe) 패턴Pub/Sub란?Redis의 Pub/Sub(Publish/Subscribe)는 메시지 브로커 역할을 수행하며, 클라이언트 간의 실시간 메시징을 가능하게 한다.Publisher:특정 채널에 메시지를 발행하는 역할.Subscriber:특정 채널을 구독하고, 발행된 메시지를 수신.Redis Pub/Sub의 특징:In-Memory 기반으로, 매우 빠른 메시징 속도 제공.비동기 방식으로 실시간 처리 가능.메시지는 발행 시점에만 전달되며, 서버 다운 시 누락 가능.MSA(Microservices Architecture)에서의 활용:비동기 메시징을 통해 서비스 간 결합도..
Redis 성능 비교
·
DB
Redis: In-Memory Database로의 활용과 성능 분석Redis란?Redis(Remote Dictionary Server)는 데이터를 메모리에 저장하여 빠른 데이터 처리와 높은 성능을 제공하는 In-Memory Database이다.디스크 대비 매우 빠른 응답 속도를 제공하며, 다양한 데이터 타입과 기능을 통해 데이터베이스, 캐시, 메시지 브로커 등으로 활용 가능하다.Redis의 특징In-Memory Database:데이터를 메모리에 저장하여 빠른 읽기/쓰기 속도 제공.휘발성 데이터로 기본적으로 시스템 종료 시 데이터가 삭제되지만, 데이터 영구화를 위한 옵션 제공.다양한 데이터 타입:Strings, Lists, Sets, Hashes, Sorted Sets 등 다양한 데이터 구조 지원.데이터 ..