[Poppy] Redisson 기반 분산 락을 활용한 예약 시스템 동시성 제어
·
Projects
1. 예약 시스템에서의 동시성 문제팝업스토어 예약 시스템에서는 특정 시간대에 예약 가능한 인원이 제한된다. 예를 들어, 한 타임에 최대 30명이 예약할 수 있다면 31번째 예약 요청은 거부되어야 한다.그러나 여러 사용자가 동시에 예약 버튼을 클릭할 경우, 다음과 같은 문제가 발생할 수 있다.중복 예약: 같은 사용자가 여러 개의 예약을 생성하는 경우초과 예약: 30개 슬롯을 초과하여 예약이 이루어지는 경우데이터 정합성 문제: 두 개 이상의 서버에서 동일한 슬롯을 동시 처리할 때, 중복 예약이 발생할 가능성이 있음이를 해결하기 위해 비관적 락(Pessimistic Lock) 방식과 Redisson을 활용한 Redis 기반 분산 락을 적용했다. 2. 동시성 문제 해결을 위한 락 개념낙관적 락 (Optimis..
[InConcert] SSE+Redis를 활용한 실시간 알림
·
Projects
해당 글은 단일 서버 환경 기준입니다. 다중 서버 환경에서의 몇 가지 개선점은 [결론]에 짧게 정리했습니다. 특정 키워드에 관심 있는 사용자가 해당 키워드가 포함된 게시물이 등록되었을 때, 실시간으로 알림을 받을 수 있도록 `SSE(Server-Sent Events)와 Redis`를 활용하여 실시간 알림 시스템을 구축했다. 1. SSE + Redis 조합 선택 이유실시간 알림 시스템을 구현할 때 고려했던 대표적인 기술로는 WebSocket, Firebase Cloud Messaging(FCM), Server-Sent Events(SSE) 등이 있다. 이 중에서 SSE + Redis 조합을 선택한 이유는 다음과 같다. SSE + Redis 조합 선택 이유처음에는 양방향 통신이 가능한 WebSocket을 고..
[InConcert] LazyInitializationException 해결
·
Projects
1. 문제 상황SSE(Server-Sent Events)를 사용해 실시간 알림을 발송하던 중 다음 예외가 발생했다.com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy [com.inconcert.domain.category.entity.Category#1] - no Session (through reference chain: com.inconcert.domain.post.dto.PostDTO["postCategory"]-> com.inconcert.domain.category.entity.PostCategory["category"]->com.inconcert.domain.category.entity.Category$..
[InConcert] 스크래핑 비동기 처리(2)
·
Projects
앞 내용은 [InConcert] 스크래핑 비동기 처리(1) ☜ 여기서 확인 1. AOP를 활용한 성능 측정 및 최적화비동기 및 병렬 처리 적용 후, 실제로 성능이 얼마나 개선되었는지 확인하기 위해 `AOP(Aspect-Oriented Programming)`를 활용하여 실행 시간을 측정했다.AOP를 적용하면 스크래핑 로직의 실행 시간을 자동으로 로깅할 수 있어, 성능 개선 효과를 수치적으로 분석할 수 있다. 2. AOP를 활용한 실행 시간 측정실행 시간 측정 애노테이션 생성먼저, 실행 시간을 측정할 메서드에 적용할 애노테이션을 정의했다.이 애노테이션을 특정 메서드에 추가하면, AOP가 실행 시간을 자동으로 기록한다.import java.lang.annotation.*;@Target(ElementType...
[InConcert] 스크래핑 비동기 처리(1)
·
Projects
1. Selenium을 선택한 이유웹 스크래핑을 할 때 대표적으로 Selenium과 Jsoup이 사용된다.이번 프로젝트에서는 PlayDB에서 공연 정보를 스크래핑하는 과정에서 Selenium을 선택했다. Selenium vs Jsoup 비교 장점단점Selenium- 동적 콘텐츠(JavaScript 렌더링) 처리 가능- 로그인, 버튼 클릭 등 브라우저 자동화 가능- 실행 속도 느림 (브라우저 직접 실행)- CPU/메모리 사용량 높음Jsoup- 빠르고 가벼움- HTML 문서 파싱 및 데이터 추출이 간편- JavaScript로 생성된 콘텐츠는 크롤링 불가- 브라우저 상호작용 불가능 PlayDB에서 공연 목록과 상세 정보는 JavaScript를 통해 동적으로 로드된다. 즉, 단순한 정적 HTML을 가져오는 Js..