디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 해결하고 풀어나갈 것인가에 대한 일종의 해결 방안으로, 실제 현업에서 비즈니스 요구사항을 프로그래밍으로 처리하면서 만들어진 다양한 해결책 중에서 많은 사람들이 인정한 모범 사례(Best Practice)이다.
많은 디자인 패턴 중에서 오늘은 Ovserver 패턴과 Publisher-Subscriber 패턴을 비교하면서 주로 Publisher-Subscriber 패턴에 대해서 정리해 보고자 한다.
Observer 패턴
- 객체의 상태 변화를 관찰하는 관차자들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드등을 통해서 객체가 직접 목록의 각 옵저버들에게 통지하도록 하는 디자인 패턴
- 분산 이벤트 핸들링 시스템을 구현할 때 사용한다.
- 발행-구독 모델로 알려져있다.
💡 어떤 객체의 상태가 변할 때 그와 연관된 객체 들에게 알림을 보내는 디자인 패턴
Publisher-Subscriber 패턴
- 관련이 있는 객체들 사이에서 직접적으로 참조해야 하는 강한 결합을 느슨한 관계로 바꾸는 방법
- 비동기 메시징 패러다임
- 특징
- 발행자 메시지의 수신자가 정해져 있지 않다.
- 메시지는 정해진 범주에 따라서 구독을 신청한 수신자에게 전달이 된다.
- 수신자는 발행자에 대한 정보 없이, 원하는 메시지를 수신할 수 있다.
- 메시지 큐 패러다임과 마치 형제같은 관계로, 대형 메시지 지향 미들웨어 솔루션의 일부라고 한다.
- 발행자(pub) - 구독자(sub)의 관계
- pub이 sub의 선언 위치나 존재를 알 필요 X
- 중간 지점(메시지큐, 브로커 등)에 메시지 던저두면 브로커가 알아서 처리한다.
- sub이 pub의 선언 위치, 존재 알 필요 ㅇX
- 브로커에 할당된 작업만 모니터링, 원하는 작업만 할당해서 작업 수행
- pub이 sub의 선언 위치나 존재를 알 필요 X
발행자 - 브로커 / 브로커 - 구독자 끼리만 연결되면 된다.
메시지 큐
- 프로세스나 프로그램 인스턴스가 데이터 상호 교환 시 사용하는 통신 방법
- 메시지 지향 미들웨어(MOM = Message Oriented Middleware)를 구현한 시스템
- 공정 작업 연기가 가능한 유연성을 제공
- SOA(Service Oriented Architecture) 개발에 도움을 준다.
- 장점
- 비동기(Asynchronous) : 큐에 넣어서 나중에 처리 가능
- 비동조(Decoupling) : 앱과 분리 가능
- 탄력성(Resilience) : 일부 실패가 전체에 영향x
- 과잉(Redunadancy) : 실패할 경우 재실행 가능
- 보증(Guarantees) : 작업 처리 확인 가능
- 확장성(Scalable) : 다수 프로세스들이 큐에 메시지 보내기 가능
- 단점
- '큐'이기 때문에 사용자가 많아지거나, 데이터가 많아지면 요청에 대한 응답이 늦어지게 된다.
- 즉 과도한 트래픽이 몰리게 되면, 대기 시간 지연으로 인해 서비스가 망가질 위험이 있다.
메시지 지향 미들웨어(MOM)
- 비동기 메시지를 사용하는 응용 프로그램 간 데이터 송수신
싱글톤 패턴
객체를 하나만 생성하여 전역적으로 접근할 수 있도록 하는 디자인 패턴
- 메모리 사용을 효율적으로 관리한다.
- 객체의 일관성을 유지하기에 편한다.
- 공용 인스턴스로 만들기 위해서 사용한다.
- 여러 스레드에서 동시에 접근해도 안전하게 사용 가능하다.
장점
- 객체를 하나만 생성하여 메모리 사용을 최적화할 수 있습니다.
- 객체의 일관성을 유지할 수 있습니다.
- 여러 스레드에서 안전하게 사용할 수 있습니다.
단점
- 객체의 생성을 제어하기 때문에 테스트가 어려울 수 있습니다.
- 전역 상태를 가지기 때문에, 코드의 의존성이 높아질 수 있습니다.
- 멀티스레드 환경에서 동기화 문제를 처리해야 합니다.