SQS 메시지를 한 번만 처리하기 위한 고민 (FIFO, DB 멱등성, 그리고 현실적 고려사항)
·
Server/Infra
서론SQS의 메세지 중복되지 않아야한다면, 어떤 방법을 사용할 수 있을까요?멱등성을 지킨 코드 하나만으로 과연 대응할 수 있을까요? 면접에서 해당 질문을 듣고난 후, 답변을 하기 위해 정말 순간적으로 뇌의 저장공간들을 빠르게 훑었던 것 같습니다.당시 SQS를 생성할 때 'FIFO'라는 방식이 있다는 것이 스치듯 생각이 나서, FIFO로 메세지를 설정해놓을 것 같다고 재빠르게 대답했지만, 왜 이 방식이 중복을 방해하는지에 대해 알지 못했습니다. 더불어 해당 방법 외에도 어떤 방법들이 중복을 막을 수 있는지 궁금해졌습니다.본론FIFOAWS SQS에서 제공하는 FIFO 설정은 중복 제거 ID를 사용하여 해당 대기열의 메세지를 고유하게 식별하고 중복을 방지하는 것을 도와줍니다. 생산자가 메시지를 전송할 때 제공..
SQS 메시지 256KB 한도 해결하기: Extended Client + S3로 Oversize 대응하는 법
·
Server/Infra
서론회사에서의 마지막 프로젝트로 이메일 발송 기능 구현을 맡게 되었습니다.서비스 내 고객들에게 다양한 정보를 담아 이메일을 보내는 시스템을 구축해야 했습니다. 기존에는 고객 정보를 기반으로 서비스 내에서 고객을 조회하고, 해당 고객의 정책(Policy) 및 결제(Payment) 정보를 수동으로 입력하며, 기존 email 서비스를 사용하여 대량 메일을 발송해야 했습니다.하지만 이 시스템이 구현되면, 고객의 재가입률을 높이고 Agent들의 생산성을 크게 향상하는데 기여할 수 있습니다. 서비스 내에서 기존 고객 정보를 활용해 축하, 격려 메시지를 보내거나, 계약 만료일이 임박했을 때 새로운 계약 조건을 제안하는 등 맞춤형 제안이 가능해집니다.과거에는 일일이 메일 주소를 입력하고 내용을 타이핑해야 했지만, 이제..
Querydsl 취약점으로 인한 SQL/HQL Injection 이슈
·
Server/JPA
오랜만에, Spring 공부를 하며 다시 프로젝트를 셋팅하고 있던 와중 gradle의 의존성 추가 부분에서 안내문을 접했다.검색하는 과정에서, Querydsl을 사용할 때 보안 이슈가 발생할 수 있다는 점을 알게 되었다. 특히 사용자가 orderBy값을 제공하는 경우, blind SQL injection이라 불리는 형태의 공격을 당할 수 있다고 한다. 예를 들어, 아래와 같은 요청을 서버에 보낸다고 생각하자.http://localhost:8000/products?orderBy=name+INTERSECT+SELECT+t+FROM+Test+t+WHERE+(SELECT+'2')='2'+ORDER+BY+t.id HTTP/1.1 SELECT t1 FROM Test t1 Order By t1.name INTERSE..
글또를 정리하며
·
회고록/회고
글또 10기를 마무리하며1. 글또와의 첫 만남개발자로서 기술 블로그의 필요성을 느낀 계기나이가 들어갈수록, 그리고 나라는 사람에 대해 알아갈수록 명확하게 느껴졌던 것이 있다.나는 그렇게 명석하지 않다는 것. 남들이 한 번에 이해하고 넘어가는 것도, 나는 두 배, 세 배의 시간을 들여야 겨우 따라갈 수 있었다.많은 사람들이 글쓰기를 리마인드나 공유의 목적으로 한다고 말한다. 하지만 나는 그렇지 않았다.개발을 처음 시작했을 즈음, 남들이 작성한 글이나 문서를 읽을 때 쉽게 이해하지 못하는 경우가 많았다.누군가는 자연스럽게 유추할 수 있는 중간 히스토리를 나는 파악하지 못했고, 헤매는 경우가 잦았다.그래서 나는 그 모든 과정을, 한 순간도 빼놓지 않는 나를 위한 글을 작성했다.내가 작성한 글들을 보면 굳이 작..
Vercel Speed Insight와 함께하는 RES 성능 개선기
·
회고록/업무 기록
Vercel Speed Insight와 함께하는 RES 성능 개선기Vercel를 통하여 새로운 서비스가 배포되면서, Speed Insights Tabs을 통하여 P75, P90, P95, P99라는 지표들을 처음 접하게 되었다. 이는 전체 사용자의 75%, 90%, 95%, 99%가 경험하는 성능 구간을 뜻하며, 우리가 제공하는 Real Experience Score(RES)가 전 세계적으로 어떤 분포를 보이는지 쉽게 확인할 수 있도록 도와준다.또한 Vercel에서는 Virtual Experience Score, Core Web Vitals도 지표로 사용하고 있으며, 이를 점수에 맞춰 색상별로 사용자에게 결과값을 나타내고 있다.Real Experience Score(RES)사용자 기기에서 수집한 실제 데..
데이터베이스 성능 최적화 기록
·
회고록/업무 기록
서비스 DB CPU 사용률 확인현재 외주로 일하고 있는 서비스의 DB를 모니터링하던 중, CPU 사용률이 굉장히 높다는 사실을 확인하게 되었다. CPU 사용량이 높아질 경우에는 성능이 저하되거나, 타임 아웃 및 연결 실패, 리소스 병목등 다양한 문제를 발생하며 결국 서비스 장애로까지 이어질 수 있다.이를 해결하기 위해 스케일 업/아웃, 인덱스 최적화, 캐싱 도입, 쿼리 최적화 등 여러 방법을 고려할 수 있으나, 이번 경우에는 데이터베이스의 사양이 서비스 규모에 비해 충분히 높다고 판단되어, 우선 쿼리 최적화와 인덱스 최적화를 통해 문제를 해결해 보기로 했다.문제 분석 및 개선 과정인덱싱DB에 부하가 집중되는 시간대에 서버 로그를 확인해 보니, 해당 시간에 자주 호출되는 로직이 있었음을 확인할 수 있었다...
자바스크립트 이벤트 루프의 이해 (JavaScript Eventloop)
·
Server/Node
정의자바스크립트 이벤트 루프는 코드 실행 관리, 이벤트 수집 및 처리, 대기 중인 작업 실행을 핵심적으로 담당한다.자바스크립트는 단일 스레드 환경에서 작동하므로 한 번에 하나의 코드만 실행되며, 이벤트 루프는 이러한 실행 순서를 관리하여 비동기 프로그래밍을 가능하게 한다.예를 들어, 네트워크 요청, 파일 읽기, 타이머 등 다양한 비동기 작업이 올바른 순서로 처리되도록 도와준다.이벤트 루프 구성 요소Call Stack(콜스택) : 현재 실행 중인 함수(또는 스크립트)가 쌓이는 스택 구조Event/Task Queue(매크로 태스크 큐): setTimeout, setInterval, I/O 콜백, DOM 이벤트, 그리고 requestAnimationFrame 등의 콜백이 대기하는 큐Microtask Queue..
Javascript Promise에 대하여
·
Server/Node
Promise의 탄생 배경초기 자바스크립트에서는 비동기 처리를 위해 콜백 패턴을 사용했는데, 심각한 문제들이 발생하며 이를 해결하기 위한 과정에서 Promise가 등장하게 되었다.1. 콜백 지옥 (Callback Hell)// 콜백 지옥의 예시getUserData(userId, function(user) { getPosts(user.id, function(posts) { getComments(posts[0].id, function(comments) { getAuthor(comments[0].authorId, function(author) { // 들여쓰기가 계속 깊어지고 코드가 복잡해짐 }); }); });});// Promise를 사용한 개선된 코드getUs..
코드플리
코드 플레이 리스트