spring boot

1. 들어가며지난 글에서는 선착순 승인 시스템에서 발생한 Race Condition 문제를 분석했습니다. 정원 10명인 모임에서 20명이 동시에 승인되는 심각한 정합성 문제였습니다.원인은 명확했습니다:Check-Then-Act 패턴: 정원 검사와 승인 사이의 시간 차비원자적 연산: currentMembers++가 DB 수준에서 원자적이지 않음트랜잭션 격리 수준의 한계: 다른 트랜잭션의 변경을 읽지 못함오늘은 JPA의 비관적 락(Pessimistic Lock)을 적용하여 이 문제를 해결하는 과정을 공유합니다. 2. 비관적 락(Pessimistic Lock)이란?개념비관적 락은 "충돌이 발생할 것"이라고 비관적으로 가정하고, 데이터를 읽는 시점에 락을 거는 방식입니다.DB 수준에서 SELECT ... FOR..
1. 들어가며현재 개발 중인 지역 기반 소셜 커뮤니티의 "소 모임" 서비스에서 인원이 제한된 모임에 참가자를 승인하는 기능을 제공하고 있습니다.서비스의 핵심은 정해진 인원 내에서만 사용자를 승인해야 한다는 점이였습니다. 로컬 환경에서의 단일 요청 테스트는 문제가 없었지만, 실제 운영 환경과 유사한 동시성 테스트를 진행하던 중 정합성 문제를 발견했습니다.오늘은 선착순 승인 시스템에서 발생한 Race Condition(경쟁 상태) 문제와 이를 분석한 과정을 공유해 드리려고 합니다. 2. 문제 상황: 정원을 초과한 승인모임 서비스의 비즈니스 로직은 간단합니다. 현재 승인된 인원이 정원보다 적을 때만 모임 주최자가 승인을 수행합니다.하지만 부하 테스트 도중, 정원을 조과하여 승인이 이루어지는 현상을 목격했습니다..
"이벤트 있다" 사이드 프로젝트는 지역 기반 커뮤니티 플랫폼으로, 사용자들이 게시글이나 모임을 작성할 때 지역을 선택해야 합니다.한국의 행정구역 데이터는 다음과 같은 특징이 있습니다. 계층 구조: 시/도 -> 시/군/구 -> 읍/면/동 (3단계)데이터 크기: 총 18,695개의 지역 (시/도 16개 + 시/군/구 264개 + 읍/면/동 18,695개)변경 빈도: 연 1~2회 (행정구역 개편 시에만)조회 빈도: 매우 높음 (모든 게시글/모임 작성 시)Region Entity 설계 🔽더보기더보기더보기더보기@Entity@Table(name = "regions")@Getter@NoArgsConstructor@AllArgsConstructor@Builderpublic class Region { @Id ..
Spring Boot 애플리케이션을 8080 포트에서 운영 중인 EC2 인스턴스에 도메인을 연결하고, Nginx 리버스 프록시와 Let's Encrypt SSL 인증서를 적용한 과정을 정리했습니다.사전 지식: 주요 용어 정리HTTP vs HTTPSHTTP (Hyper Text Transfer Protocol)웹에서 데이터를 주고받기 위한 통신 규약. 모든 데이터가 평문으로 전송되어 중간에 탈취 시 내용이 그대로 노출됩니다.HTTPS (HTTP Secure)SSL/TLS 암호화를 적용한 HTTP.모든 통신 내용이 암호화되어 중간에 탈취되어도 내용을 확인하거나 위변조할 수 없습니다.Nginx웹 서버 소프트웨어로, 다음과 같은 역할을 합니다.웹 서버정적 파일(HTML, CSS, JS, 이미지 등)을 제공리버스..
슬라이딩 윈도우 로그 처리율 제한에 대해서 정리하려고 합니다.Sliding Window Log Rate Limiter는 뭘까?Fixed Window(고정 윈도우)와 달리 고정된 시간 구간이 아닌 현재 시점을 기준으로 과거 N분간의 요청 기록을 실시간으로 추적하는 방식 입니다. 5분 슬라이딩 윈도우 예시는 다음과 같습니다. 현재 시각이 09:03:30 이라면09:03:30 기준으로 08:58:30 ~ 구간의 요청들을 확인해서09:04:00이 되면 08:59:00 ~ 09:04:00 구간으로 윈도우를 슬라이딩합니다. 동작원리마찬가지로 사이드 프로젝트에서 슬랙 알림 중복 발송 방지를 위해 사용하였습니다.Fixed Window의 문제점들을 해결하기 위해 개선된 방식을 적용했습니다. ConcurrentHashMa..
1편 - 예외 알림 슬랙 연동으로 가볍게 운영하기https://buly.kr/9tBJYQC 들어가며지난 글에서는 Slack 알림 시스템을 만들고, 동일한 예외가 반복해서 발생하더라도 알림이 중복으로 발생하지 않도록 처리율 제한 클래스를 만들었습니다. (SimpleRateLimiter) 단일 서버 환경에서는 기대한 대로 잘 작동했습니다. 근데 배포 전에 한번 더 생각해볼 점이 있다고 생각했습니다. 잠재적 문제점들에 대해서 분석한 점을 정리해보겠습니다. 어떤 문제가 예상될까?서버별 독립 동작private final ConcurrentHashMap alerts = new ConcurrentHashMap();ConcurrentHashMap이 서버 간 데이터 동기화가 불가능하다는 직접적인 공식 문서는 없지만, J..
솜사탕코튼
'spring boot' 태그의 글 목록