전체 글 115

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

운영 중인 앱: 축잘알 테스트 (구글 플레이) 🐇 비동기 처리로 API 성능과 데이터 정확성을 모두 잡을 수 있을까?– 퀴즈 결과 저장 API에 JMeter로 부하 테스트를 걸어봤다혼자 기획하고 개발 한 퀴즈 앱 ‘축잘알 테스트’에서는 사용자가 퀴즈를 풀고 나면 결과를 저장하는 API가 있다. 앱의 특성상, 사용자 수가 많아질수록 가장 자주 호출되는 API가 바로 이 퀴즈 결과 저장 API다. 그리고 단순 조회가 아니라 데이터를 변경하는 API이기도 하다. 그래서 직접 JMeter를 활용해 이 API에 고부하 테스트를 걸어보고, 동기/비동기 구조에 따른 응답 속도와 데이터 정확성을 비교해보기로 했다. 🎯 실험 배경 테스트 대상: 퀴즈 결과 저장 API단일 사용자(nickName: tttt)가 여러..

그냥 코딩 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로 유저 랭킹 조회, 정말 더 빠를까?게임이나 퀴즈 서비스에서 랭킹 기능은 빠질 수 없다.근데 어떻게 불러오느냐에 따라 체감 속도는 완전히 달라진다.그래서 직접 MySQL vs Redis 성능을 비교해봤다.과연 Redis는 정말 빠를까?✅ 기존 방식: MySQL로 랭킹 조회 처음엔 이렇게 했다:10분마다 랭킹 데이터를 UserRankInfo 테이블에 저장요청이 올 때마다 MySQL에서 다시 조회@Query(nativeQuery = true, value = "SELECT * FROM front_user_info WHERE total_quiz_count > 30 ORDER BY percentage_of_answer DESC..

혼자공부한거 2025.04.17

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

운영 중인 앱: 축잘알 테스트 (구글 플레이)🎯 랜덤 퀴즈 데이터 추출, 어떤 방식이 가장 빠를까?MySQL vs Java vs Redis – 실전 성능 비교내가 만든 축구 퀴즈 앱에서는사용자가 5, 10, 15, 20문제를 랜덤으로 풀 수 있는 기능이 핵심이다.처음에는 그냥 MySQL의 RAND() 함수 쓰면 끝 아니야? 싶었는데...퀴즈가 쌓이고, 유저 수가 많아지다 보니 점점 느려지기 시작했다.그래서 아래 세 가지 방식으로 직접 성능을 비교해봤다: ✅ 방식 1: MySQL RAND() @Query(nativeQuery=true, value="SELECT * FROM quiz_info ORDER BY rand() LIMIT ?1")List findRandomQuiz(@Param("number")Lo..

혼자공부한거 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, ..

카테고리 없음 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