프로그래밍 166

[C#] 객체 동일 여부 판단하기 - ReferenceEquals()

만약 num1, num2 라는 객체 2개가 있다. 두 객체 값이 100 이라는 값으로 동일한 경우에 값을 비교하고 싶은게 아니라, 객체 그 자체가 동일한지 여부를 판단하고자 한다면 ReferenceEquals()를 사용하면 됩니다. 샘플코드 public static void Main(string[] args) { object a = 100; object b = 100; Console.WriteLine(); Console.WriteLine($"Equal() 호출: a == a ? {a.Equals(a)}"); Console.WriteLine($"Equal() 호출: a == b ? {a.Equals(b)}"); Console.WriteLine($"ReferenceEquals() 호출: a == a ? {R..

프로그래밍/C# 2023.05.10

[RabbitMQ] 미러링

RabbitMQ 미러링 RabbitMQ Mirroring은 RabbitMQ Cluster 안에서 Meesage를 다수의 RabbitMQ에 복사하여 저장하는 기법입니다. Master Queue는 원본 Queue를 의미하며 Slave Queue는 Master Queue를 복제한 Queue를 의미합니다. 각 Master Queue마다 다른 개수의 Slave Queue를 설정 할 수 있습니다. Master Queue와 Slave Queue 사이의 Mirroring은 기본적으로 Sync 방식입니다. ex> Producer가 Mirroring된 Queue에게 Message를 전송하면, 받은 Message를 Master Queue에만 넣은 후, 모든 Slave Queue와 Mirroring이 완료된 후에야 Produ..

[RabbitMQ] 클러스터링

RabbitMQ 클러스터링 RabbitMQ Clustering은 다수의 RabbitMQ를 하나의 RabbitMQ처럼 묶어서 사용하는 방식입니다. Clustering은 Queue를 제외한 모든 정보를 공유하기 때문에 메시지가 담겨있는 Queue에 대한 보호 장치라고 보면 됩니다. 특징 RabbitMQ Cluster을 구성하는 RabbitMQ는 Queue를 제외한 모든 정보를 공유합니다. 따라서 동일한 Cluster안에 있는 모든 RabbitMQ는 동일한 Exchange를 갖고 있습니다. RabbitMQ Cluster에서 기본적으로 Queue는 한개만 존재합니다. 위 그림을 보면 Queue A와 Queue B는 하나만 존재하는 것을 확인할 수 있습니다. 동일 Cluster안의 있는 모든 RabbitMQ는 E..

[RabbitMQ] 성능 향상 위한 가이드

RabbitMQ 성능 향상을 위한 가이드 Queues 큐에 쌓여있는 메시지는 적어야한다 큐에 있는 많은 메시지는 RAM 사용에 많은 부하를 줄 수 있습니다. RAM을 확보하기 위해 RabbitMQ는 메시지를 디스크로 플러시(페이지 아웃)하기 시작합니다. 페이지 아웃 프로세스는 일반적으로 시간이 걸리고 페이지 아웃할 메시지가 많을 때 큐가 메시지를 처리하지 못하도록 차단하여 큐잉 속도를 저하시킵니다. 큐에 메시지가 많으면 브로커의 성능에 부정적인 영향을 미칠 수 있습니다. 예측 가능한 성능을 얻기 위해서 Lazy Queue를 활성화하라 Lazy queue는 메시지가 자동으로 디스크에 저장되어 RAM 사용을 최소화하지만 처리 시간을 연장하는 큐입니다. 한 번에 많은 메시지를 보내거나(예: 배치 작업 처리),..

유스케이스 (Usecase)

객체지향의 사실과 오해 서적 참고 유스케이스(Usecase) 유스케이스는 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것이다. 유스케이스 특징 1. 유스케이스는 사용자와 시스템 간 상호작용을 보여주는 '텍스트'다. 유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것이다. 다이어그램에 노력을 쏟지 말고, 유스케이스에 담겨있는 이야기에 집중해야한다. 2. 하나의 시나리오가 아니라 여러 시나리오들의 집합이다. 시나리오는 유스케이스를 통해 시스템을 사용하는 하나의 특정 이야기 또는 경로이다. ex> 이자 계산이라는 유스케이스가 있다고 해보자, 이자 계산은 2개의 시나리오를 포함하는데 첫번째 시나리오: 예금주가 계좌를 선택하고 ..

프로그래밍 2023.04.26

[DDD] 도메인 (Domain)

도메인 주도 설계 철저 입문 서적 참고도메인도메인은 영역이란 뜻이다.소프트웨어 개발에서 도메인은 프로그램이 쓰이는 대상 분야라는 의미로 쓰인다.ex> 회계 시스템을 예로, 회계 분야에는 금전, 장부라는 개념이 등장하는데,이때 금전, 장부가 회계 시스템의 도메인에 해당한다.ex> 물류 시스템의 도메인 : 창고, 화물, 운송수단 등..도메인 모델모델은 현실에서 일어나는 사건, 개념을 추상화 한 것이다.추상이란, 사물 혹은 어떤 개념에서 성질을 뽑아내서 파악하는 것이다.하지만 그것의 모든 성질을 뽑아낼 필요는 없다.도메인에 따라서 해당 성질 중 필요한 것만 뽑아서 추상화시켜야한다.ex> 소설가 관점에서 '펜'은 글자를 쓸 수 있다는 성질이 중요하다.but, 문구점 관점에서 '펜'은 상품으로서 성질이 중요하다...

프로그래밍/DDD 2023.04.26

[RabbitMQ] 메시지 송수신 - RoutingKey

RabbitMQ 이전 게시물에서 Pub/Sub 메시지 송수신은, 메시지를 모든 Consumer에게 Broadcast하는 방법이였습니다. RabbitMQ에서 RoutingKey를 이용해서 특정 Queue에서만 메시지를 송수신 할 수 있습니다. 메시지 송신/수신 - RoutingKey RoutingKey를 이용하면 메시지를 필터링할 수 있습니다. 메시지는 바인딩 키가 일치하는 Queue로 송신합니다. RoutingKey를 이용하기 위한 Binding 기존에 사용하던 Exchange가 선언 된 경우 오류가 발생할 수 있습니다. Exchange를 삭제해줘야합니다. Exchange 설정 // Error 발생 시 Exchange 삭제 //channel.ExchangeDelete(exchangeName, true);..

[RabbitMQ] 메시지 송수신 - Publish/Subscribe

이전 포스팅 : 메시지 송신/수신 - WorkQueue RabbitMQ 메시지 송신/수신 - Publish/Subscribe Publisher가 생성된 2개의 Queue에 메시지를 송신하면, 각 Queue를 구독중인 2개의 Consumer는 동일한 메시지를 수신합니다. Exchange RabbitMQ의 핵심 아이디어는 Producer가 메시지를 Queue에 직접 보내지 않는다는 것입니다. Producer와 Consumer 중간에서 Exchange가 메시지를 수신하고, Queue에 메시지는 송신해줍니다. Exchange를 정의할 때 메시지를 어떻게 처리해야하는지 알아야합니다. Exchange의 메시지 처리 방식 4가지 direct topic headers fanout fanout 여기선 fanout방식에 ..

[RabbitMQ] 파일 송수신 (이미지 송수신)

이전 포스팅 [RabbitMQ] 메시지 송신/수신하기 사실, MessageQueue로 파일을 송/수신 하는것 자체가 목적에 맞지 않습니다. MessageBrocker는 말 그대로 Message만 송/수신 해야합니다. 이번 게시물에서 사이즈가 큰 파일을 메시지에 담아 송/수신 하는 방법을 확인하고, 사이즈가 큰 파일을 메시지에 담아 보낼 때, FTP와 비교하여 속도가 얼마나 차이가 나는지 테스트해봤습니다. 파일 송/수신 publisher msg 송신 시 Byte로 변환 후 message body에 담아 송신합니다. string ImagePath = @"C:\Users\Desktop\testfile\test.tif"; byte[] imageArray = File.ReadAllBytes(ImagePath); ..

[RabbitMQ] 메시지 송수신 - Helloworld

메시지 송/수신 RabbitMQ Publisher, RabbitMQ Consumer 2개 솔루션 생성해야합니다. Publisher : 메시지 발행 Consumer : 메시지 수신 RabbitMQ.Client nugetpackage 설치합니다. v6.5.0 RabbitMQ-Publisher ConnectionFactory 클래스의 인스턴스 생성 : RabbitMQ 서버 접속을 위한 로그인 정보를 설정합니다. QueueDeclare 메소드를 사용하여 "hello"라는 큐를 선언합니다. BasicPublish 메소드를 사용하여 메시지를 전송합니다. exchange: 브로커에서 사용하는 exchange를 지정합니다. 여기에서는 빈 문자열을 지정하여 디폴트 exchange를 사용합니다. routingKey: 전송..

[RabbitMQ] Docker이용하여 RabbitMQ 설치 - Linux

Docker이용한 RabbitMQ 설치 - Linux Ubuntu 16.04서버에서 Docker를 활용해서 RabbitMQ 환경을 구축합니다.RabbitMQ DockerHub https://hub.docker.com/_/rabbitmq Docker Image 다운로드 docker login docker pull rabbitmq:3-management (= v3.11) 관리 기능이 있는 RabbitMQ 이미지를 사용하려면 rabbitmq:3-management 태그를 사용해야합니다. 이 경우 웹 브라우저에서 http://localhost:15672 이동하여 RabbitMQ 관리 UI에 액세스 할 수 있습니다. docker images 확인 administrator@TEST:~$ docker images R..

[RabbitMQ] RabbitMQ 개념

RabbitMQ RabbitMQ는 오픈소스 메시지 브로커 이다. 메시지 브로커는 애플리케이션, 시스템 및 서비스 등.. 서로 간에 통신하고 정보를 교환할 수 있도록 해주는 소프트웨어 RabbitMQ 주체 3가지 Producer : Msg를 송신 함 Consumer : Msg를 수신 함 Broker : Producer와 Consumer 중간에서 Msg를 전달 함 기본 개념 AMQP(Advanced Message Queuing Protocol) : 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 프로토콜 Broker : 발행자가 만든 메시지를 저장 Virtual host : Broker 내의 가상 영역 Connection : 발생자와 소비자, Broker 사이의 물리적인 연결 Channel : 발행자..

[Docker] Docker Compose

일반적인 시스템은 단일 애플리케이션으로 구동이 되지 않습니다. 여러 개의 애플리케이션이 서로 의존성 있게 구성되어 시스템이 이뤄져 있습니다. 그렇다면 흔히 하나의 컨테이너가 하나의 애플리케이션을 담당한다고 하면 여러 개의 컨테이너가 필요로 합니다. 이때 필요한 기술이 도커 컴포즈(Docker Compose)입니다. 도커 컴포즈는 yaml 포맷으로 작성되며 여러 개의 컨테이너의 실행을 한 번에 관리를 할 수 있게 해 줍니다. 그런 다음 단일 명령으로 구성에서 모든 서비스를 생성하고 시작할 수 있습니다. 도커 컴포즈는 모든 환경(생산, 스테이징, 개발, 테스트 및 CI 워크플로우)에서 작동합니다.

[C#] Transaction

Transaction Transaction은 데이터베이스 작업 중에 실행되는 일련의 작업을 의미합니다. 일반적으로 트랜잭션은 "모두 실행" 또는 "모두 취소"와 같은 두 가지 결과 중 하나를 가져옵니다. 이를 통해 데이터베이스 작업 중간에 문제가 발생하면 이전 상태로 롤백할 수 있습니다. TransactionScope 클래스 C#에서 TransactionScope 클래스 사용 예시를 확인해봅시다. TransactionScope 클래스는 .NET 프레임워크에서 제공하는 트랜잭션 관리 기능을 제공합니다. 이 클래스는 여러 데이터 소스를 사용하는 트랜잭션 처리를 위해 사용할 수 있습니다. TransactionScope 클래스를 사용하면 여러 데이터 소스에서 실행되는 작업을 하나의 트랜잭션으로 묶을 수 있습니다..

프로그래밍/C# 2023.03.29