F-lab 멘토링을 시작하며 쏙쏙 들어오는 함수형 코딩이라는 책을 공부하게 되었습니다. 함수형 프로그래밍이라는 말만 들어보았지 함수형 프로그래밍이 무엇인지, 왜 사용하는지에 대해 모르고 지냈습니다. 이 책의 Chapter 1,2를 읽으며 왜 리액트 및 여러 프론트엔드 기술들이 함수형 프로그래밍 방식을 선택했는지에 대해 고민해보았습니다.
함수형 프로그래밍 하면 떠오르는 키워드들이 있었습니다. 순수함수, 부수효과, RxJS 등등.. 그리고 함수형 프로그래밍을 적용하는 친구들의 말을 들어보면 '어렵다' 라는 반응이 대부분이었습니다. 그래서 함수형 프로그래밍인 저에게는 선뜻 다가가기 힘든 영역이라 생각했습니다. 함수형 프로그래밍을 적용하지는 못해도 평소 작업 시 부수효과를 최대한 억제하고 함수들이 단일 책임만 가지게하려 노력했습니다. 그래서 이런 생각들을 종합해서 저는 아래와 같은 정의를 내렸습니다.
함수형 프로그래밍이란 순수함수들을 사용하여 부수효과를 효율적으로 제어하는 방식
Chapter 1에서는 학문적 측면에서 함수형 프로그래밍의 정의를 설명하고 실용적인 측면에서 해당 정의의 문제점을 이야기 합니다. 일반적으로 위키피디아나 다른 책들에서 정의하는 함수형 프로그래밍의 정의는 다음과 같습니다.
- 수학 함수를 사용하고 부수효과를 피하는 것이 특징인 프로그래밍 패러다임
- 부수효과 없이 순수함수만 사용하는 프로그래밍 스타일
부수효과는 함수가 리턴값 이외에 하는 모든일을 말하며 순수함수는 인자에만 의존하고 부수효과가 없는 함수를 지칭합니다.
하지만 실제 코드를 작성할 때 부수효과는 피할 수 없습니다. 우리가 구현하는 기능들은 항상 부수효과입니다. 예를들어 로그인을 하거나 API를 통해 정보를 얻어오거나 결재를 진행하는 등 중요한 동작들이 많습니다. 따라서 책에서는 함수형 프로그래밍을 부수효과를 더 잘 다루기위한 방법으로 정의합니다.
기존 정의들은 부수효과를 억제하고 순수함수로만 코드를 구성하도록 했습니다. 저도 이전에 함수형 프로그래밍을 공부할때 기존 명령형 코드들을 순수함수로 구성하는 방법만 학습하다 보니 이걸 왜 해야하는지 의문이 들었습니다. 하지만 Chapter 1,2를 읽으며 함수형 프로그래밍에 대해 필요성과 흥미를 느끼게 되었습니다.
해당 책에서는 함수형 프로그래밍을 추구하기 위해 함수형 사고를 강조합니다. 그리고 함수형 사고를 하기 위해서 크게 두가지 과정을 소개합니다. 우리가 작성하는 코드를 액션, 계산, 데이터로 나누는 과정과 일급 추상입니다.
해당 책에서는 우리가 작성하는 코드를 액션, 계산, 데이터로 구분합니다. 액션은 함수형 프로그래밍에서의 부수효과입니다. 호출 횟수와 시점에 의존합니다. 계산은 단어 그대로 인자가 주어지면 리턴하는 것입니다. 보통 어떤것을 결정하거나 계획합니다. 계산은 실행해도 다른곳에 영향을 주지 않으며 횟수, 시점에 의존하지 않습니다. 마지막으로 데이터는 변하지 않는 데이터를 의미합니다.
이렇게 코드를 나누는 이유는 계층화 설계를 하기 위함입니다. 데이터는 자주 바뀌지 않으며 액션은 자주 바뀌는 특성이 있습니다. 따라서 코드를 3가지 계층으로 나누고 액션의 범위를 좁히면 우리는 테스트, 재사용, 유지보수가 쉬워집니다.
해당 책에서 일급 추상에 대해 설명하기 위해 타임라인에 대해 설명합니다. 타임라인은 우리가 구현하는 기능의 동작을 시간 순서대로 구분하여 순서도처럼 나타낸 것입니다. 기능을 구현하다 보면 이벤트 발생시점을 알 수 없는 경우가 굉장히 많습니다. 유저가 버튼을 언제 누를지도 모르고 API가 언제 응답을 반환할지 알 수 없습니다. 그리고 대부분 하나의 타임라인으로 구성할 수 없어 여러개의 타임라인으로 구성됩니다. 각 타임라인은 독립적으로 동작하지만 순서가 영향을 주기도 합니다. 따라서 해당 책에서는 타임라인 커팅을 통해 액션들을 올바른 순서로 동작하게 합니다.
이러한 과정을 통해 저자는 독자들이 코드를 부수효과를 더 잘 다룰 수 있는 기술들을 소개합니다.
여기까지 내용을 읽어보며 왜 리액트나 여러 프론트엔드 기술들이 함수형 프로그래밍을 선택하는지 고민해 보았습니다. 우선 프론트엔드 업무의 특성을 생각해 보았습니다. 보통 프론트엔드 개발자들은 유저의 동작에 대한 대응을 많이 합니다. 이러한 유저의 동작들은 대부분 액션이라 생각합니다. 버튼을 클릭하는 시점에 따라, 그리고 클릭하는 횟수에 따라 화면은 다르게 대응해야합니다. 또한 서버와의 통신 또한 여러 부수효과 중 하나입니다. 이러한 내용을 통해 함수형 프로그래밍을 선택한 이유를 한줄로 요약해 보았습니다.
증가하는 부수효과들을 효율적으로 대처하기 위해
생각해보면 react-query나 상태관리 툴들도 부수효과들을 쉽게 다루기 위한 도구가 아닐까 하는 생각이 들었습니다.
현업에서 항상 부수효과를 대응하며 머리 아파했던 것 같습니다. 끊이지 않는 경우의 수에 조건문을 계속 추가해 가며 이것이 맞는 방법인지 의문을 가졌습니다. 해당 책을 학습하고 글을 작성하며 위 고민에 대한 답을 찾아보려 합니다.