1. 들어가며지난 글에서는 선착순 승인 시스템에서 발생한 Race Condition 문제를 분석했습니다. 정원 10명인 모임에서 20명이 동시에 승인되는 심각한 정합성 문제였습니다.원인은 명확했습니다:Check-Then-Act 패턴: 정원 검사와 승인 사이의 시간 차비원자적 연산: currentMembers++가 DB 수준에서 원자적이지 않음트랜잭션 격리 수준의 한계: 다른 트랜잭션의 변경을 읽지 못함오늘은 JPA의 비관적 락(Pessimistic Lock)을 적용하여 이 문제를 해결하는 과정을 공유합니다. 2. 비관적 락(Pessimistic Lock)이란?개념비관적 락은 "충돌이 발생할 것"이라고 비관적으로 가정하고, 데이터를 읽는 시점에 락을 거는 방식입니다.DB 수준에서 SELECT ... FOR..
1. 들어가며현재 개발 중인 지역 기반 소셜 커뮤니티의 "소 모임" 서비스에서 인원이 제한된 모임에 참가자를 승인하는 기능을 제공하고 있습니다.서비스의 핵심은 정해진 인원 내에서만 사용자를 승인해야 한다는 점이였습니다. 로컬 환경에서의 단일 요청 테스트는 문제가 없었지만, 실제 운영 환경과 유사한 동시성 테스트를 진행하던 중 정합성 문제를 발견했습니다.오늘은 선착순 승인 시스템에서 발생한 Race Condition(경쟁 상태) 문제와 이를 분석한 과정을 공유해 드리려고 합니다. 2. 문제 상황: 정원을 초과한 승인모임 서비스의 비즈니스 로직은 간단합니다. 현재 승인된 인원이 정원보다 적을 때만 모임 주최자가 승인을 수행합니다.하지만 부하 테스트 도중, 정원을 조과하여 승인이 이루어지는 현상을 목격했습니다..
이전 글https://buly.kr/GE92sO0 변경이 거의 없는 행정 구역 코드를 매번 조회해야할까?"이벤트 있다" 사이드 프로젝트는 지역 기반 커뮤니티 플랫폼으로, 사용자들이 게시글이나 모임을 작성할 때 지역을 선택해야 합니다.한국의 행정구역 데이터는 다음과 같은 특징이 있습니다.computerlove.tistory.comhttps://buly.kr/APw2VT6 Spring Cache를 분명히 적용했는데?이전 글- https://buly.kr/6135y00 해당 이슈에 대해 로컬 캐시인 Caffeine Cache를 적용하여 해결하고자 하였습니다.그래서 정말 단순하게 많은 쿼리를 발생 시켰던 메서드 위에 @Cacheable 설정을 추가해주computerlove.tistory.com 테스트 개요목적-..
이전 글- https://buly.kr/6135y00 해당 이슈에 대해 로컬 캐시인 Caffeine Cache를 적용하여 해결하고자 하였습니다.그래서 정말 단순하게 많은 쿼리를 발생 시켰던 메서드 위에 @Cacheable 설정을 추가해주었습니다. 적용한 메서드는 캐싱 처리가 되는 것을 눈으로 확인할 수 있었습니다. 실패한 케이스@Servicepublic class RegionService { @Cacheable(value = "regions", key = "'allRegionsMap'") public Map getAllRegionsAsMap() { return regionRepository.findAll()... } public List getRegionH..
"이벤트 있다" 사이드 프로젝트는 지역 기반 커뮤니티 플랫폼으로, 사용자들이 게시글이나 모임을 작성할 때 지역을 선택해야 합니다.한국의 행정구역 데이터는 다음과 같은 특징이 있습니다. 계층 구조: 시/도 -> 시/군/구 -> 읍/면/동 (3단계)데이터 크기: 총 18,695개의 지역 (시/도 16개 + 시/군/구 264개 + 읍/면/동 18,695개)변경 빈도: 연 1~2회 (행정구역 개편 시에만)조회 빈도: 매우 높음 (모든 게시글/모임 작성 시)Region Entity 설계 🔽더보기더보기더보기더보기@Entity@Table(name = "regions")@Getter@NoArgsConstructor@AllArgsConstructor@Builderpublic class Region { @Id ..