Project : RainMind 개발일지 - 14 [2번째 최적화 수행 기록(수치화)]
이번 최적화는 redis 알람 큐의 설계가 적절한지, dequeue 시간 및 메모리 테스트에 관한 것이다. 초반에, redis를 알람 큐로 쓸때 모든 유저의 날씨 알람을 하나의 key에 전부 저장할지, 아니면 유저별로 key를 할당하는 아키텍처가 적절한지 고민했었다. Redis...
이번 최적화는 redis 알람 큐의 설계가 적절한지, dequeue 시간 및 메모리 테스트에 관한 것이다. 초반에, redis를 알람 큐로 쓸때 모든 유저의 날씨 알람을 하나의 key에 전부 저장할지, 아니면 유저별로 key를 할당하는 아키텍처가 적절한지 고민했었다. Redis...
성능 최적화를 하며 이런 쿼리를 쓴 적이 있다. @Modifying @Transactional @Query(value = """INSERT INTO schedules (user_id, title, location_id, start_at, end_at) SELECT :user...
회원가입과 로그인 기능 테스트시 사용한 스크립트와 PromQL 쿼리, 데이터 수치화를 기록한다. 회원가입 기능 문제 제시: 수백명의 유저가 지속적으로 회원가입을 수행할 때 처리 속도가 낮아지는 병목 현상 발생. 시나리오: 문제 파악을 위해 100명...
스케줄 생성 API 테스트시 사용한 스크립트와 PromQL 쿼리, 데이터 수치화를 기록한다. 스케줄 생성 기능 문제 제시: ScheduleService.kt의 scheduleRepository.findAllByUserId(user.id!!).size 부분은, JVM...
본 글을 최적화 수행 기록(수치화 포함)에 관한 글이다. 수치적 요약 및 스크립트/사용한 PromQL 쿼리, 정제된 데이터는 다음 포스팅에 기록할 예정이다. 1) 회원가입 기능 유저 100명이, 3분동안 계속 회원가입 로직을 수행할 때를 모니터링해서 병목 지점이 있는지 찾고자 했...
Actuator, prometheus를 이용하여 스프링 앱의 CPU, 메모리 등을 모니터링한다. 해당 목표를 위해 거쳐야 할 절차들을 기록한다. 1) actuator, prometheus 의존성 추가(build.gradle.kts) implementation("org.spring...
Redis의 메모리 사용량, DB 응답시간 등을 분석하기 위하여 k6를 이용한 성능 테스트를 진행해보려고 한다. 1) 일단 k6를 설치했다. https://grafana.com/docs/k6/latest/set-up/install-k6/ 에 나와있는 방법대로, Linux 명령어를...
기능이 대략 완성되면 배포도 한번 생각해보고 있는데, docker와 kubernetes 관련해서 정리해보겠다. Docker 개발한 애플리케이션과 이를 실행하는데 필요한 환경들을 컨테이너에 담아, 누구의 어떤 환경에서도 동일하게 실행할 수 있게 해주는 플랫폼이다. 사람마다 OS,...
현재 코드에서는, 단기예보조회를 일정 시간마다 자동으로 호출 & 알람 재시도 로직을 자동으로 호출하기 위해 Scheduling을 사용해야 한다. 그러나 pod가 여러대일 경우, 각 pod마다 똑같은 작업인 scheduling을 모두 수행하게 되면 성능이 나빠질 수 있다. ...
Spring과 FastAPI의 아키텍처 관리 방법이 또 다른것 같아 정리하면 좋을 것 같다. Spring Spring 프레임워크의 경우, 철학이 “객체의 생명주기를 개발자가 아니라 프레임워크가 관리한다”의 방식이다. 이른 제어권이 거꾸로 되었다고 해서 Ioc(Inversion o...
FastAPI 코드를 작성하며 async await 키워드를 많이 사용했었는데, Lock 및 동시성 제어 파트에서도 Spring과 비교하여 정리를 해보면 좋을 것 같다. Spring - Lock 1) synchronized 어떤 자원에 동시에 접근하여 쓰기 연산을 수행하면, 결과...
Spring에서 redis enqueue / dequeue를 위해 발행했던 event, FastAPI에서는 해당 기능이 존재하지 않아 직접 event_publisher.py를 이용해야 했었다. Spring에서의 Event 처리, 그리고 FastAPI에서 이를 흉내내어 구현했던 방...
코드를 짜다 보니 fastAPI와 spring의 트랜잭션 선언 방식과 원리가 비슷한 것 같기도 하고 다른것 같기도 하고… 정리를 한번 해보려 한다. 느끼는 바는 딱 아래 한문장으로 요약 가능할 것 같다. “Spring은 트랜잭션을 선언적으로 숨기고, FastAPI는 트랜잭션을 명...
하다 보니 재밌다. 일단 기초적인 api들은 모두 완료했고, 테스트 코드 작성까지 완료하였다. 코드 작성하면서 들었던 의문이나 설계상 신경썼던 포인트들을 정리하고자 한다. 1) api 회원가입, 로그인, 로그아웃(+ redis 토큰 블랙리스트 등록), 초단기실황조회, 단기예보조회...
포트폴리오 겸 개발내공 쌓을 겸 작은 프로젝트를 하나 해보기로 했다. 이름은 RainMind, 비가 오는 것을(rain) 알려주겠다는(mind) 뜻이다. 내가 학교 다니면서 비가 오는지 안오는지를 신경쓰지 않는지라 수업 갈때는 비가 안왔다가 올때 비가 내려서 편의점에서 돈을 주고...
Minimum Spanning Tree 최소 신장 트리(Minimum Spanning Tree)란, 주어진 그래프의 모든 정점들을 연결하는 tree이며 해당 tree edge들의 가중치의 합이 최소인 tree를 말한다. 최소 신장 트리는 여러개 존재할 수 있지만, 그 가중치의 합...
최대 부분배열 문제(Maximum Subarray Problem)란, 주어진 배열의 subarray의 원소들의 합의 최댓값을 구하는 문제이다. 모든 배열의 수가 양수이거나 음수일때는 의미가 없다. 모든 수가 양수이면 배열 자체가 답이고, 모든 수가 음수이면 0에 가장 가까운 음수...
배낭 문제(Knapsack Problem)는 배낭에 담을 수 있는 무게의 한도가 정해져 있는 상황에서 물건을 배낭에 최대한으로 담아 배낭에 담긴 물건의 가치를 최대화 하는 문제이다. 배낭에 담는 물건은 무게와 가치를 속성으로 가지며, 배낭은 최대 수용 가능 무게를 속성으로 가진다...
세그먼트 트리(Segment Tree)는 구간 합 query를 빠르게 수행할 수 있도록 자료를 저장하는 자료구조이다. naive하게 query를 수행하려면 매번 더하기 연산을 일일이 수행해야 하기 때문에, 구간 합 query를 log scale만에 처리해야 하는 경우 Segment...
펜윅 트리(Fenwick Tree)란, 세그먼트 트리에서 한 단계 진화한 자료구조로서 bit 연산을 통해 데이터를 저장하고 관리하는 Tree형 자료구조이다. Fenwick Tree의 시작 index는 1부터 시작하며, 세그먼트 트리와 마찬가지로 배열의 어떠한 연속된 구간의 합을 ...
Binary Search의 실행 시간이 log scale임을 이용하여 주어진 조건에서 답을 빠르게 구할 수 있다. Binary Search의 경우 Data가 정렬되어 있어야 하므로, 주어진 Data의 order가 명백할 경우 사용할 수 있다. 예를 들어 오름차순 정렬된 list에...
Graph에서 최단거리를 구하는 알고리즘인 Dijkstra, Bellman - Ford, Floyd - Warshall에 대해 알아보자. Dijkstra Algorithm Graph의 가중치가 모두 음이 아닌 그래프에서, 특정한 시작 정점 S와 그래프의 다른 모든 점들 사이의 ...
SNUXI 서비스에서, 페이지네이션 SQL 로그 관찰 및 API 성능 개선에 사용한 스크립트와 PromQL 쿼리, 데이터 수치화를 기록한다. 페이지네이션 API 쿼리 횟수 추적 및 개선 (1) 목표 RPS 계산: 유저당 최악의 경우 50회씩 페이지네이션 수행한다고 가정할 때, 총...
SNUXI 서비스에서, 페이지네이션 방식 테스트 및 서버 자원 사용량 모니터링 시 사용한 스크립트와 PromQL 쿼리, 데이터 수치화를 기록한다. 페이지네이션 방식 적합도 테스트 : 오프셋 vs 커서 문제 제시: 실제 서비스 환경에서, 무한 스크롤 기능을 지원할 때...
MySQL 연산시 어떠한 Lock이 동작하는지에 관해서는 이전에 총 정리한적 있다(next-key lock, gap lock, IX, IS, Redo/Undo 등등 최대한 많은 내용들을 이해하고 정리하였다). 아래 링크 참조 링크 : MySQL InnoDB의 동작 이를 바...
서비스를 개발하며 WebSocket의 인증 방식과 데이터 흐름에 대해 정리하고, 왜 그러한 설계로 이루어졌는지 정리해보고자 한다. 1. WebSocket 데이터 흐름 우리 서비스 코드 기준으로, 다음과 같은 예시 상황에서 WebSocket의 데이터 흐름을 정리해보자. (상황) 웹...
SNUXI 서비스에는, 채팅방에 참여한 사람들이 최근 n개의 채팅내역과, 과거의 채팅내역을 조회할 수 있는 기능을 만들어야했다. 뒤늦게라도 채팅방에 참여한 사람들이 과거의 채팅내역을 보면서 방 분위기를 파악할 수 있고 그에 따라 더욱 빠르게 택시팟이 성사되는 기대효과가 있기 때문이...
프론트 분들과 협업하다가 만난 CORS에 대해 정리를 해보고자 한다. SOP (Same-Origin Policy) 같은 origin, 즉 같은 출처에서의 요청만 접근할 수 있도록 하는 원칙이다. 여기서 origin이란, Protocol + domain(IP) + Port Numb...
최근 동아리 프로젝트로 학내 택시팟 서비스를 제공하는 서버를 만들고 있다.
이 한 문장으로 전체 핵심을 말할 수 있을 듯 하다. Transaction commit은, 변경사항이 즉시 데이터 파일까지 flush 되었다는 의미가 아니다. Durability Durability = Commit된 트랜잭션은 장애가 발생해도 반드시 살아남아야 한다는 것이다. ...
RainMind 프로젝트를 수행하면서, 데이터 일관성을 맞추기 위해 이런 쿼리를 사용했었다: @Query(value = """ INSERT INTO schedules (user_id, title, location_id, start_at, end_at) SELECT :use...
겨울방학을 알차게 살기 위해 아침에는 코테 연습, 점심에는 네트워크 공부 및 프로젝트 수행을 하고 있다. 코테도 오랜만에 보니까 감이 살짝 떨어졌었는데 반복해서 하다보니 다시 감이 올라오고 있는 것 같다. 뭐든지 꾸준히 하는게 중요한듯 하다. 바로 문제 풀어보겠다. 1. 개인정...
학기 종강하고 진짜 오랜만에 글을 쓰는 것 같다. 오랜만에 코딩 테스트 문제를 풀려니 뭔가 새롭게 느껴지기도 하고 실제 기출문제들의 풀이를 기록해놓는 것도 좋겠다 싶어서 새로 카테고리를 하나 만들어서 기록할 것이다. 문제는 프로그래머스에 모두 공개되어 있다. https://sch...
백준 다이아V 달성 후기 시작 : 2025.07.03 달성 : 2025.08.25 여름방학 시작부터 약 2달간 열심히 백준을 풀어 다이아V에 도달했다. 아래는 공부했던 Algorithm 들이다. =============================================...
CS:APP 10장을 읽고 작성한 핵심 내용이다.