본문 바로가기

Spring & Spring Boot

(9)
[Redis] 항공 예매 서비스 - 항공권 예매 동시성 이슈 해결을 위한 Redisson 분산 락 적용 📖 목차 Spring Boot MSA 기반으로 항공권 티켓팅 서비스를 구현하던 중, 항공권 예매 시 발생할 수 있는 동시성 이슈를 해결하기 위해 대기열 서비스에 Redis의 Redisson 라이브러리를 이용해 분산 락을 적용했다. 초기 구현 당시 대기열 서비스가 사용자 요청 순서를 보장하고 있었지만,'대기열 서비스에 적용된 동시성 제어가 항공편 서비스에서의 좌석 수까지 안전하게 보장해 줄 수 있을까?'라는의문을 가지게 되면서 서비스 간 동시성 제어의 책임 분리에 대한 문제점을 인식하여 개선하는 과정을 정리해 보았다. 📌 대기열 서비스에만 적용된 동시성 제어에 의문을 가지계 된 계기 항공편 예매 서비스의 기본 흐름은 다음과 같다. 1️⃣ 사용자가 항공편 예약 요청2️⃣ 대기열 ..
[Redis] Redis Cache 직렬화 및 역직렬화 오류의 발생과 해결 📖 목차 항공권 티켓팅 서비스를 구현하던 중, 항공권 조회 속도를 개선하기 위해 Redis Cache를 적용하게 되었다.하지만, 캐시를 저장해서 꺼내오는 과정에서 오류가 발생하는 것을 확인했다.어떤 오류가 발생했고, 어떻게 해결했는지 과정을 정리해 보았다. 📌 Redis Cache를 적용하게 된 이유 우선 Spring Boot MSA 아키텍처 기반으로 대용량 트래픽에도 안정적인 서비스를 구성하는 것이 프로젝트의 목표였고, 그 목표를 가지고 항공권 예매 서비스를 구현하고 있었다. 이때, 대기열과 예약 서비스 그리고 실제 항공편 API(Amadeus API)를 연동한 통합 성능 테스트를 진행하면서 문제점을 발견하게 되었다. 💡 Jmeter를 통해 다음과 같은 조건으로 테스트를 해본..
[Redis] 음식 주문 관리 플랫폼 - Redis와 Scheduler를 활용한 리뷰 평점 구현 📖 목차 Spring Boot를 기반으로 '음식 주문 관리 플랫폼'을 개발하게 되었다.음식점과 리뷰 도메인을 맡아 기능을 구현하게 되었는데,가게 조회 시 리뷰의 평점과 개수가 함께 조회되어야 하는 요구사항이 있었다. 여러 번의 고민을 거쳐 리뷰 평점과 리뷰 개수를 N+1 문제없이 조회 가능하도록 구현하였다.어떤 문제점이 있었는지와 그 해결방법에 대해 알아보자. 📌 프로젝트 요구사항 이 프로젝트의 필수 기능 요구사항 중 하나이다. 기능 요구사항을 살펴보면, 가게 목록을 조회 시 평점을 노출해야 한다고 되어있다.처음에 기능만 생각하고 구현을 하다 보니 가게를 상세 조회하거나 검색해서 가게 목록을 조회할 때, 리뷰 수와 평점을 그때그때 계산하여 보여주도록 로직을 작성했다.💡 리뷰 및 ..
[CI/CD] 실시간 채팅 애플리케이션 프로젝트 - GitHub Actions를 통한 CI/CD 구축하기 - (2) 📖 목차    지난 포스팅에서 CI/CD가 무엇인지에 대해 알아보았다.[CI/CD] 실시간 채팅 애플리케이션 프로젝트 - GitHub Actions를 통한 CI/CD 구축하기 - (1)  이번 포스팅에서는 프로젝트 초기 세팅과 더불어 GitHub Actions를 활용해 직접 CI/CD를 구축해 보자.       📌  GitHub에서 설정하기  인텔리제이에서 프로젝트를 생성하고, 깃허브 레포지토리에 연결해 주거나 깃허브에서 바로 레포지토리를 생성해도 된다.  깃허브 레포지토리를 생성하면 나오는 페이지에서 Actions 탭을 선택하거나 creating new file을 선택 후 다음 단계로 넘어가준다. Actions 탭을 선택하면 템플릿을 검색하고 선택할 수 있는 페이지로 넘어가고, creating n..
[CI/CD] 실시간 채팅 애플리케이션 프로젝트 - GitHub Actions를 통한 CI/CD 구축하기 - (1) 📖 목차    개인적으로 SpringBoot를 기반으로 한 실시간 채팅 서버를 구현해보려고 한다.이커머스 팀 프로젝트를 진행하면서 시간 상 직접 구현해보지 못했던 부분을 위주로 진행할 예정이다.이번 포스팅에서는 CI/CD가 무엇인지에 대해 알아보도록 하자.       📌  CI/CD란?  CI/CD는 소프트웨어 개발 프로세스를 자동화하여 빠르고 안정적인 배포를 가능하게 하는 Continuous Integration(지속적 통합)과 Continuous Delivery/Deployment(지속적 전달/배포)의 약자이다. 개발자가 코드를 작성하는 순간부터 실제 사용자에게 서비스를 제공하는 순간까지의 모든 과정을 자동화하는 것을 목표로 한다. ✔️ CI(지속적 통합)개발자가 작성한 코드를 자주 병합하고, ..
[Redis] Redis Cache를 활용해 데이터 조회 속도 개선하기 - (2) 📖 목차   지난번 포스팅에서 Redis의 어떤 특징 때문에 성능이 개선되는지 알아보았다. [Redis] Redis Cache를 활용해 데이터 조회 속도 개선하기 - (1) [Redis] Redis Cache를 활용해 데이터 조회 속도 개선하기 - (1)📖 목차    SpringBoot를 기반으로 이커머스 서비스를 구현하던 중,이커머스의 특성상 조회하는 일이 많은데 성능이 잘 나오지 않는다는 것을 확인했다.먼저, Redis의 어떤 특징 때문에 성능이zzudev.tistory.com  이번 포스팅에서는 Redis 명령어를 직접적으로 사용하지 않고,Spring Cache 어노테이션을 적용하여 조회 성능을 개선하는 방법을 알아보자.       📌   Spring Cache 어노테이션 이용하기   Spr..
[Redis] Redis Cache를 활용해 데이터 조회 속도 개선하기 - (1) 📖 목차 SpringBoot를 기반으로 이커머스 서비스를 구현하던 중,이커머스의 특성상 조회하는 일이 많은데 성능이 잘 나오지 않는다는 것을 확인했다.먼저, Redis의 어떤 특징 때문에 성능이 개선되는지 알아보자. 📌 Redis의 주요 데이터 구조와 시간복잡도 Redis는 고성능의 인메모리 데이터 구조 저장소로, 다양한 데이터 구조(문자열, 해시, 리스트, 셋, 정렬된 셋 등)를 지원한다. 각 데이터 구조와 연관된 명령어들은 서로 다른 시간복잡도를 가진다. Redis의 주요 데이터 구조와 명령어들의 시간복잡도에 대해 알아보자. 문자열(String)GET key: O(1) - 주어진..
[Spring Data JPA] Transaction 전파로 인한 DeadLock 발생과 해결 📖 목차   SpringBoot를 기반으로 이커머스 서비스를 구현하면서 동시성 이슈를 해결했다.  [Spring & Spring Boot] - [Redis] Redisson을 이용한 분산 락 구현으로 동시성 이슈 해결 [Redis] Redisson을 이용한 분산 락 구현으로 동시성 이슈 해결📌SpringBoot를 기반으로 이커머스 서비스를 구현하면서 동시성 이슈가 발생했다.Redis의 Redisson라이브러리를 이용해 동시성 이슈를 해결하는 방법에 대해 알아보자.                           zzudev.tistory.com하지만, 동시성 이슈를 해결하는 과정에서 교착상태(DeadLock)가 발생했다. 데드락이 발생한 이유로는 savaAll을 사용해서 벌크로 데이터를 저장하거나트랜잭..