전체 글 32

요청의 멱등성 보장을 위한 설계

문제 인식서비스 간 통신은 타임아웃, 네트워크 통신 오류 등으로 인해 수많은 실패 요소를 관리해야 합니다특히, 주문 생성 그리고 재고 차감과 같은 중요한 변경에 대한 API 를 재시도할때 멱등성을 보장하여 시스템의 신뢰성을 보장해야 합니다 이에 대해서 주문(Order) 서비스와 재고(Inventory) 서비스 간의 API 통신에서 멱등성을 확보하기 위해 세 차례의 설계 과정을 공유하려고 합니다1차 설계최초 설계 목표는 "API 재시도 시, 중복 요청을 막고 이전 결과를 반환하자" 였습니다. 하지만 이 과정에서 멱등키에 대한 설계 원칙을 위반하는 실수가 발생하였습니다 먼저 1차 설계의 시퀀스 다이어그램은 아래와 같습니다 [시퀀스 다이어그램] 주문 생성 → 재고 차감 시나리오시퀀스 설명정상 시나리오주문 생성..

트러블 슈팅 2025.11.08

Redis Purge 를 사용할 경우 문제점

쓰기 작업을 수행할 때 캐시 무효화를 위해 기존 값을 삭제하는 방식에서는 문제가 생길 수 있다 더불어 읽기 조회시 캐시 전략을 Look Aside 방식으로 처리할 경우 명확한 문제 케이스가 생긴다 먼저 Look Aside 방식을 간단히 알아보자 Cache Aside 패턴이라고도 불리며 데이터를 찾을 때 우선 캐시에 저장된 데이터가 있는지 확인 후 만약 캐시에 데이터가 없다면 DB 에서 데이터를 조회, 이후 캐시를 업데이트하는 전략 fun getUser(id: Long): User { var user = cache.get(id); if (user == null) { user = db.get(id); setCache(user); } return user;}문제 ..

학습일지/Redis 2025.10.23

[Redis 맛보기] Sorted Set 활용 - 리더보드

Redis 를 활용하면 리더보드(순위표), 장바구니 등을 간단히 구현할 수 있다 여기서는 리더보드를 구현하는 테스트를 진행한다 요구사항 : 제일 많이 구매한 상품 10개 조회 ERDProduct 와 Order 추가 Sorted Set 을 활용한 리더보드 구현@Configurationpublic class RedisConfig { @Bean public RedisTemplate rankTemplate( RedisConnectionFactory redisConnectionFactory ) { RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnect..

학습일지/Redis 2025.10.21

[분산트랜잭션 맛보기] - Saga

Saga분산 시스템에서 데이터 정합성을 보장하기 위해 사용하는 분산 트랜잭션 처리 방식각 작업을 개별 트랜잭션으로 나누고 실패시에 보상 트랜잭션을 수행하여 정합성을 맞추는 방식보상 트랜잭션 로직은 멱등해야하며 재시도 가능해야 한다Timeout Error, DB 지연 등의 이유로 동일한 요청이 여러번 처리되어도 예상한 동작을 수행해야 한다TCC 와 달리 Saga 는 리소스 예약 없이 즉시 상태 변경을 수행해야 한다재고차감 예약이 아닌 즉시 차감최종적 일관성(Eventual Consistency) 을 보장재고차감이 성공될 수 있지만 해당 시점에 포인트 차감이 아직 수행 중일 수 있음 → 그러나 시간이 지나면서 정상적으로 데이터가 정상흐름대로 맞춰짐Choreography 방식과 Orchestration 방식이..

[분산트랜잭션 맛보기] - TCC

TCC 패턴TCC(Try-Confirm-Cancel) 는 분산 시스템에서 데이터 정합성을 보장하기 위해 사용하는 분산 트랜잭션 처리 방식 전통적인 트랜잭션은 DB 의 Rollback, Commit 에 의존한다 TCC는 트랜잭션을 애플리케이션 레이어에서 논리적으로 관리한다 세 단계로 나누어 트랜잭션을 관리한다 Try : 필요한 리소스를 점유할 수 있는지 검사하고 임시로 예약한다Confirm : 실제 리소스를 확정 처리하여 DB에 반영한다 Cancel : 문제가 생긴 경우, 예약 상태를 취소하여 원복한다 Try, Confirm, Cancel 단계는 멱등하게 설계가 되어야 한다 주문 + 결제 요청 흐름시 OrderService 가 Coordinator 가 되는 상황테스트 주문(Order) / 상품(Produc..

[분산트랜잭션 맛보기] - 2PC

MSA 전환시 문제점서비스간 데이터정합성을 보장하기 어려움 기존 모놀리식주문, 상품, 포인트 기능이 존재한다고 가정 하나의 애플리케이션과 하나의 DB 를 공유하고 있음 → 트랜잭션 기능만으로 데이터 정합성을 맞출 수 있음 MSA 환경각 서비스는 자신만의 DB 를 구성하여 각 서비스간의 호출은 네트워크 통신을 통해 이루어짐 트랜잭션은 각 서비스 구간내에서만 보장할 수 있게된다 포인트 사용 중 에러가 발생하게 되면 재고는 차감되어있는데 포인트는 사용하지 않은 상태로 데이터 불일치 상태가 발생하게 된다 분산 트랜잭션을 보장하기 위한 방법들2PC TCCSAGA2PCTwo-Phase Commit Protocol 의 약자로 분산 시스템에서 트랜잭션의 원자성을 보장하기 위해 사용하는 프로토콜 트랜잭션을 두 단계로 나..

[Architecture] 레플리카 / 다중 리더 / 동시 쓰기 의 용어 및 개념 정리

리더와 팔로워 (Leader-Follower 복제)Replica (레플리카)각 복사본을 가지고 있는 노드를 의미한다Replica Set (레플리카 셋)복사본들의 집합을 의미한다리더와 팔로워를 설정하는 것이 가장 일반적인 복제 유지 방법리더는 데이터 읽기와 쓰기가 가능하고, 팔로워는 읽기만 가능한 방식으로 동작이러한 방법을 Leader-Based (또는 Leader-Follower, Active-Passive, Master-Slave) 복제라고 한다복제를 수행하는 방법은 구현에 따라 다를 수 있으며, 일반적으로는 복제 로그 또는 Stream 을 사용해서 복제 수행을 한다동기와 비동기 복제복제 입장에서 동기와 비동기 방식은 다른 레플리카에 복제가 되는 타이밍을 기준으로 구분된다동기 방식모든 레플리카 셋이 최..

[Java] JVM 메인 메모리와 작업 메모리 알아보기 (JMM)

JVM 메인 메모리와 작업 메모리 알아보기 (JMM)JVM 은 H/W + OS 같은 역할을 모두 수행한다C/C++ 개발자 관점의 JVM 은 사용자 모드 응용 프로그램즉 CPU 캐시 등 실제 H/W 수준을 통제하는 대부분의 코드는 C/C++ 기반 코드이며 Java 에서는 논외의 문제로 치부된다예를들어 캐시 일관성 문제등도 JVM 이라는 가상 머신내에서는 별개의 문제로 다뤄야 한다 → 캐시 일관성은 H/W 수준에서의 문제JMM 메인 메모리와 작업 메모리JVM 은 H/W 와 비슷하게 구성되어 있다Core / L1 Cache / L2 Cache 등기존 메모리 모델을 소프트웨어 상에서 추상화해놓은 것JVM 은 메인 메모리와 작업 메모리로 구별해놓음작업 메모리는 Thread 마다 부여된다Thread 에 종속되는 메..

학습일지/Java 2025.10.03

[ElasticSearch] ES 맛보기 - 자동검색 + 검색 기능

스프링 서버로 테스트 해보기ES 의 검색 기능을 활용해보기 위해 자동완성과 일반적인 검색 기능에 대해서 구현해보기목표검색시 자동완성 기능 (multi field, search_as_you_type, multi_match, bool_prefix)검색 기능 향상오타 허용 (fuzziness)조회시 평점 4.0 상위 노출 (should)일치하는 키워드 하이라이팅 (highlight)페이지네이션 (from, size)동의어 설정 (synonyms filter)한글, 영어 혼용 검색 기능 (nori_tokenizer)상품명, 설명, 카테고리 가중치 검색 (3:1:2) (multi_match)가격, 카테고리 필터링 (multi field, range, term)매핑과 세팅 정보@Document(indexName =..

[ElasticSearch] ES 맛보기 - 역인덱스(Inverted Index)

우리가 쿠팡이나 쇼핑몰에서 검색을 통해 원하는 물건을 찾는다이때 우리는 문자 순서에 상관없이 비슷한 물건을 조회할 수 있다ex) "맥북 에어 13" / "맥북 13 에어"어떻게 이 검색이 가능할까? ElasticSearch 에서는 역인덱스를 통해 관련된 것을 찾아서 조회하게 된다참고로 이런 작동 구조는 데이터 타입이 text 타입에 한해서만 적용된다역인덱스 (Inverted Index)필드 값을 단어마다 쪼개서 찾기 쉽게 정리해놓은 목록예시를 통해서 알아보자POST /products/_create/1{ "name": "Apple 2025 맥북 에어 13 M4 10코어"}POST /products/_create/2{ "name": "Apple 2024 에어팟 4세대"}POST /products/_c..