오늘의../이달의 책

[노개북] 실용주의 프로그래머 (Mission 2)

호마 2022. 3. 29. 00:30

💡 연습문제 20 (p. 207, Topic 30 변환 프로그래밍)

(이벤트에 잘 반응하는 애플리케이션을 만들기 위한) 네 가지 전략 중에서 다음 상황에 맞는 것은 각각 어떤 것일까? 여러 전략을 조합해야할 수도 있다.

  • 5분 동안 '네트워크 인터페이스가 꺼짐' 이벤트를 세 번 받으면 운영 직원에게 알려라.
  • 일몰 후에 층계 밑에서 동작이 감지된 다음 층계 위에서 동작이 감지되면 위층의 전등을 켜라.
  • 다양한 보고 시스템에 주문이 완료되었음을 알리고 싶다.
  • 고객에게 자동차 대출을 집행할 수 있는지 평가하기 위하여 애플리케이션이 세 가지 다른 서비스에 요청을 보내고 응답을 기다려야 한다.
✅ 풀이 과정

일단 4가지 개념을 간단히 정리해보았다.

1. 유한 상태 기계Finite State Machine, FSM: 이벤트를 어떻게 처리할지 정의한 명세로 현재 상태, 조건, 다음 상태, 행동 등을 정의한다.

2. 감시자 패턴observer pattern: 이벤트를 발생시키는 감시 대상observable과 감시자로 구성된다. 감시자가 관심있는 이벤트를 감시 대상에 등록하고, 나중에 이벤트가 발생하면 감시 대상은 등록된 감시자 목록을 보고 함수를 일일이 호출한다. 쉽게 말해, 화면에서 상호작용이 일어났을 때 콜백을 호출하여 애플리케이션에 알려주는 방식으로 사용한다. 콜백이 끝날 때까지 감시대상이 기다려야하므로 동기적으로 처리된다.

3. 게시Publish-구독Subscibe: 감시자 패턴을 일반화한 것으로 구독자subscriber가 관심사를 채널channel에 등록하고, 게시자publisher는 채널에 이벤트를 보낸다. 비동기로 작동한다.

4. 반응형 프로그래밍reactive programming과 스트림stream: React나 Vue.js에서 상태 값이 바뀌면 그 값을 사용하는 부분이 변경되는 것 처럼 값을 사용하는 다른 값이 반응react하는 프로그래밍 기법이다. 스트림은 이벤트 리스트를 자료구조처럼 사용할 수 있다.

그리고, 상황에 전략을 대입해서 해결방안을 생각해보았다.

- 5분 동안 '네트워크 인터페이스가 꺼짐' 이벤트를 세 번 받으면 운영 직원에게 알려라.

감시자 패턴을 사용하여 구현할 수 있다. 감시자가 '네트워크 인터페이스가 꺼짐' 이벤트를 감시 대상에 등록하고, 감시 대상이 해당 이벤트가 3번 발생할 경우 감시자에게 알리며 운영 직원에게 이에 대한 메시지를 보낸다. 이벤트가 많이 발생하여 비동기로 처리해야할 경우, 게시-구독을 사용하여 보완한다.

- 일몰 후에 층계 밑에서 동작이 감지된 다음 층계 위에서 동작이 감지되면 위층의 전등을 켜라.

유한 상태 기계로 다음과 같이 설계할 수 있을것 같다.

센서와 전등의 상황을 유한 상태 기계 기법으로 표현한 표

- 다양한 보고 시스템에 주문이 완료되었음을 알리고 싶다.

감시자 패턴이나 게시-구독 전략을 이용하여 구현한다. 주문 시스템에서 주문이 완료되면 보고 시스템에 메시지를 보내도록 한다.

- 고객에게 자동차 대출을 집행할 수 있는지 평가하기 위하여 애플리케이션이 세 가지 다른 서비스에 요청을 보내고 응답을 기다려야 한다.

응답을 기다리는 것은 동기식으로 구현해야한다는 의미로 해석된다. 감시자 패턴을 이용할 수 있다. 애플리케이션에서 고객이 화면에서 버튼을 클릭하면 콜백으로 즉시 세 가지 다른 서비스에 요청을 보내고 응답이 돌아오면 화면에 보여줄 수 있다.

✅ 참고 링크

.

💡 책에 있는 해답

- 5분 동안 '네트워크 인터페이스가 꺼짐' 이벤트를 세 번 받으면 운영 직원에게 알려라.

상태 기계로 구현하는 것도 가능하기는 함. 하지만 까다롭다. 예를 들어 1분, 4분, 7분, 8분에 각각 이벤트가 발생했다면 네 번째 이벤트가 발생했을 때 경고를 울려야하는데 그러면 상태 기계가 이벤트 없이도 스스로 상태를 바꿀 수 있어야한다. 그래서 이 경우에는 이벤트 스트림을 사용하는게 낫다. size와 offset 파라미터를 받는 buffer라는 반응형 함수를 사용하면 이벤트가 발생할 때마다 최근 이벤트를 세 개 묶어서 전달받을 수 있다. 그러면 묶음의 첫 이벤트와 마지막 이벤트의 발생 시각을 보고 경고를 울려야 할지 판단할 수 있을 것이다.

- 일몰 후에 층계 밑에서 동작이 감지된 다음 층계 위에서 동작이 감지되면 위층의 전등을 켜라.

게시-구독과 상태 기계를 조합하여 구현할 수 있을 것이다. 게시-구독을 사용하면 여러 상태의 기게에 이벤트를 퍼트릴 수 있고, 상태 기계가 이런 이벤트를 받아서 어떻게 할지 판단하면 된다.

- 다양한 보고 시스템에 주문이 완료되었음을 알리고 싶다.

게시-구독 모델이 가장 좋을 것이다. 스트림을 사용할 수도 있지만 그러려면 알림을 받는 보고 시스템도 스트림 기반이어야 할 수도 있다.

- 고객에게 자동차 대출을 집행할 수 있는지 평가하기 위하여 애플리케이션이 세 가지 다른 서비스에 요청을 보내고 응답을 기다려야 한다.

본문에서 사용자 데이터를 받아 오기 위해 스트림을 사용한 예제와 유사하다.

❗️오늘의 TIL을 작성하며 느낀점...

반응형 프로그래밍이나 스트림을 실제로 사용해본 적이 없어서 어디에 사용할 수 있는지 궁금했는데 문제 해설의 사례를 읽어보니 조금 더 이해할 수 있었다. 로깅 시스템에서 잘 사용할 수 있을 것 같다.

첫번째 문제에서는 "제한시간 안에 n회 이벤트 발생"이라는 조건에 대한 분석이 부족했다.

두번째 문제에서는 현실 상황이라는 가정이 부족했다. 지하층과 3층이 있다면? 실제 상황이라고 생각하고 여러가지를 고려하자!

이런 문제들을 잘 해결하려면 경험이 중요한 것 같다. 어떤 방법을 사용할지 창의성을 발휘하여 해결할 수도 있지만 결코 쉽지 않다. 언제나 그렇듯 누군가는 나와 똑같은 문제에 직면했을 것이다. 주변에서 보고 들은 내용이나 구글에서 적절한 해결 방안을 찾으면 된다. 문제 상황을 찾아 해결하고 서로 나누는 그런 환경에서 배우고 성장하고 싶다..