본문 바로가기

전체 글8

[성능 개선기] 폭주하는 트래픽에 안전한 API 만들기 (feat. Kafka vs RabbitMQ) 사이드 프로젝트인 'Let's Deal'(가격 제안 기반 C2C 플랫폼)의 고도화를 진행하면서, '만약 BTS와 같은 유명 연예인이 본인의 애장품을 중고마켓 플랫폼에 올려 수천만 개의 가격 제안이 동시에 몰린다면?' 이라는 시나리오를 떠올리게 되었습니다. 이 가상 시나리오를 바탕으로 시스템의 잠재적 병목을 데이터로 진단하고, Spring @Async 와 외부 메시지 큐 도입의 아키텍처적 트레이드오프를 고민하며, 최종적으로 Kafka와 RabbitMQ의 벤치마크를 통해 기술을 선정하는 과정과 배운 점까지 모두 정리해보았습니다. *모든 테스트는 로컬 환경에서 진행되었습니다.1. 문제 진단: '8.8배' 느려진 응답 속에 숨겨진 병목'Let's Deal'의 가격 제안 API는 사용자의 요청을 받아 DB에 저장.. 2025. 10. 11.
1시간 30분 → 1초: 10만 사용자 대상 쪽지 전송 API 최적화 쪽지 서비스 신규 출시를 위해 여러 대상에게 쪽지를 전송하는 API 구현을 맡게 되었습니다. 그중에서도 관리자가 약 10만 명의 사용자에게 쪽지를 전송하는 기능을 설계하고 개발하는 과정에서 여러 문제에 부딪혔고, 이를 해결하기 위해 시도한 다양한 방법들을 정리해보았습니다. 발단: 기존 구현의 한계쪽지 서비스의 기본 구조는 다음과 같습니다. 모든 사용자는 관리자와 연결된 1:1 쪽지함을 가지며, 새로운 쪽지가 전송되면 해당 쪽지함의 최신 쪽지 ID가 업데이트되도록 설계되어 있었습니다.문제는 이 구조를 기반으로 한 초기 구현 방식에 있었습니다. 각 사용자마다 개별 트랜잭션으로 약 10만 건의 업데이트 쿼리가 실행되었습니다. (*이러한 방식은 전체 10만 명 중 일부 사용자에게 전송이 실패하더라도, 나머지 사.. 2025. 2. 9.
동시성 이슈를 고려한 Redisson 분산락 적용 동시성 이슈 확인 지난 글인 "1000만 건의 데이터 처리를 위한 쿼리 성능 최적화" 에서 판매글에 대해 가격 제안을 등록할 때, 해당 판매글의 가장 큰 소비자구매희망가 를 구해 컬럼으로 저장하기로 했습니다. 그런데 만일 한 판매글에 사용자들이 동시에 가격 제안을 등록하게 된다면, 여러 스레드가 동시에 같은 인스턴스의 필드 값을 변경하려고 할 때 나타나는 문제인 동시성 이슈가 나타날 수 있습니다. 동시성 이슈 테스트 가격제안 등록 메소드에는 등록하려는 구매희망가가 판매글의 최고구매희망가보다 크면 최고구매희망가로 저장하도록 구현되어있습니다. 실제 테스트를 위해서 구매희망가가 10000원, 10010원, 10020원인 가격제안 등록 스레드를 병렬로 실행되게 하니, 최고구매희망가로 기대하는 값인 10020이 .. 2023. 11. 3.
Apache POI 및 엑셀 파일 생성 및 다운로드 예제 Apache POI 사용자에게 요구 데이터를 보여 주는 방법은 여러가지가 있다. 보통은 웹 페이지의 화면으로 보여주는데 사용자의 요구사항에 따라 데이터를 엑셀 파일에 담아서 다운 받게 할 수 있다. 이를 위해 필요한 것이 Apache POI 라이브러리이다. Apache POI 란? Apache POI는 아파치 소프트웨어 재단에 의해 운영되는 오픈소스 프로젝트이다. 순수 자바 라이브러리로서 Microsoft Office의 Word, PowerPoint, Excel 형식의 파일을 읽고 쓸 수 있게 한다. Apache POI 라이브러리 설치하기 maven 프로젝트의 pom.xml 파일에 poi와 poi--ooxml dependency 를 추가하여 POI 라이브러리를 설치한다. https://mvnreposit.. 2023. 10. 27.
DB I/O 최소화를 위한 사용자 정보 캐싱 캐싱의 필요성 토이 프로젝트의 API를 개발하고 테스트를 하는 과정에서 거의 모든 요청마다 사용자를 조회하는 쿼리가 호출되는 것을 확인했습니다. 이는 아래와 같이 사용자 인증/인가를 위해 회원가입과 로그인을 제외한 모든 API 요청에서 사용자를 조회하여 인증하고 있기 때문이었습니다. (사용자 인증/인가를 다루었던 이전 글에서 더 자세한 코드를 확인하실 수 있습니다.) @RequiredArgsConstructor public class JwtTokenFilter extends OncePerRequestFilter { // ... 생략 ... @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse res.. 2023. 10. 25.
Github Actions와 AWS CodeDeploy를 활용한 CD 구축 기존 : AWS EC2와 스프링부트 수동 배포 사이드 프로젝트를 실제 서버에 배포하기 위해 클라우드 컴퓨터 서비스를 고민했습니다. 실제 서비스 목표가 아니다보니, 1년동안 매월 750시간의 배포 서버로 사용될 가상 서버인 인스턴스를 무료로 사용할 수 있는 AWS의 Amazon EC2를 사용하기로 했습니다. 이후 EC2에서 인스턴스를 생성하고, 해당 인스턴스에 스프링부트 프로젝트를 직접 배포해보았습니다. 아래는 수동 배포 과정입니다. 1. 배포할 스프링부트 애플리케이션을 빌드하여 해당 애플리케이션을 실행하는데 필요한 JAR 파일을 생성합니다. 2. SCP(Secure Copy Protocol)를 사용해 인스턴스에 해당 JAR 파일을 복사합니다. 3. SSH(Secure Shell) 을 사용하여 인스턴스에 .. 2023. 10. 15.