문제https://school.programmers.co.kr/learn/courses/30/lessons/42627# 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이문제의 중요 포인트작업 우선순위: 요청 시점과 소요 시간을 고려하여 가장 효율적인 작업 처리 순서를 결정하는 것이 중요하다.우선순위 큐: 대기 중인 작업을 관리하기 위해 우선순위 큐를 사용하여 소요 시간이 짧은 작업을 우선 처리한다.시간 관리: 현재 시간과 작업 완료 시간을 정확히 관리하여 대기 시간을 계산해야 한다.해당 문제의 유형은 힙(Heap)이다.우선순위 큐는 내부적으로 정렬 알..
문제https://school.programmers.co.kr/learn/courses/30/lessons/49189 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이이 문제는 BFS(너비 우선 탐색) 알고리즘을 사용하여 해결할 수 있다. 왜 BFS를 사용해야 할까?BFS는 그래프 탐색에서 최단 경로를 찾는 데 효율적이다.최단 경로 보장: BFS는 시작 노드에서부터 인접한 노드들을 모두 방문한 후, 그 다음 레벨의 노드들을 방문하기 때문에, 먼저 방문된 노드들은 최단 경로로 방문된 것이다. 따라서 최단 경로를 보장한다.단순하고 직관적: BFS는 큐(Q..
문제https://school.programmers.co.kr/learn/courses/30/lessons/42861 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이이 문제는 최소 스패닝 트리를 찾는 문제로, 프림 알고리즘을 사용해 해결할 수 있다. 더보기※ 최소 스패닝 트리최소 스패닝 트리(Minimum Spanning Tree, MST)는 그래프에서 모든 노드를 최소 비용으로 연결하는 개념이다. 최소 스패닝 트리를 구하는 방법으로 대표적으로, 크루스칼 알고리즘과 프림 알고리즘이 존재한다. 크루스칼 알고리즘- 모든 엣지를 가중치 순으로 정렬하고, ..
문제https://school.programmers.co.kr/learn/courses/30/lessons/64062 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이이 문제는 이진 탐색(Binary Search)와 투 포인터(Two Pointer) 기법을 사용하여 해결할 수 있다. 배열의 크기가 최대 200,000,000 이므로 순차탐색의 경우 효율성이 떨어진다. 1. 이진 탐색을 사용하여 최대 인원을 찾기가능한 최소 인원은 1명, 최대 인원은 200,000,000명으로 설정하고 이진 탐색을 시작한다.중간값을 계산하고, 이 인원이 징검다리를 건널 ..
MSA 환경에서 분산 트랜잭션 방식으로 구현 시 서비스 간 이벤트 발행이 필수이다.각 서비스에서는 별도의 트랜잭션으로 로직을 처리하고 이벤트를 발행하게 되는데 이때 트랜잭션이 커밋 또는 롤백된 경우에만 이벤트가 발행되도록 보장해야 한다. 이 글에서는 Outbox 패턴과 Spring의 @TransactionalEventListener 방식을 고민한 끝에 @TransactionalEventListener를 사용하여 문제를 해결한 사례를 공유하고자 한다. Outbox 패턴 vs. @TransactionalEventListenerMSA 환경에서는 서비스 간 데이터 일관성을 유지하기 위해 분산 트랜잭션 처리가 필요하다. 이때 트랜잭션 커밋 또는 롤백 시에만 카프카 이벤트가 발행되도록 보장해야 한다.Outbox 패..
서론기존 마이페이지 기능은 사용자 서비스(user-service)가 상품 서비스(goods-service)와 주문 서비스(order-service)에 대해 각각 동기 방식으로 데이터를 요청했다. 이때 REST 기반의 통신을 지원하는 OpenFeign, 안전성을 위한 Resilience4j를 통해 서비스 간 통신을 진행한다. 이러한 구성은 다른 서비스에 장애가 발생하더라도 적절한 장애 처리가 가능했지만, 동기 방식의 통신 특성상 각 요청이 순차적으로 처리되어 전체 응답 시간이 길어진다는 단점이 존재했다. 성능 개선을 위해 CompletableFuture를 이용해 비동기 병렬 처리 방식으로 전환하기로 결정하였다.최종적으로 마이페이지 조회 시 필요한 여러 서비스의 데이터를 동시에 요청하고, 모든 요청이 완료될..
서론MSA 환경에서 상품 주문 처리 기능을 구현하는 과정에서 트랜잭션과 이벤트 발행의 실행 시점 차이로 인해 문제가 발생하였다. MSA 환경에서 트랜잭션과 이벤트 발행의 중요성트랜잭션과 이벤트 간의 일관성을 보장하는 것은 시스템의 안전성, 데이터 일관성, 그리고 서비스 간 느슨한 결합을 유지하는 데 중요하다.데이터 일관성 유지: 트랜잭션이 성공적으로 커밋된 경우에만 이벤트를 발행함으로써, 데이터 일관성을 보장해야 한다.ex) 주문 처리가 성공적으로 이루어진 경우에만 결제 처리 이벤트를 발행해야 한다.분산 시스템에서의 느슨한 결합: 이벤트 기반 아키텍처는 서비스 간의 느슨한 결합을 지원한다.트랜잭션 결과에 따라 이벤트를 발행하면, 각 서비스는 독립적으로 작동할 수 있으며, 이벤트를 구독하는 방식으로만 다른..
서론상품 재고 관리의 중요성상품 재고 관리는 커머스 프로젝트에 있어 핵심적인 과제 중 하나이다.재고 부족으로 인한 판매 기회 손실, 정확도 저하로 인한 고객 만족도 감소 등 다양한 문제가 발생할 수 있다.이로인해 실시간으로 정확한 재고 파악과 이를 기반으로 빠르게 의사결정을 내리는 것이 중요하다. 레디스(Redis)를 활용한 재고 관리 시스템의 필요성이러한 상품 재고 관리에 있어 레디스(Redis)를 활용한 방식은 큰 강점을 가진다.레디스는 키-값 저장소로써, 빠른 데이터 처리 속도와 싱글 쓰레드를 통한 높은 동시성 처리 능력을 가진다.이를 통해 대규모 트래픽이나 대량의 데이터가 발생하는 상황에서도 실시간으로 재고 정보를 업데이트하고 조회할 수 있다. 현재 커머스 프로젝트에서 상품 재고를 레디스 캐시(C..
자바 스프링 MSA 환경에서 카프카를 이용해 주문 취소 기능을 구현하며 발생한 문제와 해결 방법에 대해 작성한다. 소개구현하고자 하는 바는 다음과 같다.사용자는 자신의 주문에 대해 '주문 취소'를 요청한다.주문 서비스는 주문 취소 작업 처리 후 카프카에 '주문 취소 토픽'에 이벤트를 발행한다.이때 주문 취소 토픽은 하나의 파티션으로 구성되어 있다.상품 서비스와 결제 서비스는 '주문 취소 토픽'에서 이벤트를 소비해서 작업을 처리한다. 문제주문 서비스에서 주문 상태를 취소로 변경하고 주문 취소 이벤트를 카프카 주문 취소 토픽에 발행해 상품 서비스와 결제 서비스에서 해당 주문 취소 토픽을 구독하고 이벤트를 소비하려 했다. 그러나 테스트 결과는 달랐다. 이벤트가 제대로 발행되는 것은 확인했으나, 두 서비스 모두..
서론상품의 주문 처리 속도는 고객 만족도에 직접적인 영향을 미친다.데이터베이스로 재고를 관리하는 방법은 데이터의 일관성을 유지하는 데는 효과적이지만, 높은 트래픽이 발생하면 데이터베이스에 과부하가 걸려 사용자 경험에 부정적인 영향을 미친다.이 문제를 해결하기 위해, 데이터베이스 대신 Redis 캐시를 사용하여 상품 재고를 관리하는 방식으로 시스템을 개선하기로 결정하였다. Redis는 고성능 키-값 저장소로, 빠른 읽기 및 쓰기 속도를 제공한다.성능 개선 과정은 크게 세 단계로 나누어 진행했다.Write-Through 쓰기 전략: Redis와 데이터베이스 모두 데이터를 쓰는 방식Write-Back 쓰기 전략: Redis에만 데이터를 쓰고 특정 조건에서 데이터베이스에 데이터를 업데이트하는 방식Redis의 L..