안녕세계
이번 포스팅에서는 제네릭과 무공변에 대해 알아보고, 무공변을 공변과 반공변으로 만드는 방법에 대해 알아봅니다. 우선, 제네릭에 대해 설명하기 위해 아이스크림 가게 예제를 만들어 보겠습니다. 현재 아이스크림 가게에는 초코 아이스크림과 민트 아이스크림이 있다고 가정해봅니다. 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..
AmazonMQAmazonMQ는 AWS에서 제공하는 관리형 메시징 서비스입니다. 현재 AmazonMQ는 Apache ActiveMQ와 RabbitMQ 브로커 엔진을 지원합니다. 본 포스팅에서는 AmazonMQ 브로커 엔진 중 ActiveMQ에 대해 알아봅니다.ActiveMQ지원되는 와이어 레벨 프로토콜AMQPMQTTMQTT over WebSocketOpenWireSTOMPSTOMP over WebSocker브로커 엔진ActiveMQ용 AmazonMQ 브로커의 배포 모드는 단일 인스턴스 브로커나 활성/대기 브로커로 생성할 수 있습니다.단일 인스턴스 브로커단일 인스턴스 브로커는 하나의 가용 영역(AZ)에 있는 하나의 브로커로 구성됩니다.브로커는 "애플리케이션(Client) Amazon EBS 또는 Amaz..