쏙쏙 들어오는 함수형 코딩 - 3

binary·2022년 5월 21일
post-thumbnail

Chapter 3

액션과 계산, 데이터

함수형 코딩에서는 액션과 계산, 데이터를 구분하는 일을 아주 중요하게 생각한다.
문제에 대해 생각할 때도, 코딩을 할 때도, 코드를 읽을 때도 모두 액션, 계산, 데이터로 나누어 생각할 수 있다.

일상에서의 액션, 계산, 데이터

우리가 일상에서 자주 하는 장보기를 액션, 계산, 데이터로 나눌 수 있다.

  1. 냉장고확인하기
  2. 운전해서 상점으로 가기
  3. 필요한 것 구입하기
  4. 운전해서 집으로 오기

🤔 오잉 다 액션 아닌가요?

위 액션들을 아주 작게작게 쪼개어 보면 장보기가 액션으로만 이루어져 있지 않다는 것을 알 수 있다.

냉장고 확인하기

냉장고를 확인하는 일은 확인하는 시점이 중요하기 때문에 액션이다. 거기에 냉장고에 있는 물건들은 데이터라고 할 수 있으며 현재 재고라고 가정해보자.

필요한 것 구입하기

구입하는 일은 액션이지만, 구입 과정을 작게 작게 쪼개어 볼 수 있다.

  • 필요한 것 구입하기 👉 액션
    • 필요하지만 없는 제품의 목록 만들기
      • 현재 재고 👉 데이터
      • 필요한 재고 👉 데이터
      • 현재 재고에서 필요한 재고 빼기 👉 계산
      • 장보기 목록 👉 데이터

이렇게 액션으로만 이루어져 있던 장보기를 한 번 작게 작게 쪼개어 보았다.

  1. 냉장고 확인 👉 액션
  2. 현재 재고 👉 데이터
  3. 필요한 재고 👉 데이터
  4. 현재 재고에서 필요한 재고 빼기 👉 계산
  5. 계산을 통해 완성된 장보기 목록 👉 데이터
  6. 운전해서 상점으로 가기 👉 액션
  7. 목록에 있는 것 구입하기 👉 액션
  8. 운전해서 집으로 오기 👉 액션

❗️ 😃 아하 이렇게 반복하면 액션, 계산, 데이터를 많이 찾을 수 있겠네용

처음에 생각했던 장보기를 위한 행동들에 더 많은 행동들이 추가된 것을 알 수 있다. 점점 많아지면 복잡하다는 생각이 들 수 있겠지만, 액션에 숨어있는 다른 액션이나 계산 또는 데이터를 발견하기 위해 나눌 수 있는 만큼 나누는 것이 좋다.

새로 만드는 코드에 함수형 사고 적용하기

쿠폰독은 쿠폰에 관심 있는 구독자들에게 이메일로 쿠폰을 매주 보내주는 서비스이다. 쿠폰독에서는 사용자를 더 늘리기 위해 친구 10명을 추천하면 더 좋은 쿠폰을 보내주려고 한다. 10명 이상 추천하면 Best 쿠폰을, 10명 이하는 Good 쿠폰을 보내줄 것이다.

이러한 서비스를 만들기 위해 코드를 작성한다고 했을 때 작성해야 하는 코드를 액션, 계산, 데이터로 분류해보자.

  • 이메일 보내기 👉 액션
  • 데이터 베이스에서 구독자 가져오기 👉 액션
  • 쿠폰에 등급 매기기 👉 계산
  • 데이터베이스에서 쿠폰 읽기 👉 액션
  • 이메일 제목 👉 데이터
  • 이메일 주소 👉 데이터
  • 추천 수 👉 데이터
  • 어떤 이메일이 쿠폰을 받을지 결정하기 👉 계산
  • 구독자 DB 레코드 👉 데이터
  • 쿠폰 DB 레코드 👉 데이터
  • 구독자 목록 DB 레코드 👉 데이터
  • 쿠폰 목록 DB 레코드 👉 데이터
  • 이메일 본문 👉 데이터

쿠폰 보내는 과정

1. 데이터 베이스에서 구독자를 가져오기

쿠폰을 이메일로 보내려면 데이터베이스에서 구독자를 가져와야 한다.

  • DB에서 구독자 가져오기 👉 실행 시점에 의존하기 때문에 액션
  • 구독자 목록 👉 데이터

2. 데이터 베이스에서 쿠폰 목록 가져오기

  • DB에서 쿠폰 목록 가져오기 👉 가져오는 시점이 중요하기 때문에 액션
  • 쿠폰 목록 👉 데이터

3. 보내야 할 이메일 목록 만들기

  • 구독자 목록과 쿠폰 목록을 가져와 이메일 목록 계획하기 👉 계산
  • 계획한 이메일 목록 👉 데이터

구독자 목록과 쿠폰 목록을 가져와 이메일 목록 계획하기 라는 계산을 조금 더 작은 계산으로 나눌 수도 있다.

  • 쿠폰 목록 👉 데이터
    • good 쿠폰 선택하기 👉 계산
      • good 쿠폰 목록 👉 데이터
    • best 쿠폰 선택하기 👉 계산
      • best 쿠폰 목록 👉 데이터

어떤 구독자가 good 쿠폰을 받을지, best 쿠폰을 받을지 결정하는 것을 계산으로 만들 수 있다.

  • 구독자 목록 👉 데이터
    • 쿠폰 등급 결정하기 👉 계산
    • 쿠폰 등급 👉 데이터
  • 구독자 목록, good 쿠폰 목록, best 쿠폰 목록, 쿠폰 등급 데이터를 받아 쿠폰 등급이 "good"이면 good 이메일 만들기, "best"이면 best 이메일 만들기

이보다 더 작게 작게 나눌 수도 있고 더 작게 나눌 수록 구현하기 쉽다. 하지만 충분히 구현하기 쉽다고 생각이 되면 이제 나누는 것을 멈추어야 한다.

4. 이메일 전송하기

  • 이메일 목록을 순회하면서 이메일 보내기 👉 액션

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

함수형 프로그래밍에서는 액션보다 게산을 사용하려고 한다.

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

이미 있는 코드에 함수형 사고 적용

function figurePayout(affiliate) {
  var owed = affiliate.sales * affiliate.commission;
  if(owed > 100)
    sendPayout(affiliate.bank_code, owed); // 이 코드만 액션일까요?
}

function affiliatePayout(affiliates) {
  for(var a = 0; a < affiliates.length; a++)
    figurePayout(affiliate[a]);
}

function main(affiliates) {
  affiliatePayout(affiliates);
}

제나가 자회사에 수수료를 보내기 위해 만든 코드이다. sendPayout() 함수는 실제 은행 계좌로 송금하는 액션이다.

🤔 그런데 제나가 작성한 코드가 함수형 코드일까요? 액션 코드는 하나만 있는 걸까요?

아닙니다!

제나가 말한 액션 코드 한 줄부터 시작해보면 실제 돈을 송금하는 코드이다. 호출 시점이나 횟수가 중요하기 때문에 액션이라고 할 수 있다.

그런데 액션의 정의에 따르면 액션은 호출 시점이나 횟수에 의존한다. figurePayout() 함수는 액션인 sendPayout() 함수를 호출하기 때문에 이 함수 역시 호출 시점과 횟수에 의존하게 된다. 그래서 figurePayout() 도 액션이 된다.

또 affiliatePayout() 함수도 액션인 figurePayout() 함수를 호출하기 때문에 affiliatePayout() 함수도 액션이 된다.

같은 논리로 액션인 affiliatePayout() 함수를 호출하는 main() 함수도 액션이 된다.

그래서 제나가 작성한 코드는 모두 액션이다.

액션을 부르는 함수가 있다면 그 함수도 액션이 된다. 이런 식으로 작은 액션 하나가 코드 전체로 퍼져 나가게 된다.

액션의 다양한 형태

  • 함수 호출

    alert("Hello world");

    팝업 창이 뜨는 것은 액션이다.

  • 메서드 호출

    console.log("hello");

    콘솔에 출력한다.

  • 생성자

    new Date();

    부르는 시점에 따라 다른 값을 가지기 때문에 액션이다.

  • 표현식 - 변수 참조

    y

    y가 공유되고 변경 가능한 변수라면 읽는 시점에 따라 값이 다를 수 있다.

  • 표현식 - 속성 참조

    user.first_name

    user가 공유되고 변경 가능한 객체라면 읽는 시점에 따라 값이 다를 수 있다.

  • 표현식 - 배열 참조

    stack[0]

    stack이 공유되고 변경 가능한 배열이라면 첫번째 항목은 읽는 시점에 따라 값이 다를 수 있다.

  • 상태 - 값 할당

    z = 3;

    공유하기 위해 값을 할당했고 변경 가능한 변수라면 다른 코드에 영향을 주기 때문에 액션이다.

  • 상태 - 속성 삭제

    delete user.first_name;

    속성을 지우는 것은 다른 코드에 영향을 주기 때문에 액션이다.


혹시나 잘못된 정보가 있다면 댓글로 알려주세요 ! 저의 성장의 큰 도움이 될 것 같습니다.🌱

0개의 댓글