[오늘가챠] 유저의 수집욕을 자극하라: 자체 업적 및 뱃지 시스템 구축
·
◈ Yermi Project/오늘가챠🃏
'오늘가챠' 앱의 핵심 재미 요소는 단순히 카드를 모으는 것을 넘어, 특정한 조건을 달성했을 때 뱃지(업적)와 보상을 획득하는 것입니다. 이를 구현하기 위해 백엔드에서 랭킹 통계와 배지 룰을 어떻게 조합했는지에 대한 이야기입니다.1. 하드코딩과 동적 생성의 조화뱃지는 'SSR 10장 수집', '특정 테마(음식) 50장 수집' 등 조건이 매우 다양합니다. 이를 일일이 DB에 데이터로 관리하면 유지보수가 어려워, 자바 코드 레벨에서 명시적으로 관리하는 BadgeDef 레코드를 도입했습니다. 실제 BadgeService.java의 뱃지 정의 코드입니다.// BadgeService.java — 뱃지 정의 레코드와 핵심 뱃지 목록public record BadgeDef(String id, String catego..
[Kafka] 커밋 오프셋에는 운송장 번호 칸이 없다 [Kafka 커밋 오프셋의 한계와 DB 장부 설계]
·
▣ Infra & DevOps/Kafka🐦‍🔥
1편에서 우리는 "제휴사별 컨슈머 그룹"이라는 자연스러운 설계를 세웠고, 그게 조건에 따라 표준일 수도 무의미할 수도 있다는 데까지 왔다. 2편은 그 조건을 가르는 판별식을 코드 레벨의 물리적 근거까지 파고든다.무거운 조항 두 개제휴사와의 협의 테이블에서 이런 조항이 확정됐다고 하자.운송장별 확인(ACK): "우리는 운송장별로 '몇 번 스캔까지 잘 반영했는지'를 알려주겠다. 장애 후 재전송은 우리가 확인한 위치 다음부터 해달라."회수(Catch-up): "못 받은 구간은 나중에 요청하겠다. 그때 보낸 것과 동일한 내용으로 달라. 일주일 지난 것도." 유실이 용납되지 않는 연동에서는 흔하고 합리적인 요구다. 실제로 GitHub 웹훅 설정 화면에는 배달 건별 성공/실패와 [Redeliver] 버튼이 있고, ..
[KubeCon Japan 2026] Gateway API 마이그레이션 : Ingress-NGINX 리타이어 이후를 준비하며🚪
·
▣ Infra & DevOps/KubeCon Japan 2026⚓
첫날 오후 3시 50분, 3층 315호 세션입니다. 실무에서 당장 부딪히게 될 주제라 이번 행사에서 가장 기다린 세션 중 하나였습니다. I Tested 7 So You Only Need 1: Your First Gateway API Migration in 5 MinutesHoon Jo (CNCF Ambassador, KubernetesLab.dev)⏰ 왜 지금 이 이야기를 해야 하나세션 소개 문구가 이렇게 시작합니다. "당신의 팀이 방금 Ingress NGINX가 리타이어했다는 소식을 들었습니다. 누군가는 Gateway API로 옮겨야 하고, 그 누군가는 바로 당신입니다." Ingress-NGINX 컨트롤러가 올해 3월 리타이어했습니다. Ingress 리소스가 사라진 건 아니지만 지배적 구현체의 개발과 ..
[KubeCon Japan 2026] The State of Cloud Native : 데이터로 본 생태계와 AI로의 전환📊
·
▣ Infra & DevOps/KubeCon Japan 2026⚓
첫날 오후 2시 50분, 메인홀에서 이어진 세션입니다. CNCF TOC 멤버가 직접 생태계 현황을 데이터로 정리해주는 자리라 놓치고 싶지 않았습니다. The State of Cloud Native: The Shift Towards AIKatie Gamanji (Principal Engineer @Apple, CNCF TOC)⏳ 왜 컨테이너 대중화까지 7년이 걸렸나컨테이너를 돌리려면 cgroups(자원 한계)와 namespaces(볼 수 있는 범위) 두 원시 요소가 필요합니다. 그런데 이 둘은 2008년부터 Linux 커널에 있었습니다. Kubernetes 오픈소스화는 2015년이고요. 7년의 공백이 있었던 셈입니다. 기술이 조직의 경쟁 우위가 되면서 세 가지 과제가 동시에 부각됐기 때문이라는 설명입니다...
[오늘가챠] 백엔드 코드 리팩토링: Facade 패턴과 글로벌 예외 처리 적용기
·
◈ Yermi Project/오늘가챠🃏
애플리케이션에 기능이 추가되면서 컨트롤러(Controller) 계층이 각종 서비스 참조와 try-catch 블록으로 비대해졌습니다. 이를 우아한 아키텍처로 구원한 리팩토링 과정입니다.1. 순환 참조를 끊는 구원자: 퍼사드(Facade) 패턴'카드 뽑기' 트랜잭션은 1) 유저 골드 차감, 2) 랜덤 사진 선택, 3) 뱃지 달성 검사 등 여러 도메인을 가로지릅니다. 서비스들이 서로 얽히는 것을 막기 위해 별도의 Facade(퍼사드) 계층을 두었습니다. 실제 CardFacade.java의 핵심 가챠 로직입니다.// CardFacade.java — 가챠 뽑기 트랜잭션 전체 코드@Slf4j@Service@RequiredArgsConstructorpublic class CardFacade { private f..
[K8s] 수십 개의 클러스터를 하나처럼 관리하기: 멀티 클러스터와 Cluster API
·
▣ Infra & DevOps/Kubernetes🚢
이번 글에서는 멀티 클러스터 전략과, 클러스터 자체를 YAML로 선언하여 관리하는 Cluster API에 대해 다룹니다.1. 왜 멀티 클러스터인가?단일 클러스터의 한계는 규모가 커질수록 뚜렷해집니다.요구 사항단일 클러스터멀티 클러스터재해 복구 (DR)리전 장애 시 전체 서비스 중단다른 리전 클러스터가 트래픽 인수환경 격리네임스페이스 수준 격리 (논리적)클러스터 수준 격리 (물리적)규정 준수데이터가 해외 리전에 저장될 위험국가별 클러스터로 데이터 주권 보장벤더 종속특정 클라우드에 100% 종속AWS + GCP 등 멀티 클라우드 전략Blast Radius설정 실수가 전체 서비스에 영향영향 범위를 단일 클러스터로 제한2. Cluster API: 클러스터를 YAML로 선언하다K8s에서는 Pod, Service,..
[Kafka] 제휴사가 10곳이면 컨슈머 그룹도 10개일까? [택배 추적 파이프라인 설계]
·
▣ Infra & DevOps/Kafka🐦‍🔥
실시간 택배 추적 파이프라인으로 배우는 Kafka 팬아웃 설계.1편은 문제 제기와 "컨슈머 그룹이 원래 무엇을 위한 물건인지"까지 간다.이런 시스템을 만든다고 해보자택배사에서 일한다고 상상해보자. 허브에서 택배 상자가 스캔될 때마다 이벤트가 생긴다. "집화 완료", "허브 도착", "배송 출발", "배송 완료". 이 이벤트를 트래킹 제휴사들에게 실시간으로 밀어줘야 한다. 네이버 같은 포털에서 배송 조회하면 실시간으로 상태가 갱신되는 것, 그 뒷단이 바로 이 파이프라인이다. 요구사항을 정리하면:스캔 이벤트는 운송장별로 순서가 보장되어야 한다. "배송 완료"가 먼저 가면 사고다.서로 다른 운송장끼리는 아무 상관이 없다. 내 택배가 늦는다고 남의 택배 조회가 멈추면 안 된다.제휴사는 여러 곳이고(10곳이라 하..