분류 전체보기 78

DB Lock

DB Lock여러 사용자가 재고 1개인 상품을 동시에 구매하려고 하면, 재고를 확인하고 차감하는 사이에 서로의 작업이 겹칠 수 있습니다. 이러한 상황을 Race Condition 이 발생했다 라고 합니다. Lock은 이런 상황에서 데이터가 틀어지지 않도록 접근 순서를 지키게 하는 장치입니다.이 글은 MySQL 8.0 InnoDB, 격리 수준은 기본값인 REPEATABLE READ를 전제로 합니다. 격리 수준이 READ COMMITTED이면 뒤에서 설명할 Gap Lock의 동작이 달라지므로, 재현이 되지 않는다면 먼저 격리 수준을 확인하는 것을 추천드립니다.-- 격리수준을 확인할수 있는 명령어SELECT @@transaction_isolation; Shared Lock (S Lock)Shared Lock은..

공부/DB 2026.07.20

Clustering, Replication, Sharding

단일 DB 서버로 구성된 상황에서 트래픽이 몰리거나, 더 이상 단일 서버로 운영하기 어려워질 수 있습니다. 상황에 따라 필요한 방법은 다르지만, 대표적으로 쓰이는 Clustering, Replication, Sharding에 대해 설명합니다. Clustering클러스터링은 하나가 아닌 여러 개의 서버로 구성하는 것을 말합니다.주목적: 가용성 + 부하 분산예시: 서버 A가 죽어도 B가 요청을 이어받아 서비스가 멈추지 않고(가용성), 평소에는 두 서버가 요청을 나눠 처리한다(부하 분산).위 상황은 단일 DB 서버를 통해 DB 스토리지에서 원하는 데이터를 서빙하는 상황입니다.이때 DB 서버에 문제가 생길 경우, 해당 문제는 곧 서비스 전체 장애로 이어질 수 있습니다.따라서 위와 같은 상황을 막기 위해 단일 D..

공부/DB 2026.07.16

다중 인스턴스 환경에 ShedLock 적용하기

상황@Scheduled가 붙은 메서드는 애플리케이션 인스턴스마다 등록됩니다. 따라서 다중 인스턴스 환경에서는 같은 스케줄러가 여러 번 실행되어 기대했던 동작과 다른 결과를 만들 수 있습니다.서버가 한 대일 때는 문제가 없지만, 무중단 배포를 위한 blue/green 환경, 오토 스케일링, 이중화 구성으로 애플리케이션 인스턴스가 둘 이상이 되면 모든 서버가 같은 시각에 같은 작업을 실행합니다.00:00서버 A: @Scheduled 작업 실행서버 B: @Scheduled 작업 실행서버 C: @Scheduled 작업 실행이러한 중복 실행을 막기 위해 ShedLock을 사용할 수 있습니다. ShedLock 이란?ShedLock은 여러 인스턴스가 같은 스케줄러를 동시에 실행하지 않도록 돕는 분산 락 라이브러리입니..

Framework/Spring 2026.07.13

앱 본인인증에서 전용 쿠키를 따로 만든 이유

앱 본인인증에서 전용 쿠키를 따로 만든 이유외부 본인인증 서비스를 앱 및 웹(WebView) 방식으로 연동하면서, 앱 방식에서만 전용 쿠키(CERT_SESSION_KEY)를 별도로 두게 된 이유와, 그 과정에서 CORS와 SameSite가 어떻게 맞물리는지 실제로 검증한 기록입니다.현재 저희 서버는 앱, 웹 방식을 모두 지원하고 있으며, 앱 및 웹 모두 하나의 웹뷰를 통해 구현이 되어있는 상태입니다. 또한 회원은 cookie 에 존재하는 jwt 토큰을 통해 식별합니다.한 줄 결론: 앱 방식의 콜백은 외부 도메인에서 오기 때문에 JWT(SameSite=Lax)가 실리지 않습니다. 그래서 SameSite=None으로 설정한 전용 임시 토큰 쿠키를 별도로 두게 됐습니다.그리고 이 콜백이 실제로 서버에 도달하려..

공부/구현 2026.06.29

Grafana 커스텀 대시보드 구축

Grafana 커스텀 대시보드 구축Grafana + Prometheus + Spring Boot Actuator를 함께 사용하고 있었습니다. Grafana에서 Spring Boot를 모니터링할 때 많이 쓰는 JVM (Micrometer) 대시보드를 가져와서 쓰고 있었는데, 이 대시보드는 JVM 내부 메트릭에 집중되어 있어서 정작 궁금한 것들에 대한 답을 주지 못했습니다.어떤 API가 느린지5xx 에러가 어디서 발생하는지DB 커넥션 풀은 괜찮은지이런 질문들에 답하려면 매번 Explore에서 쿼리를 직접 날려야 했고, 문제가 발생했을 때 한눈에 파악이 안 되는 게 가장 불편한 점이었습니다.그래서 직접 커스텀 대시보드를 만들었습니다. 전제 조건구성 요소상태Grafana v11.1.0설치 및 접속 가능Prome..

공부/인프라 2026.04.17

Blue-Green 배포 시 Graceful Shutdown 적용기

Blue-Green 배포 시 기존 컨테이너를 즉시 내리면 안 되는 이유 — Graceful Shutdown 적용기 배포 구조EC2 한 대에 Docker Compose로 Nginx + Spring Boot 앱을 올려서 사용하고 있습니다. 배포는 Blue-Green 방식이고, 흐름은 아래와 같습니다.Blue 컨테이너가 트래픽을 받고 있는 상태에서Green 컨테이너를 새로 띄우고Nginx upstream을 Green으로 전환하고Blue를 내립니다┌─────────────────────────────────────────┐│ EC2 ││ ││ ┌───────┐ ┌───..

공부/인프라 2026.04.06

Spring Boot CI/CD 빌드 시간 단축하기 - Gradle 최적화 전략

Spring Boot CI/CD 빌드 시간 단축하기 - Gradle 최적화 전략Spring Boot 프로젝트의 CI/CD 파이프라인에서 빌드와 테스트 단계가 과도하게 오래 걸리는 문제를 해결한 경험을 공유합니다.특히 RestDocs, Swagger 문서 생성을 포함한 복잡한 빌드 프로세스에서 6~7분 걸리던 CI/CD 시간을 절반 이하로 단축할 수 있었습니다. 1. 문제상황CI/CD 파이프라인에서 다음과 같은 문제들이 발생했습니다.GitHub Actions에서 빌드 완료까지 6~7분 이상 소요됩니다.특히 test 단계와 build 단계에서 대부분의 시간이 소비됩니다.코드 변경이 없어도 매번 전체 빌드를 새로 실행합니다.Docker 이미지 빌드도 매번 처음부터 다시 시작됩니다. 2. 원인 2.1 과도한 태..

공부/인프라 2026.02.09

DBeaver에서 MySQL Dump 시 소켓 연결 오류 해결

DBeaver에서 MySQL Dump 시 소켓 연결 오류 해결DBeaver에서 SSH 터널링으로 Docker 위에서 동작하는 MySQL에 접속해 쿼리는 정상 작동하는데, Dump(Data Transfer/Export)만 실행하면 Can't connect to local MySQL server through socket 오류가 발생하는 경우의 해결 방법을 정리합니다. 원인DBeaver가 AWS EC2에 있는 MySQL에 접속할 때, 직접 접속(3306 포트 개방)이 막혀 있다면 SSH 터널링을 사용합니다.이때 데이터의 흐름은 다음과 같습니다.DBeaver가 SSH 접속을 통해 EC2와 연결을 맺습니다.DBeaver는 로컬 Mac의 특정 포트(예: 37492)를 리스닝(Listening) 상태로 엽니다.사용..

공부/DB 2026.01.29

bluegreen-배포-환경에서-prometheus-메트릭이-끊겨-보이던-이유와-해결-방법

Blue/Green 배포 환경에서 Prometheus 메트릭이 끊겨 보이던 이유와 해결 방법Blue/Green 배포 환경에서 Prometheus의 target을 인스턴스 기준으로 설정한 상태에서 모니터링을 하다 보니, Grafana 그래프가 배포 시점마다 끊겨 보이는 문제가 발생했습니다.현재 Spring Boot + Actuator를 사용해 메트릭을 노출하고, Prometheus와 Grafana를 통해 이를 모니터링하고 있습니다.서비스는 Blue/Green 배포 방식으로 운영 중이며, 배포 시점에 따라 Spring Boot 인스턴스가 blue 또는 green으로 전환되는 구조입니다. 문제는 Prometheus가 특정 시점에는 dev-blue 인스턴스를 바라보다가, 배포 이후에는 dev-green 인스턴스..

공부/인프라 2026.01.02

Grafana 및 prometheus 활용 #2

Grafana 및 prometheus 활용 #2본 글에서는 Grafana와 Prometheus를 연결하는 방법과, 실제 모니터링에 바로 사용할 수 있는 대시보드 템플릿 적용 방법에 대해 다뤄보겠습니다. 1. Prometheus 데이터 소스 추가Grafana에서 Prometheus 메트릭을 조회하려면, 먼저 Prometheus를 Data Source로 등록해야 합니다.Grafana에 접속한 후 아래 메뉴로 이동합니다.Connections → Data sources 1.1 Prometheus 컨테이너 이름 확인현재 docker-compose를 통해 실행 중인 컨테이너는 다음과 같습니다.docker-compose를 사용하는 경우, 같은 네트워크에 속한 컨테이너들은 서비스 이름을 hostname으로 사용할 수 ..

공부/인프라 2025.12.31