본문 바로가기

BackEnd32

[쿼리 튜닝] 슬로우 쿼리 문제 해결하기/쿼리 성능 개선 스택NestJs(Node)AWS Aurora MySQL (MySQL8)TypeORM(ORM)React(NextJs) 개요초창기 서비스 대비 회사의 규모는 점점 커졌으며 다양한 기능들이 추가되었다. 대체로 빠른 속도로 기능을 개발하다보니 쿼리에 대한 리뷰가 부족했고 성능상 큰 문제를 야기하지 않았지만 점차 데이터가 쌓일수록 성능상에 문제가 발생했다. 물론 고객쪽에서 보여주는 API는 대체로 큰 문제가 없었지만 실제로 백 오피스에서 실행되는 쿼리는 슬로우 쿼리로 표기되었으며 동시에 실제로 사용함에 있어서 속도상의 큰 문제가 발생되었다  문제 확인백오피스에 대한 중요성은 사실 내부적으로도 동작의 여부와 정확도에 초첨을 맞춰왔다. 요건은 계속적으로 검색기능의 추가였고 여러 기술적 검토와 쿼리 검토없이 추가되어 .. 2025. 2. 4.
부하테스트 nGrinder 설정 nGrinder는 네이버에 개발한 JAVA 기반 테스트 도구이며 오픈소스 소프트웨어이다가상의 사용자를 만들어 서버에 부하를 개발자가 세팅한 만큼 줄 수 있으며 이를 통해서 성능 및 부하에 대한 서버를 확인할 수 있다.Jmeter와 다른점은 스크립트를 통해 성능측정이 가능하다는 점이며 실시간으로 TPS 및 웹환경 편의성을 제공한다는 점과 메모리 사용량 이슈로 nGrinder를 선택하는 유저도 많다고 한다 개인적으로 nGrinder를 사용한 이유는 테스트 코드 자체를 자바와 비슷한 Groovy로 작성할 수 있다는 점과 Docker Compose 한 번의 설정으로 웹 기반 GUI를 제공하는 점에서 선정했다  nGrinder 아키텍처   주로 Controller와 Agent에 관련된 내용이 많아서 두 개에 대한.. 2025. 1. 29.
MySQL Replication 적용하기 데이터베이스에서 운영 시 가장 중요한 두 가지는 확장성과 가용성이다 대용량 트래픽을 처리하기 위해서 데이터베이스를 확장될 준비가 되어있어야하며, 문제가 발생했을 때 언제든지 복원되고 유지되어야한다. Replication을 통해서 얻을 수 있는 이점은 성능상의 이점과 고가용성에 있다고 생각한다확장성RDBMS는 스케일 아웃이 힘들다 NoSQL 대비해서 데이터 정합성을 우선시 하기 때문이다현대 온라인 서비스에서 쓰기와 읽기 비율은 비교했을 때 8:2 정도의 비율을 가진다Replication을 통해서 쓰기와 읽기를 분리하여 성능상의 이점을 가져올 수 있다가용성만약 원본 DB가 장애가 나서 복원을 해야한다고 가정하자 백업 간격이 길수록 데이터 손실이 발생한다물리적인 손상이 발생했을 때 서비스 복원과 더불어 데이터.. 2025. 1. 26.
신규 결제 시스템 도입기2 (동시성을 고려하기) 1편 :https://sorryisme.tistory.com/98  새로운 결제 시스템이 도입되었다. 중복 결제를 막는 방법으로 비관적 락을 사용하였고 QA 및 실제 배포 후 문제는 없었다. 하지만 현업은 다음과 같은 요건이 던져졌다. 요건 및 추가 제한사항으로는 간편결제 한도가 있다는 것이다. 객단가가 높은 비즈니스 상황상 한 번의 Request에 분할결제를 진행 해야했으며 요건이 변경됨에 따라 정책과 동시에 개발 또한 수정이 필요했다. 한도가 정해진 결제에 대해서 여러 번 결제해서 처리해달라는 요청이다. 여러가지 제한점과 고려해야할 사항들이 발생되었다  ** 참고로 환불에 대한 PG사의 API가 존재하지 않아 부분 환불 및 전체 환불은 불가하다 (은행계좌를 통한 간편결제 시스템) 기존 로직 async.. 2025. 1. 17.
신규 결제 시스템 도입기 (중복결제 방지하기) 현업에서 새로운 결제 시스템에 대한 추가적인 도입을 진행했다. 기존 카드와 가상계좌 결제뿐 아니라 추가적으로 간편결제가 도입되어 결제를 수행한다. 하지만 결제 수행 간에 여러가지 고려해야할 사항들이 있다. 가장 크리티컬한 문제는 이중 결제이다.고객의 신뢰도를 잃을 뿐 아니라 다양한 후속 조치를 처리해야하는 문제까지 발생한다. 특히 이번에 도입하는 간편 결제는 환불 기능도 존재하지 않아서 중복 결제의 리스크가 존재하기에 이 문제를 반드시 해결해야한다. 해결 방안중복결제는 막는 방법은 다양하다프론트에서 연속된 요청을 막는다유니크한 키 값으로 결제여부를 체크한다뮤텍스 관련 라이브러리를 사용락을 사용한다일단 프론트에서 연속된 요청을 막는 것은 기본으로 수행하였다. 허나 항상 중복결제 클릭을 방지한다고 모든 리스.. 2025. 1. 15.
프록시 패턴과 @Transaction 동작원리 "@Transaction만 붙으면 자동으로 트랜잭션이 동작하는데 이거 신기하지 않으세요" 멘토링 중 멘토님이 말씀하셨다. 물론 신기하다 허나 왜 그런지 고민해본적이 있었던가.. 그냥 당연하듯이 동작할거라는 생각 하에 어떤 원리로 동작하는지에 대한 고민이 부족했기에 공부를 다시 시작했다이 부분에 대한 깊은 동작 원리나 공부는 추후 토비의 스프링을 공부할 때 배워야겠지만 지금 단계에서는 먼저 프록시 패턴과 트랜잭션이 프록시 패턴과 어떤 연관관계가 있는지 공부해보았다 Proxy Pattern대상 원본 객체를 대리하여 로직의 흐름을 제어하는 행동원본 객체의 수정 없이 제어가 가능하다구현 코드public interface IUserController { User login(String id, String p.. 2024. 11. 7.