문제 상황키즈핑 프로젝트를 진행하면서 이벤트 당첨자 조회에 캐싱을 적용하기로 했습니다.이에 따라, ConcurrentHashMap을 사용해 로컬 캐시를 직접 구현했습니다.아래 코드의 findWinner 메서드는 couponWinnerCacheStore에 캐시가 비어 있는 경우 DB에서 데이터를 가져와 couponWinnerCacheStore에 당첨자를 저장하여 DB와 캐시 데이터 간의 정합성을 유지하도록 설계했습니다. 단일 스레드 환경에서는 findWinner() 메서드를 통한 조회에 문제가 없다고 생각했습니다.하지만 멀티 스레드 환경에서는 상황이 달라질 수 있습니다.여러 스레드가 동시에 findWinner() 메서드에 접근할 수 있기 때문에, 결과적으로 updateTodayWinners() 메서드가 여..
프로젝트
Overview이번 글에서는 키즈핑 프로젝트에서 선착순 응모 시스템을 개발하는 과정에서 겪었던 다양한 이슈와, 이를 어떻게 해결해 나갔는지에 대해 이야기하려고 합니다.선착순 응모 시스템 요구사항 및 목표주어진 요구사항은 다음과 같습니다.회원은 응모 페이지에 접속 후 이름, 전화번호를 입력 후 선착순 100명 이벤트에 응모한다.사용자는 중복 응모를 못한다.다음날 오후 1시에 응모 페이지에서 이벤트 당첨 여부를 확인한다.응모 페이지는 매일 오후 1시에 가장 많은 트래픽을 받는다. (1분에 10만 요청을 10분간)이러한 요구사항을 분석하여 쿠폰 100개 발급을 보장하고, 높은 트래픽을 견디는 시스템 구축을 목표로 삼았습니다. 초기 응모 시스템의 흐름은 쿠폰 요청을 받으면, DB에서 현재 쿠폰 개수를 조회한 뒤..
OverviewAWS 프리 티어 계정을 사용해 EC2로 키즈핑 프로젝트를 배포했습니다. 배포 과정에서 Docker를 활용하였으며, docker-compose.yml 파일을 통해 기본 Docker 네트워크에서 Spring Boot, MySQL, Redis를 각각 컨테이너로 구성하여 배포 환경을 구축했습니다.배포 초기에는 Spring Boot와 MySQL만 컨테이너로 구성된 상태에서 Docker를 실행했습니다. 그러나 Docker가 실행된 후 ssh로 EC2에 접속한 터미널이 갑자기 작동하지 않는 문제가 발생했습니다. 다른 터미널을 통해 재접속을 시도했지만, 접속 과정에서 터미널이 중단되어 접속할 수 없었습니다.결국, 기존 EC2 인스턴스를 삭제하고 새 EC2 인스턴스를 생성하여 다시 배포를 진행했습니다.이..
Overview자녀가 좋아요 한 책을 조회하는 API를 개발하던 중, Postman으로 API를 테스트하면서 콘솔에 출력된 쿼리를 확인했습니다. 그런데, 여러 번의 SELECT 문이 반복적으로 실행되는 N+1 문제가 발생하는 것을 발견했습니다. 이번 글에서는 이 N+1 문제의 원인과 해결 방법에 대해 정리해보겠습니다.N+1 문제란?연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 아래 코드는 N + 1 문제를 겪었던 상황에 대한 코드입니다.테스트 코드를 통해 N+1 문제를 다시 발생시켜 보겠습니다.문제 상황DB우선, DB에 자녀가 좋아요를 누른 책 15개를 저장했습니다. 그리고 이 데이터 기반으로 자녀가 좋아요 한 책을..