전체 글

Database

[Database] 비관적 락(Passimistic Lock)과 낙관적 락(Optimistic Lock)

동시성 제어의 중요성데이터베이스나 분산 시스템에서는 여러 트랜잭션이 동시에 하나의 데이터에 접근할 때, 데이터의 일관성과 무결성을 보장하기 위해 동시성 제어가 필수적입니다.올바른 동시성 제어가 이루어지지 않으면 더티 리드(Dirty Read), 레이스 컨디션(Race Condition)과 같은 동시성 관련 문제가 발생할 수 있습니다.낙관적 락과 비관적 락낙관적 락과 비관적 락은 트랜잭션 제어를 통한 동시성 제어의 대표적인 락 기법으로, 데이터 무결성과 일관성을 유지하기 위해 사용됩니다.이 글에서는 낙관적과 비관적 락에 대한 정의와 동작원리 그리고 구현 방법에 대해 정리해 보겠습니다.낙관적 락 (Optimistic Lock)정의와 동작 원리낙관적 락은 동시성 제어 방식 중 하나로, 데이터의 충돌 가능성이 ..

Review

[Review] 조금 늦은 2024년 회고와 2025년 목표

주절주절2025년 올해는 대학을 졸업한 직후 작은 회사에서 시작한 개발자로써의 커리어가 5년차가 되는 해입니다.첫입사때 당시 나의 지식으로는 도저히 이해하기에 어렵던 코드와 쿼리들 그리고 주어지는 업무속 여러가지 IT 용어들이 무슨말인지 조차 알지못해 용어의 뜻을 하나하나 검색하며 일했던 초창기에 비해, 지금의 저는 물론 아직 부족하지만 그때에 비해 많이 성장한 것 같습니다.  올 한해는 특히 많은 일들이 있었고, 그 많았던 일들 만큼 새로운 지식과 생각들 저에게 다시 한겹 쌓이고 앞으로 살아갈 삶의 방향성을 되돌아보게 되었습니다.최근들어 제 또래의 지인들과 하는 말 가운데 "내가 느끼는 나의 모습은 아직 고등학교, 대학교때의 모습인데 몸만 이렇게 늙은것 같다."는 이야기를 농담으로 하곤합니다. 마찬가지..

Kafka

[Kafka] Kafka를 활용한 SAGA 패턴 기반 분산 트랜잭션 구현

MSA 환경에서 서비스 간의 데이터 일관성을 보장하는 것은 복잡한 문제입니다. 특히 여러 서비스에 각각 다른 데이터베이스가 존재하며 트랜잭션을 유지해야하는 상황에서 ACID 원칙을 지키는 것은 쉽지 않습니다. 이 기술적 문제를 해결하기 위하여 SAGA 패턴을 적용하여 Kafka 기반의 분산 트랜잭션을 구현하는 미니 프로젝트를 진행하고 글로 정리하였습니다. 프로젝트 전체 코드는 아래 github을 통해 확인할 수 있습니다.https://github.com/kwj2435/spring-redis-stock-managerSAGA 패턴SAGA는 '이야기' 혹은 '서사'라는 뜻을 가진 영어단어입니다. 단어의 뜻과 같이 SAGA 패턴의 분산 트랜잭션은 2PC(Two-Phase Commit)와 같은 전통적인 트랜잭션 ..

Redis

[Redis] Redis 분산락(Distributed Lock)을 이용한 재고관리 구현 - 2

프로젝트 개요이번 프로젝트에서는 분산 시스템 환경에서 발생하는 다양한 문제 상황중, 서로 다른 요청이 하나의 데이터에 몰리게 되어 발생하는 레이스 컨디션(Race Condition) 문제를 분산 락을 이용해 해결하는 미니 프로젝트를 진행하고 이를 정리했습니다.이전글 - [Redis] Redis 분산락(Distributed Lock)을 이용한 재고관리 구현 - 1저번 글에서는 프로젝트를 위한 환경설정과 애플리케이션 시작시 Redis Warmup, 서비스 시점 DB - Redis 실시간 동기화를 위한 처리등을 진행했습니다.이번 글에서는 재고 관리 관련 API 개발 및 예외처리 그리고 Jedisson을 이용한 Redis 분산락을 적용하고 테스트 했던 내용을 정리했습니다.프로젝트 전체 코드는 아래 github을..

Redis

[Redis] Redis 분산락(Distributed Lock)을 이용한 재고관리 구현 - 1

프로젝트 개요이번 프로젝트에서는 분산 시스템 환경에서 발생하는 다양한 문제 상황중, 서로 다른 요청이 하나의 데이터에 몰리게 되어 발생하는 레이스 컨디션(Race Condition) 문제를 분산 락을 이용해 해결하는 미니 프로젝트를 진행하고 이를 정리했습니다. 코드들을 모두 게시글에 작성할 수 없어, 일부 설정은 다른 게시글에 정리된 내용을 링크하였습니다.프로젝트 전체 코드는 아래 github을 통해 확인할 수 있습니다.https://github.com/kwj2435/spring-redis-stock-manager기술 스택Spring Boot 3.4.1Spring Data JPAJava 17Redis 7.0KafkaH2 Database 구현 요구 사항주요 기능재고 등록: 제품과 초기 재고량을 Redis에..

Redis

[Redis] Redis 클러스터(Redis Cluster) 구성하기

Redis 클러스터(Cluster)Redis 클러스터(Redis Cluster)는 분산 환경에서 데이터의 가용성과 확장성을 제공하기 위해 설계된 Redis의 네이티브 분산 시스템이다. Redis 클러스터는 데이터가 자동으로 여러 노드에 분산되며, 고가용성과 샤딩을 지원한다. Redis 클러스터를 더 쉽게 설명하면, 큰 데이터를 여러 Redis 서버에 나누어서 저장하고, 서버가 고장 나도 자동으로 복구할 수 있도록 도와주는 시스템이다.주요 특징데이터 샤딩(Sharding)데이터를 16,384개의 해시 슬롯(Hash Slot)으로 나누고 이를 여러 노드(Master)에 분산하여 저장하는 구조이다.각 마스터 노드는 일부 해시 슬롯을 담당하며, 이를 통해 데이터가 고르게 분배된다.고가용성(High Availab..

Java

[Java] Java 원격 디버깅(Java Remote Debugging)

이슈 사항Dev, PJ, QA, Stage 환경에서 이슈 발생시 원인 파악을 위해 보통 Local 환경으로 해당 이슈를 가져와서 디버깅을 진행해당 문제를 Local에서 재현 및 원인파악을 위한 리소스가 적지 않게 필요문제가 발생한 환경에 직접 붙어서 디버깅을 하고 싶다는 니즈를 해결하기위한 방법을 고민JDWP(Java Debug Wire Protocol)와 설정Java 에서는 JDWP를 통해 디버거와 JVM간 통신을 지원해준다.1. 원격 디버깅 설정원격 디버깅을 활성화하려면 JVM 옵션에 디버깅 관련 설정을 추가해야한다. Java8과 Java9 이상에서의 설정 방식이 약간 다르다.Java 실행 옵션에 아래 옵션을 추가한다.Java 8java -agentlib:jdwp=transport=dt_socket,..

Java

[Java] JVM의 한계와 GraalVM 살펴보기

들어가기 앞서최근 JVM을 보완하는 새로운 가상머신이 개발되었고 생각보다 많은 서비스에서 사용중이라는 소식을 들었다.Java는 다른 컴파일러 언어에 비해 느리다는 이야기를 들었고, 그 원인이 JVM에서 비롯되었다고 익히 알고 있던 와중 보완된 JVM을 통해 Java의 성능 문제를 해결할 수 있다는 사실에 흥미를 가지고 살펴 보았다. 기존 JVM의 한계사실 Java의 시작을 함께한 JVM을 대체하기 위한 시도는 과거에도 빈번했다.C, C++, Golang과 같은 컴파일러 기반의 언어는 컴파일 과정에서 바로 기계어로 번역되고 실행 파일을 만들어낸다. 그리고 컴파일 시에 코드 최적화까지 진행하여 인터프리터 대비 뛰어난 성능을 가지고 있다. 반면, Java는 플랫폼 종속적인 문제를 해결하기 위해 인터프리터(In..

turtleDev
거북한 개발자의 기록