이 글에서는 동시에 많은 사용자가 접속하는 상황에도 대응 가능한 "선착순 이벤트" 시스템 설계 경험을 공유해 드리고자 합니다. 기술 스택 : Java 17, Sprint boot 3, Redis, RabbitMQ, AWS, Mysql 8, Pinpoint 3, nGrinder1. 들어가며선착순 이벤트는 무료로 이력서 피드백을 제공하는 사이트에서 이벤트를 진행했습니다. 선착순 이벤트 요구사항은 다음과 같습니다.1. 이벤트 기간 동안, 매일 특정 시간 오픈하며 총 신청 인원을 한정한다. 2. 신청 인원은 당일 정해진 양을 초과해서는 안된다. 3. 신청은 1인당 1번만 신청할 수 있다. 2. 동시성 이슈 문제RDB에 의존하여 수량 체크를 하면, 동시성 이슈로 인하여 선착순 신청 인원이 초과될 위험이 있었습..
API 접근 기록을 저장하는 기능을 맡으면서 Path, QueryString, Referrer, Body 값을 DB에 저장을 한다. HTTP의 주요 값을 갖고 있는 HttpServletRequest 클래스를 통해서 Path, QueryString, Referrer 조회하면 정상적으로 조회가 되지만, Body 조회를 하면 값이 없다고 나온다. 그 이유를 찾아보니 네트워크로부터 들어오는 데이터여서 한 번만 읽을 수 있도록 제한되어 있다고 한다. 개발환경 : Java 11, SpringBoot 2.7.71. 문제 사례public class TestController { @PostMapping("/test") public void test(@RequestBody String body, HttpSer..
회원들의 정보를 엑셀 다운로드를 했는데 메모리 부족 에러(OOM)가 뜬다. 자세히 들여보니, 대량의 데이터를 조회했을 때 DB에서 애플리케이션한테 데이터를 받는 과정에서 OOM 발생하였다.발생한 원인을 파악하기 위해 JVM heap 메모리 최대 크기에 대해 알아보았다.메모리 최대 크기는 운영 체제 및 시스템의 물리적 메모리 등 따라서 정해진다.내 PC 기준(mac, 64bit, 메모리 32GB) 사용 가능한 최대 메모리와 JVM heap memory 조회해봤더니// 사용 가능한 최대 메모리long maxMemory = Runtime.getRuntime().maxMemory();// JVM heap memorylong heapSize = Runtime.getRuntime().totalMemory();- 사..
다국적 고객을 대상으로 하는 서비스에서는 사용자 경험을 높이기 위해 다양한 언어로 메세지를 제공해야 합니다. 이 과정에서 MessageSource, Locale, MessageCode와 같은 요소들이 필요합니다. 그러나 이러한 요소로 인해서 다국어 메세지 처리가 애플리케이션에서 문제점을 낳게 되는데, 어떤 문제점이 있는지 어떻게 해결했는지 살펴보도록 하겠습니다. 개발환경 : Java 11, SpringBoot 2.7.71. 문제점 - 의존성 증가와 복잡한 코드주문 조회 예제 코드OrdersController 클래스public class OrdersController { private final OrdersService ordersService; @GetMapping("/order/{o..