Search
1️⃣

1. 액션 / 계산 / 데이터 구분하기

'액션', '계산', '데이터'란 무엇인가?

함수형 프로그래밍에서는 '액션', '계산', '데이터'라는 세 가지 개념을 명확히 구분한다. 이 세 가지는 코드의 동작 방식과 의도를 이해하는 데 핵심적인 역할을 한다.

액션 (Action)

액션은 외부 세계에 영향을 미치거나 외부 세계로부터 입력을 받는 연산이다. 실행 시점에 따라 결과가 달라질 수 있으며, 부수효과(side effect)를 포함한다.
예시:
파일 쓰기/읽기: 부수 효과를 포함한다.
네트워크 요청: 실행 시점에 따라 DB에 있는 값이 달라지니 액션으로 분류된다.
현재 시간 읽기

계산 (Calculation)

계산은 순수 함수(pure function)와 같이 입력값에 따라 항상 동일한 결과를 반환하는 연산이다. 부수효과가 없고, 호출 시점이나 횟수에 관계없이 결과가 변하지 않는다.
예시:
두 숫자의 합 계산
문자열 처리
데이터 정렬

데이터 (Data)

데이터는 코드에서 다루는 값 또는 구조를 의미한다.
예시:
JSON 객체
불변 배열
문자열

액션 / 계산 / 데이터의 특징

액션

실행 시점에 민감하다.
호출 횟수와 순서가 중요하다.
외부 상태에 의존하거나 외부 상태를 변경한다.

계산

순수하다. 동일한 입력에 대해 항상 동일한 결과를 반환한다.
호출 횟수나 순서에 영향을 받지 않는다.
테스트하기 쉽다.

데이터

불변성을 유지한다.
복제와 공유가 쉽다.
코드의 가독성과 디버깅을 향상시킨다.

3. 세 가지를 구별하는 방법

데이터의 경우는 명확한데, 액션과 계산의 경우는 많이 헷갈린다. 어떻게 구별할 수 있을까?
1.
코드가 외부 세계와 상호작용하는가? / 코드가 실행 시점에 영향을 받는가? / 실행 후 부수 효과를 동반하는가?
그렇다면 이는 액션이다.
2.
코드가 입력값에 따라 항상 동일한 결과를 반환하는가?
그렇다면 이는 계산이다.
3.
코드가 값 또는 구조를 나타내는가?
그렇다면 이는 데이터이다.

액션 / 계산 / 데이터를 구분해야하는 이유

함수형 프로그래머는 액션보다는 계산을, 계산보다는 데이터를 더 중요시한다. 액션은 부수 효과를 동반하고 실행시점에 달라져서 프로그래밍을 복잡하게 만들기 때문이다.
액션은 부수효과를 포함하고 있어, 액션을 실행하는 함수 역시 액션이 된다. 그렇게 언제 실행되느냐, 얼마나 실행되느냐에 따라 결과가 달라지는 부수 효과가 시스템 전체로 퍼져나간다. 때문에 함수형 프로그래머는 액션을 최소화 시키는 방향으로 시스템의 복잡성을 줄여나가야 한다.
그럼 어떻게 구분할 수 있을까? 실제 코드 예시로 구분해보자.

문제 상황

예를 들어, 쇼핑몰 웹사이트에서 상품을 장바구니에 추가하는 기능을 구현한다고 가정한다.
function addItemToCart(cart, item) { const updatedCart = [...cart, item]; saveCartToDatabase(updatedCart); // 데이터베이스에 저장 return updatedCart; }
JavaScript
복사
위 코드는 장바구니 상태를 업데이트하고 이를 데이터베이스에 저장한다. 여기에는 액션, 계산, 데이터가 혼재되어 있다.

개선된 코드

함수형 코딩의 원칙에 따라 이 코드를 세 가지로 분리할 수 있다.

데이터

const cart = [ { id: 1, name: "Item A", price: 1000 }, { id: 2, name: "Item B", price: 2000 }, ]; const newItem = { id: 3, name: "Item C", price: 3000 };
JavaScript
복사

계산

function addItem(cart, item) { return [...cart, item]; } const updatedCart = addItem(cart, newItem);
JavaScript
복사

액션

function saveCart(cart) { database.save(cart); // 외부 시스템과의 상호작용 } saveCart(updatedCart);
JavaScript
복사

왜 구분해야 하는가?

액션, 데이터, 계산으로 분리되면서 시스템은 테스트하기 쉬워지고, 자연스럽게 변경이 잦은 부분과 그렇지 않은 부분으로 계층화된다.
코드의 명확성: 액션, 계산, 데이터를 분리함으로써 각 코드의 목적을 명확히 이해할 수 있다.
테스트 용이성: 계산은 부수효과가 없으므로 단위 테스트가 간단하다. 액션은 따로 분리되어 모의(Mock) 객체로 테스트할 수 있다.
유지보수성: 데이터와 계산이 독립적이므로 요구사항 변경 시 영향을 최소화할 수 있다.

구분의 이점

디버깅 시간 단축: 버그의 원인을 더 쉽게 찾을 수 있다.
재사용성 증가: 계산과 데이터가 분리되어 재사용 가능성이 높아진다.
확장성 향상: 새로운 기능 추가 시 기존 코드를 수정하지 않고 확장할 수 있다.

결론

액션, 계산, 데이터를 구분하는 것은 함수형 코딩의 핵심 원칙 중 하나이다. 이를 통해 코드의 명확성, 테스트 용이성, 유지보수성을 높일 수 있다. 개발자는 코드 작성 시 이 세 가지를 의식적으로 구분함으로써 더 나은 품질의 소프트웨어를 개발할 수 있다.