1. 왜 Subject가 필요한가
Combine의 Publisher은 외부에서 값을 직접 주입할 수 없다. 즉 데이터 흐름은 항상 내부에서 생성되어 외부로 방출되는 구조다.

- Just 같은 Publisher은 외부에서 값을 수정할 수가 없다.
하지만 앱에서는 다음과 같은 흐름이 필요한 경우가 많다
- 사용자 액션을 트리거로 이벤트를 발생시키고 싶을 때
- 외부 시스템 (Notification, Delegate 등)에서 값을 전달받을 때
- 특정 시점에 수동으로 값을 방출하고 싶을 때
이처럼 외부에서 값을 푸시할 수 있는 형태가 필요하고, 그 역할을 하는 것이 Subject이다. 코드의 PassthroughSubject가 뭔지는 하단에서 설명하겠다.
2. Subject란 무엇인가
Subject는 다음 2가지 역할을 동시에 수행한다.
- Publisher -> 이벤트 발행자
- Subscriber -> 이벤트 구독자
즉 값을 받아 다시 방출하는 중간 지점이다.

3. Subject의 종류
Subject는 다음 2가지가 존재한다
- CurrentValueSubject -> 상태 보관
- PassthroughSubject -> 이벤트 보관
4. CurrentValueSubject
특징
- 항상 최신값을 저장한다
- 생성 시 초기값 지정이 필요하다
- 새로운 subscriber은 현재 값을 즉시 전달받는다
사용 예시
- ViewModel의 상태
- UI 상태 바인딩
- 현재 최신값이 항상 필요한 경우
즉 상태(State)를 표현할 때 주로 사용한다
예시 코드

5. PassthroughSubject
특징
- 값을 저장하지 않는다
- 구독 이후에 발생한 값만 전달한다
- 과거 값은 알 수가 없다
사용 예시
- 버튼 클릭 이벤트
- 네트워크 요청 트리거
- 단순 이벤트 전달
즉 순간적인 이벤트를 전달할 때 주로 사용한다
예시 코드

6. completion과 Life Cycle
Subject도 Publisher이기 때문에 completion을 가진다

.send(completion: .finished)를 통해 스트림을 종료시키며 더 이상 값이 전달되지 않는다.