분류 전체보기 115

API 성능 병목과 데이터 누락, RabbitMQ 비동기 구조로 해결해보기

운영 중인 앱: 축잘알 테스트 (구글 플레이) 비동기 처리로 API 성능과 데이터 정확성을 모두 잡을 수 있을까?– 퀴즈 결과 저장 API에 JMeter로 부하 테스트를 걸어봤다 문제 인식 앱을 운영하면서 가장 많이 호출되는 API 중 하나가 퀴즈 결과 저장 API였다.단순 조회가 아니라 데이터를 변경하는 API다 보니, 사용자 수가 많아질수록 정합성 문제가 생기지 않을까 하는 우려가 있었다. 실제로 테스트 도중, 특정 사용자 계정의 퀴즈 수치가 기대값보다 적게 저장되는 현상을 발견했다.처음에는 코드상의 실수나 일시적인 문제라고 생각했지만, 구조적인 동시성 문제일 가능성이 높다고 판단했다. 그래서 부하 상황에서 어떤 문제가 생기는지 직접 확인하고,구조를 바꿨을 때 응답 속도나 데이터 정합성이 얼마나 달..

그냥 코딩 2025.04.24

혼자 만든 앱에 무중단 배포 적용해보기 – Jenkins, Docker, Nginx

운영 중인 앱: 축잘알 테스트 (구글 플레이) 🧭 왜 무중단 배포를 하게 됐을까혼자서 기획하고 개발한 축잘알 테스트 앱은EC2에서 Spring Boot + Docker + Nginx 조합으로 서비스되고 있다.처음에는 그냥 수동으로 배포했다.방법은 아주 단순했다:1. GitHub에 코드 push2. EC2에 SSH 접속해서 git pull3. Docker 이미지 다시 만들고 기존 컨테이너 정리4. 새 컨테이너 띄우고 Nginx 설정 수정 근데 이 과정이 너무 귀찮았다.캐시도 직접 지워야 하고, SSH도 매번 접속해야 했다.그래서 자동화 스크립트를 먼저 만들었고,이후에는 Jenkins + GitHub Webhook으로 자동 배포까지 붙였다.💥 무중단 배포를 결심하게 된 계기새벽에 배포하면서 서버를 잠깐 ..

혼자공부한거 2025.04.24

Redis로 유저 랭킹을 불러오면 정말 더 빠를까?

운영 중인 앱: 축잘알 테스트 (구글 플레이)Redis로 유저 랭킹 조회, 정말 더 빠를까?앱을 켜고 랭킹 탭에 들어갈 때마다, 가끔 1~2초간 로딩이 걸리는 현상이 있었다.순간적으로 멈춘 듯한 느낌이 들고, 사용자 입장에선 꽤 거슬리는 경험이었다.단순히 네트워크 문제라고 넘기기엔 재현율이 높았고,랭킹 데이터를 매번 MySQL에서 직접 조회하고 정렬하는 방식이 원인일 수 있겠다고 판단했다.그래서 실제로 MySQL과 Redis 간의 조회 성능을 비교 테스트해봤다.과연, Redis는 정말 빠를까?기존 방식: MySQL로 랭킹 조회 처음엔 이렇게 했다:10분마다 랭킹 데이터를 UserRankInfo 테이블에 저장요청이 올 때마다 MySQL에서 다시 조회@Query(nativeQuery = true, value..

혼자공부한거 2025.04.17

랜덤 퀴즈 데이터 추출, 어떤 방식이 가장 빠를까? (MySQL vs Redis vs Java)

운영 중인 앱: 축잘알 테스트 (구글 플레이)랜덤 퀴즈 데이터 추출, 어떤 방식이 가장 빠를까?MySQL vs Java vs Redis – 실전 부하 테스트 성능 비교내가 만든 축구 퀴즈 앱에서는사용자가 5, 10, 15, 20문제를 랜덤으로 풀 수 있는 기능이 핵심이다.처음에는 MySQL의 RAND() 함수를 사용했는데,내부 동작을 분석해보니 모든 레코드에 랜덤 값을 부여한 뒤 정렬하는 구조였고,이 과정에서 인덱스를 전혀 활용할 수 없다는 점(B+ Tree 구조 특성상)이 비효율적으로 느껴졌다.데이터가 10만 건 이상으로 늘어나면 정렬 비용은 O(n log n)까지 올라가고,랜덤 추출 시마다 전체 테이블을 스캔한다는 점에서 병목이 발생할 수밖에 없겠다는 생각이 들었다.그래서 실제로 얼마나 차이가 나는지..

혼자공부한거 2025.04.16

키클락 취약점 살펴보기 (CVE-2024-8698)

최근에 키클락에 어떤 취약점이 있는지 그냥 궁금해서 검색해봤다. 2024년 9월에 나온 취약점이다 간단하게 SAML 서명 검증을 우회해버리는 취약점이다.. 그냥 SSO 시스템을 뚫어버리는 엄청난 취약점.. 취약점 분석  안랩 https://asec.ahnlab.com/ko/83323/ Keycloak 보안 업데이트 권고(CVE-2024-8698) - ASEC개요 Keycloak에서 발생하는 취약점을 해결하는 업데이트를 발표하였습니다. 해당하는 버전의 사용자는 최신 버전으로 업데이트하시기 바랍니다.    대상 제품   CVE-2024-8698 Keycloak 버전: ~ 25.0.6(asec.ahnlab.com 안랩의 데이터이고 내용은 Keycloak XMLSignatureUtil 클래스 내의 SAML 서명..

혼자공부한거 2024.12.01

[스프링 부트] keycloak 사용 SSO(OIDC) 인증 서버 간단하게 구축해보기

아키텍처그림은 프로파게이션의 모델 그림이고 나는 서비스 1개만 구성되어있다. 흐름 설명1. 사용자 인증  사용자가 인증이 필요한 시스템에 접근했을경우 Spring Boot는 사용자를 Keycloak 로그인 페이지로 보냅니다.  사용자는 로그인 화면에서 아이디와 비밀번호를 입력하게 됩니다. 2. JWT 토큰 발급   사용자가 로그인에 성공하면 Keycloak은 사용자에게 JWT 토큰을 발급합니다.   이 토큰은 사용자 정보를 담고 있으며, 나중에 인증된 요청임을 증명하는 데 사용됩니다. 3. 서비스 요청   사용자는 로그인 후 받은 JWT 토큰을 가지고, Spring Boot 애플리케이션에 요청을 보냅니다. 이 토큰은 요청의          Authorization 헤더에 포함됩니다.    Spring B..

스프링부트 2024.11.25

[스프링 부트] 비트 마스킹으로 태그 필터링 최적화하기

프로젝트 개요이건 테오의 스프린트 15기에서 만들었던 프로젝트였고,길거리의 분위기를 담은 사진을 공유하는 서비스였다. 게시글은 사진 + 태그 기반으로 검색할 수 있는 구조였다.구현한 API 흐름사용자가 카카오맵에서 위치를 찍는다 (위도, 경도)원하는 해시태그를 선택하면, 근처 게시물이 표시된다. 근데 개발은 스프린트 방식으로 진행됐고,기간은 단 2일, 그리고 백엔드는 나 혼자였다.그래서 단순하면서도 빠르게 동작할 수 있는 구조를 고민했고,그 결과 비트마스킹을 통한 태그 필터링을 도입하게 됐다. 비트마스킹으로 태그 구조화프론트에서는 총 12개의 태그를 아래처럼 구성했고,export const tagList: Tag[] = [ { id: 0, name: "편안한" }, { id: 1, name: "조용한..

카테고리 없음 2024.11.23

SSO 란 무엇일까

SSO는 이름 그대로 단일 로그인, 즉 한번의 로그인으로 여러개의 애플리케이션들을 이용할 수 있게해주는 서비스 입니다. 한번의 로그인으로 구글 관련 서비스를 모두 이용할수 있는것이다. 장점ID/Password 개별 관리의 위험성 해소사용자 편의성 증가단점구축비용이 비싸고 시스템 복잡도 증가 Single Point of Failure구현 방식위임(Delegation) 방식SSO 에이전트가 인증을 대행하는 방식대상 애플리케이션의 인증 방식을 변경하기 어려울 때 많이 사용사용자의 인증 정보를 SSO 에이전트가 관리하며 로그인 대신 수행 이건 앞단에 SSO 서버를 두고 리버스 프록시 형태로 서비스를 제공한다.사용자의 인증 정보를 Agent가 관리하여 대신 로그인 해주는 방식이다.EX ) ID / password..

혼자공부한거 2024.11.22

스프링 부트 Redis 분산 락 활용 동시성 제어

📌 프로젝트 다시 보기내가 만들었던 미간지 프로젝트를 돌아보면서 개선할 부분이 없을까 하고 코드를 다시 들여다봤다.그러다 발견한 문제:멀티스레드 상황에서 게시물 조회 시 조회수가 정확히 증가하지 않음 🚨 동시성 문제 상황📉 동시 요청이 들어오면 조회수가 꼬인다.시간스레드 1스레드 2T1findById → viewCount = 10 T2 findById → viewCount = 10T3viewCount++ → 11 T4 viewCount++ → 11T5save(viewCount = 11) T6 save(viewCount = 11)기대값은 12여야 하지만 실제로는 11동시 요청이 많아지면 손실도 커진다이런 문제가 재고 관리 시스템에서 일어난다면?=> 데이터 정합성 완전 박살남. 🔧 개선 전: 단순 조..

스프링부트 2024.07.04