리액티브 선언문 독후감

Uno·2022년 11월 25일
0

서론

RxSwift / Combine / RxDart 요즘 이 세 개에 대해서 관심이 많이 있습니다. 관심을 가지게된 이유는 솔직히 말하면, 채용 자격요건이나 우대사항에 있었기 때문입니다. 그러다가, 해당 라이브러리들이 함수형 프로그래밍 + 반응형 프로그래밍을 채택하고 있다고 알게되었고, 요즘은 함수형에 유독 관심이 많았습니다. 함수형을 아무리 배워도 제가 공부해왔던 Rx와 무언가 다르다는 느낌이 있었습니다. 제가 빼먹고 공부했던 "반응형"이 제가 코드를 읽을 때, 혼란을 겪도록 했던 것 같아서, 이 선언문까지 도착했습니다.

리액티브 선언문?

여러 분야에서 유사한 소프트웨어를 만드는 경우가 많이 있습니다만, 각자의 분야에서 독립적으로 발전되고 있습니다. (iOS 에서의 MVVM vs 다른 분야에서의 MVVM 아키텍쳐) 그래서, 이 문제에 대해서 "일관성 있는 접근" 을 돕기 위해 리액티브 시스템(Reactive System) 을 만들게 되었습니다.
리액티브 시스템은 유연 + 느슨한 결합 + 확장성 을 중점으로 구성된 시스템입니다.

그래서 리액티브 시스템이 뭔데?

리액티브 시스템은 아래 속성을 가진 시스템을 의미합니다.

  • 응답성(Responsive)
  • 탄력성(Resilient)
  • 유연성(Elastic)
  • 메시지 구동(Message Driven)

응답성

시스템(우리에게는 앱) 이 "바로 응답한다." 를 의미하는 속성입니다. 나머지 속성들 보다 우선순위가 가장 높고, 이 기능을 구현하기 위해서 리엑티브가 존재한다고 봐도 무방합니다.

좀 더 자세히 생각해봅시다. 바로 응답한다는 것의 배경에는 트리거가 있어야합니다. 해당 트리거가 On 이 되면, 바로 응답한다는 뜻이죠. 그러면, "응답한다." 는 무엇일까요? 동작을 한다는 뜻 입니다.

즉, 사용자가 A 라는 버튼을 누르게 되면, A 라는 버튼이 특정 객체의 트리거가 되고, 그 특정 객체는 이미 "00한 방식으로 동작할 거야," 라고 규정되어 있어야합니다. 그래서 트리거가 올 때마다 그렇게 동작할겁니다.

Swift 를 예시로 들면, didSet 과 같죠.

var value: T { // value 라는 곳에 값을 전달하면, didSet 코드를 호출할거야.
	{ didSet { 특정행동(value) } }
}

탄력성(신축성)

트래픽이 늘어나면, 서버 수가 늘어나야겠죠. 그리고 트래픽이 줄어들면, 서버 수가 줄어들어야 겠죠. 이 모습이 탄력성 입니다. 즉, 시스템의 작업량이 변화하면, 그 변화에 맞게 응답성을 조절하는 것이 유연성 입니다.

유연성

시스템이 장애에 직면하게되더라도, 응답성을 유지하는 것을 의미합니다. 에러가 발생한다고, 크래시가 나버리는 것이 아니라,return 값만 Error 로 리턴하는 것과 같은 행위죠.

메시지 구동(메시지 주도)

각 객체들의 소통 방식이 메시지를 주고 받는 방식이라는 것을 의미하는 속성입니다. 간단하게, 메시지를 보내고 그 것을 추적하는 것이 아니라 잊어버려도 된다는 뜻입니다.

내 맘대로 정리

위 이야기를 들으면, 무언가 들어본 것 같기도하면서, 한 마디로 설명은 못하겠고.. 그런 느낌이 듭니다.

아무래도 리엑티브 선언문은 모든 어플리케이션에 적용하기 위해 일반화 하여 설명해야하서 그런 듯 합니다.

일단, 이 리엑티브라는 것이 어느 카테고리에 속하는지 알아야 합니다.
Reactive 는 "데이터 흐름" 이라는 카테고리에 속합니다. 이 카테로기에 속하는 것이 "Procedural" 입니다. 절차적으로 수행되는 데이터 흐름 입니다. 이렇게 시작과 끝이 있는 절차를 지키는 데이터 흐름에서 이제는 절차가 아니라, 병렬적으로 적용된 것이 리액티브라고 봅니다.

리액티브가 Swift 에서 대세가 된 이유에는 여러 가지가 있겠지만, 사용자의 입력과 서버에서 Response 사이에 있기 때문이라고 봅니다. 사용자가 동시에 클릭하든, 여러번 클릭하든 그 행동에 맞게 "리액션" 해줘야 겠죠. 그리고 그 리액션 안에는 서버와 소통하는데, 서버에서 소통에 시간이 걸립니다. 그래서 응답을 받는 순서대로 전달해줘야죠.

우리가 코드를 , "어떤 데이터가 변경되면 00한 행동을 하자" 라는 "응답성" 이라는 속성을 지키자.
그리고 그 응답에서 에러가 발생하게 되면, 크래시가 아니라, 에러에 대한 응답도 구현하자.(유연성)
만약, 해당 기능이 갑자기 늘어나면, 오퍼레이터를 조합하는 식으로 구현하고, 빼게되더라도 문제 없더록 하자(신축성)
이 시스템은, 어떤 메시지(이벤트) 가 발생하느냐에 따라서 동작합니다. (Message Driven, Event Driven)

잘 정리된 그림이 있어서 첨부합니다.

참고자료

profile
iOS & Flutter

0개의 댓글