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

binary·2022년 5월 21일
3
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개의 댓글