<What about Functional Programming! 3. 액션, 계산 그리고 데이터.>

강민수·2023년 1월 8일
0

이번 시간에는 다시 앞서 살펴 봤던 액션, 계산 그리고 데이터에 대해 한 번 알아보려고 합니다.

1. 액션과 계산, 데이터.

함수형 프로그래밍에서 가장 중요한 3가지는 뭐라고 말씀 드렸나요?

네. 제목과 동일하게 액션, 계산, 데이터였습니다. 다시 한 번 정리해 볼까요.

액션
: 실행 시점과 횟수에 의존. 다른 말로, 부수 효과, 부수 효과가 있는 함수, 순수하지 않는 함수.
ex) 이메일 보내기, 데이터 베이스 읽기

계산
: 입력으로 출력을 계산. 다른 말로, 순수 함수, 수학 함수.
ex) 최댓값 찾기, 이메일 주소가 올바른지 확인하기.

데이터
: 이벤트에 대한 사실.
ex) 사용자가 입력한 이메일 주소, 은행 api로 읽은 달러 수량.

모든 개발 과정에서 이 3가지 패턴을 아래처럼 적용해 볼 수 있습니다.

1) 문제에 대해 생각할 때.

아직 코딩 전이고 문제에 대해서 고민하고 있을 때, 역시 문제를 액션, 계산, 데이터로 나눠 생각해 볼 수 있습니다. 문제를 액션과 계산, 데이터로 나눠보면, 코드 작성 시, 특별히 주의해야 할 부분(액션)과 데이터로 처리해야 할 부분, 결정을 내려야 할 부분(계산)을 명확히 알 수 있습니다.

2) 코딩할 때.

코딩을 할 때도 역시 위의 3가지 개념이 적용됩니다. 함수형 프로그래머는 최대한 액션에서 계산을 분리하려고 합니다. 또 계산에서는 데이터를 분리할 수 있는 지 생각합니다. 더 나아가, 액션이 계산이 될 수 있는 지, 계산은 데이터가 될 수 있는 지 고민합니다.

3) 코드를 읽을 때.

코드를 읽을 때, 액션과 계산, 데이터 중 어떤 것에 속하는 지 잘 살펴봐야 합니다. 특히 액션은 시간에 의존하기 때문에 더 조심해야 합니다. 그래서 언제나 숨어있는 액션까지도 찾아야 합니다. 대부분의 함수형 프로그래머는 더 좋은 코드를 만들기 위해 이미 있는 코드를 액션과 계산, 데이터로 리팩토링 하는 방법을 찾을 것 입니다.

그래서 이번 챕터는 액션, 계산 그리고 데이터를 과연 저 상황들에서 어떻게 적용하면 좋을 지에 대해 논의해 보겠습니다.

2. 액션과 계산 데이터는 어디에나 적용 가능!

이번 예제는 마트에서 장을 보는 예제입니다. 이 예제 속에서 액션, 계산, 데이터를 발견해 보시기 바랍니다.

1) 전체 구성.

다음 타임라인 다이어그램은 장보기 과정 전체의 스케쥴을 나타내고 있다. 분명 액션과 계산, 데이터가 있다고 했는데 전부 액션이라고 분류되어 있는 것을 볼 수 있습니다. 이유가 뭘까요?

뭔가 놓친 부분이 있을 겁니다. 다시 한 번 살펴보시죠!

2) 냉장고 확인하기.

먼저, 냉장고 확인하기는 시점이 중요하기 때문에 액션이 맞습니다. 하지만, 그 안을 살펴보면, 냉장고에 보관된 제품은 데이터입니다. 이를 현재 재고라고 합시다.

3) 운전해서 상점 가기.

이 역시 액션은 맞습니다. 다만, 앞선 냉장고 확인하기처럼 액션 속에 데이터가 숨겨져 있습니다. 상점 위치나 가는 경로는 데이터로 볼 수 있습니다.

4) 필요한 것 구입하기.

구입도 역시 액션입니다. 하지만 구입 과정은 몇 단계로 더 나눠볼 수 있습니다.

이렇게 위의 타임라인 다이어그램을 살펴보면 아래와 같이 정리할 수 있습니다.
현재의 재고, 필요한 재고, 장보기 목록 = 데이터, 재고 빼기 = 계산, 목록에 있는 것 구입 = 액션.

재고 빼기 같은 경우, 같은 입력값일 때 항상 같은 결괏값을 주기 때문에 계산입니다.

어떤 것을 결정하는 일은 계산으로 표현할 수 있습니다. 장보기 목록을 결정하는 것이 계산입니다. 실제 구입하는 단계와 구입할 것을 결정하는 단계를 나누었습니다. 이렇게 구분하는 것이 결국 액션과 계산을 나누는 것 입니다.

5) 장보기 과정 다시 정리.

다시 장보기 과정을 액션과 계산, 데이터의 관점으로 나눴습니다.

이렇게 반복하다 보면, 결국 액션과 계산, 데이터를 더 많이 찾을 수 있고 보다 풍부한 모델을 만들 수 있습니다.

여기서 더 분리할 수도 있습니다. 사실 냉장고 확인하기 역시, 냉장실과 냉동실 확인하기로 나눠서 액션을 만들 수 있습니다.

또, 각 액션은 각각의 데이터를 만들수 있고, 연결할 수 있습니다. 목록에 있는 것 구입하기 역시 장바구니에 담기와 계산하기 단계로 나눌 수 있습니다.

이렇게 계속 나누는 게 오히려 복잡하다고 느낄 수 있습니다. 하지만, 액션에 숨겨진 다른 액션이나 계산 또는 데이터를 발견하기 위해 나눌 수 있는만큼 나누는 것이 좋습니다.

3. 장보기 과정에서 배운 점.

1. 액션과 계산, 데이터는 어디에나 적용 가능하다.

처음에는 액션과 계산, 데이터늘 적용하기 어렵겠지만, 연습할수록 더 잘하게 될 것 입니다.

2. 액션 안에는 계산과 데이터, 또 다른 액션이 숨어있을 수 있다.

단순해 보이는 액션도 또 다른 액션도 또 다른 액션이나 계산, 데이터로 나눌 수 있습니다. 함수형 프로그래밍에서는 액션을 더 작은 액션과 계산, 데이터로 나누고 나누는 것을 언제 멈춰주야 할 지 아는 것이 중요합니다.

3. 계산은 더 작은 계산과 데이터로 나누고 연결할 수 있습니다.

계산을 더 작은 단위로 나눌 수 있는 상황도 있습니다. 그리고 어떤 경우는 계산을 더 작은 계산으로 나누는 것이 더 좋을 때도 있습니다. 계산을 나누면, 첫 번째 계산의 결과 데이터가 두 번쨰 계산의 입력이 됩니다.

4. 데이터는 데이터만 조립할 수 있다.

데이터는 다른 영향을 주지 않는 그냥 데이터입니다. 그래서 데이터 찾는 일을 먼저해야 하빈다. 데이터를 찾았다면 동작에 대해 많은 것ㅇ르 알수 있습니다.

5. 계산은 때로 '우리 머릿속에서'일어납니다.

사실 알고보면, 계산은 이미 우리 사고 과정 속에 녹아있습니다. 예를 들어, 앞선 예시의 장보기 상황에서 뭘 사야할 지는 그냥 머릿 속에서 저절로 생각납니다. 현실에서 장을 보다가 갑자기 뭘 사야할 지 앉아서 목록을 작성하지는 않죠. 이처럼 우리는 무의식 중에 머릿 속에서 계산을 하는 겁니다.

이 사실을 알면 계산을 더 쉽게 찾을 수 있죠. 어떤 단계에서 무엇인가 결정해야 할 것이 있는 지 또는 무엇인가 계획해서 방법을 찾아야 할 것 인지는 스스로에게 물어보면 됩니다. 결정과 계획은 계산이 될 가능성이 높기 때문입니다.

자 그러면 여태 배운 데이터, 계산, 액션에 대해 다시 한 번 정리하고 넘어가도록 하겠습니다.

4. 데이터, 계산, 액션 정리.

1. 데이터.

먼저 데이터에 대해 정리해 보겠습니다.

1) 데이터란?

데이터는 이벤트에 대한 사실입니다. 일어난 일의 결과를 기록하는 것 입니다.

2) 데이터를 구현하는 방법.

자바스크립트에서는 기본 데이터 타입으로 구현합니다. 숫자나 문자, 배열, 객체 같은 것입니다. 다른 언어는 더 정교한 방법으로 데이터를 만들 수 있죠. 하스켈은 새로운 데이터 타입을 정의해 도메인을 표현합니다.

3) 불변성.

함수형 프로그래머는 불변 데이터 구조를 만들기 위해 두 가지 원칙을 사용합니다.

1. 카피-온-라이트: 변경할 때 복사본을 만듭니다.

2. 방어적 복사: 보관하려고 하는 데이터의 복사본을 만듭니다.

이에 대해서는 추후 챕터에서 더 자세히 살펴봅니다.

4) 데이터의 예.

  • 구입하려는 음식 목록.
  • 이름.
  • 전화 번호.
  • 음식 조리법.

5) 데이터의 장점.

역설적으로 데이터는 데이터 자체로 할 수 있는 것이 없기 때문에 좋습니다. 그래서 데이터는 데이터 그대로 이해할 수 있습니다.

1. 직렬화

직렬화된 액션과 계산은 다른 곳에서 잘 동작할 것이라는 보장이 없습니다. 하지만, 직렬화된 데이터는 전송하거나 디스크에 저장했다가 읽기 쉽습니다. 그래서 보통 데이터는 함수보다는 오래 사용하게 됩니다.

2. 동일성 비교.

계산이나 액션은 서로 비교하기 어렵습니다. 하지만 데이터는 원본 데이터와의 비교가 쉽습니다.

3. 자유로운 해석.

데이터는 여러 가지 방법으로 해석할 수 있습니다. 접속 로그는 문제 해결뿐만 아니라, 모니터링을 위해 사용할 수도 있습니다. 따라서 이런 데이터를 언제나 쉽게 해석할 수 있도록 표현하는 것이 함수형 프로그램에서 중요한 기술입니다.

6) 데이터의 단점.

유연하게 해석할 수 있다는 장점이 있지만, 해석이 반드시 필요하다는 점이 단점이기도 합니다. 이애 반해, 계산은 해석없이 실행할 수 있죠. 하지만, 해석이 없는 데이터는 쓸모 없는 바이트일 뿐입니다.

2. 계산.

다음은 두 번째 계산입니다.

1) 계산이란.

계산은 입력값으로 출력 값을 만든 것 입니다. 실행 시점과 횟수에 관계 없이 항상 같은 입력값에 대해 같은 출력값을 돌려줍니다.

2) 계산 구현의 방식.

계산은 함수로 구현합니다. 자바스크립트 역시 함수로 계산을 구현합니다. 함수형 프로그래밍의 대부분은 계산을 가지고 하는 일입니다. 계산은 일반적으로 함수형 프로그래밍 외부에 있는 액션을 통해 수행됩니다.

3) 계산에 의미를 담는 방법.

계산에는 연산을 담을 수 있습니다. 계산은 입력값을 출력값으로 만드는 것을 표현하니다. 계산을 언제 사용할 지 또는 어떻게 사용할 지는 때에 따라 다릅니다.

4) 액션보다 계산이 좋은 이유.

이유는 다음과 같습니다.

1. 테스트하기 쉽습니다.

계산은 언제 어디서나(로컬 장비, 빌드 서버, 테스트 장비) 원하는 만큼 테스트를 실행할 수 있습니다.

2. 기계적인 분석이 쉽습니다.

학술 연구에 정적 분석이라는 것이 있습니다. 정적 분석에서 자동화 된 분석이 중요합니다. 정적 분석에서 자동화된 분석은 중요합니다.

3. 계산은 조합하기 쉽습니다.

계산은 조합하기 좋습니다. 계산을 조합해 더 큰 계산을 만들 수 있습니다. 이때 일급 계산을 사용합니다. 일급 계산에 대한 내용은 추후 보다 자세히 살펴보겠습니다.

5) 계산의 예

  • 더하기, 곱하기
  • 문자열 합치기.
  • 쇼핑 계획하기.

6) 계산을 쓰면서 걱정하지 않아도 되는 것.

함수형 프로그래머는 가능하면 액션보다 계산을 사용하려고 합니다. 왜냐하면, 계산이 더 이해하기 쉽기 때문입니다. 계산은 읽기 쉽고 무엇을 하는지 이해하기도 쉽습니다. 아래는 계산을 쓰면서 걱정하지 않아도 되는 것입니다.

  1. 동시에 실행되는 것.
  2. 과거에 실행되었던 것이나 미래에 실행할 것.
  3. 실행 횟수.

7) 계산의 단점.

계산과 액션은 실행하기 전에 어떤 일이 발생할 지 알 수 없다는 단점이 있습니다.

물론 코드를 읽으면 예상할 수 있기는 합니다. 하지만, 소프트웨어 측면에서 함수는 블랙박스입니다. 입력값으로 실행해야 결과를 알 수 있습니다. 이런 단점이 싫다면, 계산이나 액션 대신 데이터를 사용해야 합니다.

8) 계산의 명칭.

다른 책에서는 보통 순수함수 혹은 수학 함수라고 부릅니다. 이 책에서는 자바스크립트 함수처럼 언어 기능과 혼동을 피하기 위해 계산이라고 부릅니다.

3. 액션.

마지막 액션입니다.

1) 액션의 정의.

액션은 외부 세계에 영향을 주거나 받는 것을 말합니다. 그리고 액션은 실행 시점과 횟수에 의존합니다.

  • 언제 실행되는 지 - 순서.
  • 얼마나 실행되는 지 - 반복.

2) 액션의 정의.

계산과 마찬가지로 액션 역시 함수로 구현합니다. 다만, 액션과 계산 모두 함수이다보니, 구분이 어려울 수 있습니다. 이를 구분하는 방법은 추후 다시 살펴보겠습니다.

3) 액션에 의미를 담는 방법.

액션으로 외부 세상에 영향을 줄 수 있습니다. 따라서 어떤 일을 하려는 지 아는 것이 중요합니다.

4) 액션의 예.

  • 이메일 보내기
  • 계좌에서 인증하기.
  • 전역 변숫 값 바꾸기.
  • ajax 요청 보내기.

5) 액션의 명칭.

일반적으로 다른 책에서 액션은 순수하지 않은 함수, 부수 효과 함수, 부수 효과가 있는 함수라고 부릅니다. 이 책에서는 자바스크립트 함수처럼 언어 기능과 혼동을 피하기 위해 액션이라고 부릅니다.

6) 액션 사용의 어려움.

  • 액션은 다루기 힘듭니다.
  • 액션은 우리가 소프트웨어를 실행하려는 가장 중요한 이유입니다.

액션은 사용하기 어렵습니다. 하지만, 액션은 꼭 써야 합니다. 함수형 프로그래머는 액션을 잘 사용합니다.

다음은 액션을 잘 사용하기 위한 방법들입니다.

1. 가능한 액션을 적게 사용한다.

액션을 전혀 쓰지 않을 수는 없습니다. 하지만, 액션 대신 계산을 사용할 수 있는 지 생각해 봐야 합니다. 추후 이 내용도 다시 다루도록 하죠.

2. 액션은 가능하게 작게 만든다.

액션에서 액션과 관련없는 코드는 모두 제거합니다. 예를 들어, 액션에서 결정이나 계획과 관련된 부분은 계산으로 빼낼 수 있습니다. 이 내용도 추후 다시 살펴보죠.

3. 액션이 외부 세계와 상호작용하는 것을 제한할 수 있습니다.

액션은 외부 세계에 영향을 주거나 받을 수 있습니다. 내부에 계산과 데이터만 있고 가장 바깥쪽에 액션이 있는 구조가 이상적입니다. 관련 내용은 추후 아키텍쳐 관련한 내용과 함께 다시 살펴보겠습니다.

4. 액션이 호출 시점에 의존하는 것을 제한합니다.

함수형 프로그래머는 액션이 호출 시점과 횟수에 덜 의존하도록 만드는 기술을 알고 있습니다. 그래서 액션을 사용할 때 조금 더 쉽게 사용할 수 있습니다.

5. 결론.

앞서 장보기와 더불어 액션, 계산, 데이터 등에 대한 정리를 함께 하면서 액션과 계산, 데이터에 대한 차이를 살펴봤습니다. 이제는 앞서 간략히만 살펴본 내용을 조금 더 구체적으로 살펴보겠습니다.

다음 챕터에세 뵙겠습니다.

profile
개발도 예능처럼 재미지게~

0개의 댓글