Skip to content

chp3. 액션과 계산, 데이터의 차이

프로그래밍에서 모든 코드는 같아 보이지만, 실제로는 성격이 다릅니다. 어떤 코드는 외부와 상호작용하고, 어떤 코드는 계산만 하며, 또 어떤 코드는 단순히 사실을 담습니다. 이 장에서는 코드를 액션, 계산, 데이터로 나누어 살펴보고, 왜 이렇게 구분하는 것이 중요한지 정리해 보겠습니다

1. 데이터란?

이벤트에 대한 사실입니다.

예를 들어, DB 유저 데이터는 “create user” 이벤트에 대한 사실입니다. 각 언어에서 기본 데이터 타입(숫자, 문자, 배열, 객체 등)으로 구현됩니다.

계산(순수 함수)은 외부 상태를 바꾸지 않게 하여 예측 가능한 동작을 하게 합니다. 따라서 입력된 인자의 원본을 수정하지 않아야 하며, 이를 불변성을 통해 차단합니다.

불변성

함수형 프로그래밍에서는 불변 데이터 구조를 만들기 위해 두 가지 원칙을 지킵니다.

  1. Copy on write: 변경 시 복사본을 만드는 것입니다.
  2. 방어적 복사: 보관하려는 데이터의 복사본을 만드는 것입니다.

데이터의 장점

  1. 직렬화 직렬화된 액션, 계산은 다른 곳에서 잘 동작하지 않습니다. 반면, 직렬화된 데이터는 어디에서든 동일하게 해석할 수 있습니다.

  2. 동일성 비교 계산, 액션과 다르게 데이터는 비교하기 쉽습니다.

  3. 자유로운 해석 여러 방법으로 해석할 수 있습니다. 예: 접속 로그는 문제 해결에도, 모니터링에도 활용할 수 있습니다.

2. 계산이란?

입력값을 출력값으로 만드는 함수입니다.

실행 시점, 횟수와 관계없이 동일한 인자에 동일한 반환값을 반환합니다.

액션보다 계산이 좋은 이유

  1. 테스트하기 쉽습니다. 동일한 입력에 동일한 출력을 반환하기 때문입니다.
  2. 기계적 분석이 쉽습니다. 같은 이유로 컴파일러나 정적 분석기가 함수의 동작을 예측하거나 최적화하기 쉽습니다.
  3. 조합하기 쉽습니다. 외부 상태가 아닌 입력에만 의존하여 출력하기 때문에, 여러 계산을 연결해 조합할 수 있습니다.

계산으로 코딩할 때의 장점

  • 동시에 계산을 실행할 수 있습니다.
  • 과거와 미래의 실행 여부를 따질 필요가 없습니다.
  • 실행 횟수를 신경쓰지 않아도 됩니다.

단점

계산은 실행 전에는 결과를 알 수 없습니다. 코드를 읽어 예측은 가능하지만, 소프트웨어 관점에서는 여전히 블랙박스입니다.

3. 액션이란?

외부 세계에 영향을 주거나 받는 함수입니다.

실행 시점, 횟수에 의존하며, 흔히 side effect function이라고 부릅니다.

예시

  1. 계좌에서 인출하기: “잔액”에 의존합니다.
  2. Ajax 요청 보내기: 서버에 의존합니다.
  3. 이메일 보내기: 프로그램 외부(이메일 서버)에 영향을 줍니다.
  4. 전역 변수 바꾸기: 프로그램 전체에 공유되는 전역 상태를 변경합니다.

액션을 잘 쓰는 방법

  1. 액션을 적게 쓰는 것이 좋습니다.
  2. 액션을 작게 만드는 것이 좋습니다.
  3. 외부 세계와 상호작용하는 범위를 제한해야 합니다.
  4. 호출 시점에 대한 의존성을 줄여야 합니다.

액션, 계산, 데이터는 각각 의미가 다른 코드입니다.

코드를 작성하기 전, 작성할 때, 작성된 코드를 읽을 때 각 코드가 무엇에 속하는지를 고려하는 것이 좋습니다.

  1. 코드 작성 전

    • 액션: 주의해야 하는 부분입니다.
    • 계산: 결정을 내려야 하는 부분입니다.
  2. 코딩할 때

    • 액션: 액션에서 계산을 분리하는 것이 중요합니다.
    • 계산: 계산이 데이터가 될 수 있는지 고민합니다.
  3. 코드를 읽을 때

    • 해당 코드가 무엇에 속하는지를 살펴봅니다.

정리하며

함수형 프로그래밍에선 코드를 데이터, 계산, 액션 3가지로 분류합니다.

  • 데이터는 사실을 담고,
  • 계산은 사실을 변환하며,
  • 액션은 외부 세계와 연결됩니다.

데이터와 계산은 비교적 안전하고 다루기 쉽습니다. 반면 액션은 필수적이지만, 잘못 다루면 예측하기 어렵습니다. 따라서 코드를 작성하거나 읽을 때마다 “이 코드는 데이터인가, 계산인가, 액션인가?”라는 질문을 던져보는 습관이 필요합니다. 그렇게 하면 더 명확하고 유지보수하기 쉬운 코드를 만들 수 있습니다.