전체 글

Spring

이벤트를 좀 더 제대로 다뤄보자 (feat. MSA & EDA)

경기요 - 경기대학교 주변 맛집 모음[ 배포 링크 ] [ 프로젝트 깃허브 ]이용자들이 직접 추천하고 싶은 맛집 정보 등록을 요청하고 등록된 맛집에 대한 평가가 이루어질 수 있는 맛집 지도 플랫폼입니다. 개요이전 포스팅에서 리뷰 생성 API가 목표 TPS를 달성하지 못하는 것에 대해 아래와 같은 문제들이 있음을 확인하고 그 해결 과정에 대해서 다루었었습니다. 문제외부 리소스를 수행하는 작업(이미지 s3 업로드)이 같은 트랜잭션에 묶여있다 -> 비효율적인 커넥션 사용리뷰와 이미지가 강하게 결합되어 있다 -> 변경 사항이 전파되어 유지보수에 좋지 않음 데이터 원자성을 보장할 수 없다 -> 리뷰 생성 Commit 실패하여 롤백되더라도 이미지 생성 동작은 수행됨하나의 쓰레드에서 동기적으로 수행되어 요청 처리 속도..

Spring

동시성 테스트를 통한 성능 개선하기 (2) - Spring Event

경기요 - 경기대학교 주변 맛집 모음 [ 배포 링크 ] [ 프로젝트 깃허브 ] 이용자들이 직접 추천하고 싶은 맛집 정보 등록을 요청하고 등록된 맛집에 대한 평가가 이루어질 수 있는 맛집 지도 플랫폼입니다. 개요 이전 포스팅에서 이어지는 내용입니다. 현재 리뷰 생성 API의 목표 TPS는 20 ~ 60이지만, 마지막 테스트에서 11.3이라는 결과를 얻었으며 추가적인 개선을 진행하기 위해 리뷰 생성 과정에서 이미지 생성에 대한 동작을 분리하기로 결정하였었습니다. 이를 최근에 관심을 갖고 공부 중인 이벤트 주도형 개발로부터 아이디어를 얻어 해결해 나간 과정을 다뤄보도록 하겠습니다. 문제 인식 과정 @Override @Transactional public void createReview(UserInfo user..

DB

동시성 테스트를 통한 성능 개선하기 (1) - DeadLock (MySQL)

경기요 - 경기대학교 주변 맛집 모음 [ 배포 링크 ] [ 프로젝트 깃허브 ] 이용자들이 직접 추천하고 싶은 맛집 정보 등록을 요청하고 등록된 맛집에 대한 평가가 이루어질 수 있는 맛집 지도 플랫폼입니다. 개요 이번 프로젝트 개발을 진행하면서 리뷰 작성 기능에 대한 동시성 테스트를 진행하였습니다. 리뷰 작성 기능의 경우 많은 트래픽이 순간적으로 몰리는 경우가 드물지만, 리뷰 작성 이벤트 등 특수한 요구사항이 등장한다면 동시 요청이 많아질 수 있기 때문에 이를 대비하고자 테스트를 진행하게 되었습니다. 성능 개선을 위한 테스트를 진행하면서 Deadlock 문제도 마주하게 되었는데, 이를 발견하고 해결해 나가는 과정에 대해서 다뤄보도록 하겠습니다! 사전 지식 우선 Deadlock이란 무엇인지 이해하기 위해 M..

DB

조회 성능 최적화(4) - Cursor & Navigation

Steady - 개발 스터디 및 프로젝트 인원 모집 사이트 [ 배포 링크 ] [ 프로젝트 깃허브 ] 자체적으로 제공하는 폼과 유저 평가를 통해 외부 서비스에 의존하지 않고 검증된 스터디 인원을 모집할 수 있는 서비스입니다. 개요 보통 위 이미지와 같이 숫자로 페이지를 표시하는 방식(네비게이션)에는 Offset 기반의 페이징 기법이 사용됩니다. Offset 기반의 페이징 방식은 대용량 데이터를 처리하는 데에는 한계가 있다는 단점이 있는데, 이런 한계에 가로막혀 네비게이션을 포기하고 서비스 요구사항을 변경하기엔 자존심이 상했습니다. 그래서 떠올린 방안은 바로 Cursor 기반의 페이징 기법에 네비게이션을 적용하자는 것이었습니다. Cursor는 보통 무한 스크롤 방식의 페이지를 구현하기 위해서 사용되지만, 저..

Spring

조회 성능 최적화(3) - QueryDsl : SQL

Steady - 개발 스터디 및 프로젝트 인원 모집 사이트 [ 배포 링크 ] [ 프로젝트 깃허브 ] 자체적으로 제공하는 폼과 유저 평가를 통해 외부 서비스에 의존하지 않고 검증된 스터디 인원을 모집할 수 있는 서비스입니다. 개요 이전 포스팅에서 MySQL 슬로우 쿼리를 최적화하는 과정을 진행하였습니다. 이번 포스팅에서는 최적화 된 쿼리를 바탕으로 QueryDsl을 통해 Pagination을 구현하는 과정을 진행하였습니다. 아래는 Pagination에 사용될 SQL 쿼리입니다. SELECT DISTINCT s.* FROM steadies s JOIN (SELECT DISTINCT s.id, s.promoted_at FROM steadies s LEFT JOIN steady_likes sl ON s.id =..

카테고리 없음

네이버 쇼핑은 어떻게 동작하는 걸까??

오늘도 어김없이 개발자가 되기 위한 고단한 여정을 보내고 있던 와타시.. 그러던 와중 네이버 쇼핑과 네이버의 검색 결과 제공 방식이 좀 다르다는 것을 알게 된다. 백문불여일견 바로 확인부터 해보도록 하자. 🟩네이버 검색결과 우선 네이버에서 검색어를 입력했을 경우이다. 검색 결과 최하단에 다음과 같은 문구가 적혀있다. 네이버 검색은 최상의 검색결과를 제공하기 위해, 검색결과를 `10`페이지까지만 제공하고 있습니다. 위 문구를 보고 단순하게 "아~ 네이버는 10페이지만 제공하는구나 ㅎㅎ" 하고 넘어갈 수 있겠지만, 우리는 개발자를 꿈꾸기에 이러한 정책에 대해서도 분석해볼 필요가 있다. 🟦왜 10 페이지만 제공을 할까? 1. 선별하기 위해 안내 문구에서 가장 중요한 키워드라고 생각되는 `최상의 검색결과`에 대..

DB

조회 성능 최적화(2) - 슬로우 쿼리 튜닝하기

Steady - 개발 스터디 및 프로젝트 인원 모집 사이트 [ 배포 링크 ] [ 프로젝트 깃허브 ] 자체적으로 제공하는 폼과 유저 평가를 통해 외부 서비스에 의존하지 않고 검증된 스터디 인원을 모집할 수 있는 서비스입니다. 개요 steady 테이블은 `steady_stacks, steady_positions, steady_likes` 테이블과 일대다 관계를 맺고있습니다. 위 테이블들을 활용하여 필터링 및 검색 기능에 대한 구현을 앞두고 사용자 입장에서 페이지 방식과 무한 스크롤 방식 중 어떤 방식으로 응답을 받는 것이 좋을지에 대한 회의를 진행하게 되었습니다. 회의를 진행하며 나온 의견 중 “무한 스크롤 방식은 내가 봤던 글이 어디쯤에 있었는지 파악하기 어렵다” 라는 의견이 가장 많은 공감을 얻어 페이지..

Spring

조회 성능 최적화 (1) - 쿼리 발생 줄이기

이번 포스팅에서는 데브코스 팀 프로젝트 진행 중에 경험했던 페이징 쿼리 최적화 과정에 대해서 소개하려고 합니다. Steady - 배포주소, 백엔드 깃허브개발자들을 대상으로 스터디 또는 프로젝트 인원을 모집할 때 구글 폼과 같은 외부 서비스에 의존하지 않고도 검증된 인원을 모집할 수 있도록 서비스 내에서 자체적으로 폼을 제공하고, 유저 평가 시스템을 통해 인원으 모집할 수 있는 서비스입니다.  위 이미지를 통해 알 수 있듯이 steady는 기술 스택, 모집 분야, 좋아요와 `일대다 관계`를 맺고 있습니다. 이러한 관계를 맺고 있는 데이터들이 존재할 때 동적으로 필터링 또는 검색 조건을 통해 조회하기 위해서 `QueryDsl`을 사용하였습니다. QueryDsl을 통해 작성한 메서드와 당시 DB 상황은 다음과..

weonest
나그네의 개발 노래