전체 글

개발의 모든 것 !
얼마 전 새벽, 모니터링 시스템의 알림이 발송되어 확인해보니 운영 중인 사내 사이트에 초당 10,000건 이상의 API 요청으로 인해 서버가 다운되는 상황이 발생했습니다. 서비스는 접속이 불가능해졌고, 약 5시간 동안 서비스가 완전히 중단되었습니다. 악의적인 DDoS 공격이었지만, DDoS에 무방비하게 당한 것은 사전에 대비책을 마련하지 않았기 때문이라고 생각합니다. 동일한 상황을 방지하고자 자발적으로 처리율 제한 장치를 구축했고, 이번 글에서는 어떤 알고리즘을 선택했고, 왜 선택했는지에 대해 공유하려고 합니다. 📊 API 호출 횟수 제한 정책처리율 제한 장치를 설계하면서 가장 먼저 고민했던 부분은 임계값이었습니다. 정상 트래픽은 유지하면서, 공격 트래픽을 제한할 수 있는 임계값을 구하기 위해 Goog..
사내에서 6년간 운영해오던 사이트를 전면 리팩토링 작업 후 몇 개월간 큰 문제없이 운영되는 듯 했었는데, 데이터가 쌓이다보니 동료가 작업한 특정 페이지에서 조회 시간이 19초 이상 소요되는 것을 발견했습니다. 회사에서는 크게 문제 삼지 않았지만, 이런 문제들이 쌓이다 보면 분명 더 큰 문제로 다가올 수 있다고 생각했습니다. 그래서 직접 나서서 슬로우 쿼리 문제를 해결하기로 했습니다. 🛠️ 쿼리부터 튜닝하자인덱스 추가, 캐시 등의 작업을 하기 전 쿼리를 효율적으로 수정하기만 해도 성능이 상당히 개선될 수 있기 때문에 우선 쿼리 작업을 수행했습니다. 아래 3가지 작업을 통해 조회 시간 평균 19초에서 약 5초까지 감소시킬 수 있었습니다. 👉🏻 불필요한 Join 제거 및 서브쿼리 개선불필요한 Join을..
대부분의 애플리케이션에서 데이터 관리는 빼놓을 수 없죠 ! 그래서 오늘은 데이터베이스 Lock에 대해 알아보려고합니다. ❓Lock이란 ?Lock의 정의는 DB의 일관성과 무결성을 유지하기 위해 트랜잭션의 순차적 진행을 보장할 수 있는 직렬화 장치입니다. 즉, 트랜잭션 처리의 순차성을 보장하기 위한 방법이라고 생각하시면 됩니다. Lock의 종류는 공유 Lock(Shared Lock, Read Lock, S-Lock), 배타 Lock(Exclusive Lock, Write Lock, X-Lock)로 나뉩니다. 🔎 공유 Lock(Shared Lock, Read Lock, S-Lock)공유 Lock은 데이터 읽기 작업에 사용되는 Lock입니다. 공유 Lock은 공유 Lock끼리는 동시에 접근이 가능합니다. 하..
· 기록
평소 무신사를 많이 이용하는 저는 무신사 밋업 신청 글을 보자마자 망설임 없이 '신청하기' 버튼을 눌러 버렸습니다. 감사하게도 선정되어 개발자 인생 처음으로 밋업 참여 기회를 얻게 되었습니다.이번 밋업은 무신사의 비전과 앞으로의 방향성 그리고 무신사 Engineering을 이루고 있는 각 팀의 성격과 팀의 역할을 소개하는 시간이었습니다. (발표에 너무 집중해서 메모를 못해, 기억나는 내용만 작성 하겠습니다🥲)💭 기억에 남는 발표 내용무신사의 비전과 성장요즘 경제가 좋지 않아 실적이 부진할 거라는 예상과는 달리, 무신사는 오히려 꾸준한 매출 증가세를 보이고 있다고 합니다. 저는 단순히 운이 좋아서가 아니라, 고객 경험 개선과 플랫폼 안정성을 위해 끊임없이 노력해온 수많은 직원들의 성과라고 생각합니다. ..
· 기록
📚 책을 선택한 계기개발자라면 누구나 한 번쯤 대규모 시스템을 설계하고 운영해보고 싶은 로망이 있을 것입니다. 저 역시 평소 "유튜브는 어떻게 수억 명의 사용자를 처리할까 ?", "검색어 자동완성 시스템은 어떻게 관리할까 ?"와 같은 궁금증이 많았지만, 실제 업무에서는 작은 규모의 서비스만 다루다 보니 대규모 시스템을 경험할 기회가 없었습니다.마침 선우님의 추천으로 "가상 면접 사례로 배우는 대규모 시스템 설계 기초"를 알게 되었고, 평소 사용하던 서비스들이 어떻게 설계되었는지, 수많은 사용자를 어떻게 처리하는지를 배울 수 있는 좋은 기회가 될 것 같아 선택하게 되었습니다.🧐 목차 살펴보기이 책의 목차는 아래와 같습니다. 도서 구매 전 목차를 보고 흥미로운 주제가 많아 신나했던 기억이 새록새록하네요 ..
🫢 문제 상황Spring Boot에서 Master/Slave 패턴으로 DB 구조를 구현했지만, @Transaction(readOnly = true)로 설정한 메서드가 계속 Master DB(3306)로 접근하는 문제가 발생하였습니다. Slave DB(3307)로 라우팅되어야 하지만 실제로는 읽기 전용 설정이 false로 인식되는 문제가 발생하고 있었습니다. ⚙️ 환경설정DB 설정(application.yml)spring: datasource: master: hikari: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/bank?serverTimezone=Asia/S..
Master/Slave 패턴이란 ?우리가 서비스를 이용하다 보면 보통 등록, 수정 보다 조회 요청이 많다는 것을 알 수 있습니다. 이때 사용자가 증가함에 따라 해당 요청을 처리하기 위해 DB에 많은 트랜잭션을 처리해야 하는데 이 요청으로 DB서버가 다운되면 서비스를 이용할 수 없게 될 것입니다.Master와 Slave는 이러한 문제를 해결하기 위해 설계된 DB 아키텍처로 Master에서는 등록과 수정, 삭제와 같은 작업을 처리하고, 이를 Slave에 복제고, 조회 요청은 Slave에서 처리하도록 트래픽을 분산합니다. 이로써 만약 Master 서버가 다운 되어도 Slave 서버를 마스터로 승격하여 서비스 복구를 빠르게 할 수 있어 고가용성이 증가됩니다.Master DatabaseMaster DB는 서비스의..
AI가 빠르게 발전하면서 개발자의 업무를 돕거나 대신할 수 있는 수준까지 발전했습니다. 빠르게 변화하는 세상속에서 뒤처지지 않기 위해 AI와 개발자가 협업하여 코드를 작성하는 바이브 코딩을 통해 프로젝트를 만들어 보았습니다. 바이브 코딩을 진행하면서 제가 겪었던 경험을 얘기해보겠습니다 !🙋🏻 나의 경험개발의 진입장벽가장 큰 장점 중 하나는 개발의 진입장벽이 낮아진다는 것입니다. 기존에는 프로그래밍 언어를 배우고, 개발 환경을 설정하고, 기본적인 문법을 익히는데 많은 시간이 필요했습니다. 하지만 단순히 원하는 기능이나 아이디어를 설명하는 것만으로도 바로 실행 가능한 코드 초안이 생성됩니다. 덕분에 비개발자라도 아이디어만 있으면 작은 프로젝트를 직접 시도해볼 수 있다는 점이 큰 매력으로 다가왔습니다. 분..
차나니
차나니의 개발일지