스터디 두 번째 책으로 "쏙쏙 들어오는 함수형 코딩"을 시작했다.
주변 사람들로부터 읽으면 도움이 많이 될거라는 이야기를 많이 들어서, 기대를 하고 읽었는데 너무 재밌게 읽은 것 같다.
이번 글에서는 챕터 3까지 읽고 기억에 남았던 개념인
액션(Action), 계산(Calculation), 데이터(Data)에 대해 정리해본다.
| 액션 (Action) | 계산 (Calculation) | 데이터 (Data) | |
|---|---|---|---|
| 정의 | 실행 시점과 횟수에 의존 | 입력을 받아 출력을 만드는 순수한 함수 | 이벤트에 대한 사실, 변하지 않는 값 |
| 예시 | 이메일 보내기, 데이터베이스 읽기 | 최댓값 찾기, 이메일 주소 검사 | 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량 |
| 입력 동일 → 결과 동일 | ✅ 항상 같다 | ✅ 항상 같다 | ❌ 항상 같지 않음 (실행 횟수 등 영향 받음) |
| 부수 효과 | ✅ 있음 | ❌ 없음 | ❌ 없음 |
표를 기준으로 각 개념을 정리해보면 다음과 같다.
계산과 데이터는 금방 감이 왔는데, 액션이 항상 부수 효과를 가지는지에 대해서는 헷갈렸다.
책에서는 우리가 흔히 사용하는 다음과 같은 코드들을 액션으로 분류한다.
// 함수 호출
alert('Hello world!'); // 팝업이 뜨니까 액션
// 메서드 호출
console.log("hello"); // 콘솔 출력도 액션
// 생성자
new Date(); // 호출 시점마다 값이 달라지므로 액션
// 표현식
y
user.first_name
stack[0]
이런 참조 표현들도 전역 상태나 외부 값에 의존하고, 그 값이 변경 가능하다면, 참조하는 시점마다 결과가 달라질 수 있어서 액션으로 분류된다고 한다.
요약하면, "호출 시점에 따라 값이 달라지거나 어떤 행위 자체가 일어나는 것"을 액션이라고 보면 될 것 같다. 즉 모든 액션이 부수 효과를 가지고 있는 것은 아니다.
대부분의 액션은 외부 상태와 관련이 되어 있어서 헷갈렸던 것 같다.
책의 예시에서 제나라는 개발자는 아래의 코드를 작성하면서 sendPayout만 액션이라고 생각했다.
function figurePayout(affiliate) {
const owed = affiliate.sales * affiliate.commission;
if (owed > 100)
sendPayout(affiliate.bank_code, owed);
}
function affiliatePayout(affiliates) {
for (let a = 0; a < affiliates.length; a++)
figurePayout(affiliates[a]);
}
function main(affiliates) {
affiliatePayout(affiliates);
}
하지만 실제로는 main()함수가 실행되면, affiliatePayout() -> figurePayout() -> sendPayout() 흐름이 이어지고 함수가 실행된다.
최종적으로 액션이 실행된다면 그 액션으로 이어지는 모든 함수가 액션인 것이다.
이런 부분 때문에, 액션을 남발하는 건 좋지 않겠다는 생각이 들었다.
항해 플러스에서 클린 코드 챕터를 진행했을 때와 비슷한 느낌을 받았는데, 이번 책은 그보다 훨씬 더 구체적이고 깊이 있는 개념들이 많다.
개념들이 단순하거나 쉽지는 않지만, 실제 코드에 적용해보면서 단순히 읽고 끝나는 것이 아니라 나만의 개발 틀을 만들어 가고 싶다.