Observer 패턴
Observer
Subject를 관찰하고, 상태 변화를 감지하여 특정 동작을 수행하는 객체이다.
Subject에 등록하여 변화에 대한 알림을 받는다.
Subject
속성을 가지고 있는 객체
상태가 바뀌면 Observer로 이벤트를 전달한다.
Observer 패턴의 단점
Subject에서 Observer 배열을 직접 관리해야 한다.
즉, 관찰자와 피관찰자가 직접적으로 참조된다.
Observer가 많이 등록된다면, 성능 저하가 발생할 수 있다.
잘못된 구현으로 순환 참조가 발생할 수 있다.
Publisher / Subscriber 패턴
Publisher
메세지를 생성하고 특정 주제를 발행하는 객체
Subscriber
특정 주제를 구독하여 Publisher가 발행한 메세지를 수신하고 처리하는 객체
Broker
Publisher, Subscriber 간의 중개 역할을 하는 객체
메세지를 전달하거나 관리한다.
Observer 패턴과 비교했을 때, Publish / Subscriber 패턴의 차별점
Observer와 달리 Broker에 이벤트를 전달한다.
Publisher는 Broker에 대한 직접적인 정보를 가지고 있지 않다.
그러나 Subscriber는 보통 누가 event를 발생할 지를 알고 있다.
결론
Subscriber는 구독하는 시점의 Publisher를 알고 있다.
Publisher는 발행하는 시점의 Subscriber를 모른다.
싱글톤 패턴을 적용한다면?
만약 Broker / Observer를 싱글톤으로 생성하면...
장점
모든 Publisher, Subscriber를 하나의 Observer, Broker에서 관리할 수 있다.
메모리 이점이 있다.
단점
디버깅이 어렵다.
이벤트와 구독 정보가 많아질수록 굉장히 복잡해진다.
동기와 비동기
루틴, 서브 루틴, 이때 그 흐름이 워커
생각해보자. 더 많은 서브 루틴을 쓰기 위해 쓰레드를 많이 만들면 되는 거 아닌가?
안 된다.
1. 확장성 문제 : 시스템 자원의 한계로 자원 경쟁이 심화될 수 있다.
2. 발열 문제 : 단순히 늘린다고 해서 발생하는 발열도 무시할 수 없다.
3. 오버헤드 : 쓰레드 간의 컨텍스트 스위칭, 동기화 등으로 인해 불필요한 시간들이 증가한다.
암달의 법칙 : 컴공의 몇 안 되는 법칙이라고 한다....(나무위키 발)
p : 병렬처리 가능한 부분의 비율
n : 프로세서 개수
그럼 쓰레드를 적게 쓰는 Concurrent Programming을 해볼까?
그래서 과거에는 Parallel Programming이 대세였다면, 지금은 Concurrent Programming 쪽을 생각하게 됨
즉, CPU 코어도 많이 쓰고, 쓰레드를 적게 쓰고, 논리적으로 빨리 실행할 수 있는 방향으로 생각하게됨
그러나 개발자가 Concurrent Programming을 사용하기에는 매우 어려웠다.
2가지 문제점이 있었는데....
1. 동시성 : 세마포어, 뮤텍스 계속 써야됨
2. 오버 플로우 : 메모리 스페이스를 같이 써야 하기 때문에 스택을 나눠써야 한다.
개발자는 이 모든 것을 고려하며, 기능 개발도 해야하며, 성능 개선도 해야 했다.
결론 : 쓰레드를 많이 만드는 것이 좋은 일이 아니다.
그래서 쓰레드를 개발자가 만드는 것이 아니라 OS에서 주체적으로 다루도록 변경되었다.
OS나 런타임 환경 : 쓰레드 관리의 복잡성 담당
개발자 : 작업 단위를 정의하는 데 집중 (쓰레드 관리의 추상화 : 클로저)
Concurrent Programming 요약
멀티 프로세스 방식보다 병렬적으로 처리할 수 있는 방식이 더 좋아졌다.
즉, 프로세스보다 더 작은 단위로 작업을 하자.
프로그래밍 패러다임의 변화
- 개발자가 프로세스나 쓰레드를 직접 만들 일은 거의 없다. 대신 클로저라는 작은 함수로 만들어서 호출하는 식으로 프로그래밍해야 함
- 상태 변화보다 불변값 복사해서 병렬처리하는 게 효율적이다.(함수형 프로그래밍)
- 완벽하게 분리된 병렬 작업
여전히 어려운 점
- 비동기 콜백 중첩 현상, 비동기 데이터 전달 -> 그래서 await, Rx, Combine, Flow 등 여러 기법을 사용하기도 한다.
- 유연하지만 복잡하고 디버깅이 어렵다.
개인적인 생각
일종의 분할 정복 느낌으로 클로저를 사용하는 느낌이다.
사진 출처
사진 3 : https://blog.kakaocdn.net/dn/ADwYa/btroebS96Aq/GpDowQbPA3k7T9cExwPZYk/img.png
'부스트캠프 > 챌린지' 카테고리의 다른 글
[부스트캠프 웹모바일 9기] 챌린지 Day11 학습정리 (0) | 2024.07.29 |
---|---|
[부스트캠프 웹모바일 9기] 챌린지 2주 차 회고 (0) | 2024.07.28 |
[부스트캠프 웹모바일 9기] 챌린지 Day 8 학습 정리 (0) | 2024.07.24 |
[부스트캠프 웹모바일 9기] 챌린지 Day 7 학습 정리 (0) | 2024.07.23 |
[부스트캠프 웹모바일 9기] 챌린지 Day 6 학습 정리 (0) | 2024.07.22 |