안녕세계
MDC란? MDC(Mapped Diagnostic Context)는 스레드 단위로 데이터를 읽고 쓸 수 있는 기능입니다. MDC를 사용하면 멀티 스레드 환경에서 각 스레드의 실행 컨텍스트를 구분할 수 있어서 모니터링시 추적에 용이합니다. 예를 들어 멀티 스레드 환경에서는 요청 순서대로 로그가 찍히지 않고, 로그가 섞여서 쌓이게 되므로 동일한 스레드의 컨텍스트를 추적하기 위해 MDC를 사용합니다. 스레드 로컬에 대해 알고 계시는 분들은 MDC와 스레드 로컬의 차이점이 무엇인지 궁금하실 수 있을 것 같습니다. 사실, MDC는 내부적으로 스레드 로컬을 사용하고 있어서 별도로 스레드 로컬을 선언할 필요없이 MDC를 바로 사용하면 됩니다. // MDC 내부 public class MDC { static final..
이번 포스팅에서는 제네릭과 무공변에 대해 알아보고, 무공변을 공변과 반공변으로 만드는 방법에 대해 알아봅니다. 우선, 제네릭에 대해 설명하기 위해 아이스크림 가게 예제를 만들어 보겠습니다. 현재 아이스크림 가게에는 초코 아이스크림과 민트 아이스크림이 있다고 가정해봅니다. interface IceCream class ChocoIceCream : IceCream class MintIceCream : IceCream 그리고 콘에 아이스크림을 올리는 put 메서드를 추가하고, 콘에서 아이스크림을 꺼내는 get 메서드를 추가합니다. class Cone { private val iceCreams: MutableList = mutableListOf() fun get(index: Int): IceCream { retu..
SSE(Server-Sent-Events)란? 웹 페이지가 새로운 데이터를 받기 위해서는 일반적으로 서버에 요청을 보내야 합니다. 그러나 SSE(Server-Sent Events)를 사용하면 서버가 요청 없이도 웹 페이지에 새로운 데이터를 전송할 수 있습니다. 이는 서버에서 클라이언트로 데이터를 주기적으로 전송해야 할 경우에 특히 유용합니다. 예를 들어, 서버가 특정 데이터의 변경 사항을 주기적으로 클라이언트에 알려주어야 하고, 클라이언트는 이를 대시보드 등의 화면에서 실시간으로 표시해야 하는 상황에서 활용될 수 있습니다. 웹소켓을 통한 구현도 가능하지만, 양방향 통신이 필요 없고 오직 서버에서 클라이언트로의 단방향 통신만 필요한 경우 SSE의 사용이 권장됩니다. SSE는 HTML5부터 지원되는 표준 스..
이전 포스팅에서 Redisson을 사용하여 Redis 분산 락을 손 쉽게 구현할 수 있는 방법에 대해서 알아보았습니다. 이번 포스팅에서는 분산 분산 락을 거는 위치에 따라 발생할 수 있는 문제에 대해 알아보고 권장하는 분산 락 위치에 대해 알아봅니다. 트랜잭션 이후 분산 락 분산 락을 건다는 의미는 결국 동일 자원에 대해 동시 작업하는 것을 제어하기 위함입니다. 그렇다면 우리는 분산 락을 건 상태에서 데이터베이스 트랜잭션과 관련된 작업을 시작해야합니다. 그런데 만약 데이터베이스 트랜잭션을 먼저 시작하고 분산 락을 걸게되면 어떻게 될까요? 종종 데이터베이스 트랜잭션이 먼저 시작된 이후 분산 락을 걸어도 별 다른 문제가 발생하지 않는고 생각할 수도 있습니다. 다음 그림을 살펴보겠습니다. 위 그림에서 처럼 트..
이전 포스팅에서는 Redisson을 사용하여 Redis 분산 락을 손 쉽게 구현할 수 있는 방법에 대해서 알아보았습니다. 이번 포스팅에서는 특정 요구 사항을 분산 락과 상태 키를 사용하여 동시성 이슈를 제어하며 동시에 작업을 처리할 수 있는 방법에 대해 알아보겠습니다. 일반적인 분산 락 사용 분산 락을 활용하는 일반적인 방식은 먼저 락을 획득한 다음, 특정 작업(여기서는 compute 메서드)을 실행하고 나서 락을 해제하는 순서로 진행됩니다. 동시성 문제가 발생할 수 있는 작업에 분산 락을 적용하면, 동시 작업시 발생할 수 있는 문제들을 안정적으로 작업을 처리할 수 있습니다. 아래 코드는 lockKey에 대해 락을 확득하고, 로직을 실행한 뒤 락을 해제하는 분산 락 사용의 일반적인 예시입니다. class..
분산 락이란? 분산 락(Distributed Lock)은 다수의 서버(또는 프로세스)가 동시에 같은 자원에 접근할 때 발생할 수 있는 동시성 문제를 해결하기 위해 사용되는 동기화 메커니즘입니다. 분산 락의 핵심은 "하나의 자원에 대해 한 번에 하나의 서버만 작업을 수행할 수 있다"는 것입니다. 이를 통해 데이터의 동시 변경을 막고, 시스템 전체의 데이터 일관성을 보장합니다. 분산 락에 대해 이해하기 위해서 먼저 락(Lock)의 기본 개념과 분산 시스템(Distributed System)의 특성을 알아보겠습니다. 락이란? 락은 한 번에 하나의 프로세스만 특정 자원을 사용할 수 있도록 보장하는 메커니즘입니다. 대표적인 예로 데이터베이스 레코드 락이 있습니다. 데이터베이스 레코드 락은 프로세스1이 데이터A를 ..
SNS (Simple Notification Service) SNS는 publisher(producer)가 subscriber(consumer)에게 메시지를 전달할 수 있는 관리형 서비스 입니다. publisher는 topic에 메시지를 보냄으로써 subscriber와 비동기적으로 통신합니다. 여기서 topic은 논리적 액세스 포인트 면서 publisher와 subscriber 사이의 통신 채널입니다. 따라서 클라이언트는 SNS topic에 대해 subscribe 하고 지원되는 엔드포인트 타입을 사용하여 publish된 메시지를 사용할 수 있습니다. 지원되는 엔드포인트에서는 다음 이미지 처럼 애플리케이션 간(A2A) 또는 애플리케이션과 사용자 간(A2P)에 통신이 가능합니다. Fanout Pattern..
SQS (Simple Queue Service) SQS는 분산된 큐(Distributed Queues)에 메시지를 저장하고 전달하는데 사용됩니다. 이때, SQS에서 사용되는 큐가 "분산된 큐" 라는 점이 중요합니다. AWS 분산 메시징 시스템에는 Component, Queue(Amazon SQS 서버들에 분산됨), Message 세 가지로 구성되어 있습니다. 다음 이미지에서 A~E 메시지가 SQS 서버에 저장될 때 동일한 메시지가 다수의 Amazon SQS 서버에 중복 저장하고 있는 것을 볼 수 있습니다. 즉, 분산된 큐란 하나의 메시지를 다수의 SQS 서버에 분산하여 중복 저장되는 것을 의미합니다. SQS에서 사용되는 Queue(대기열)는 Standard Queue(표준 대기열) 또는 FIFO Queu..