함수형 프로그래밍을 이해하기 위한 첫 질문
《함수형 반응형 프로그래밍》과 《스칼라로 배우는 함수형 프로그래밍》을 읽으며 이벤트, 상태, 순수 함수와 참조 투명성을 연결한 학습 기록입니다.
- 작성일
- 업데이트일
함수형 프로그래밍을 처음 공부 목록에 적었을 때는 이유를 제대로 설명하지 못했습니다. “요즘 자주 들리는 말이니 개념부터 알아보자”에 가까웠어요. 이후 《함수형 반응형 프로그래밍》과 《스칼라로 배우는 함수형 프로그래밍》을 읽고, 회사에서 Scala를 접하면서 질문이 조금 구체적으로 바뀌었습니다.
이벤트 리스너가 많아지면 왜 어려워질까
대화형 애플리케이션은 사용자 입력, 네트워크 응답, 시간 변화처럼 여러 이벤트에 반응합니다. 처음에는 각 이벤트에 리스너를 붙이면 간단하지만, 규모가 커지면 다음 문제가 겹칩니다.
- 리스너가 등록되고 해제되는 시점을 추적하기 어렵다.
- 어떤 이벤트가 다른 상태를 바꾸는지 연결이 흩어진다.
- 실행 순서에 따라 결과가 달라질 수 있다.
- 같은 상태를 여러 곳에서 갱신하며 불일치가 생긴다.
- 테스트하려면 많은 외부 상태를 먼저 준비해야 한다.
함수형 반응형 프로그래밍은 이벤트와 시간에 따라 변하는 값을 조합 가능한 값으로 다루려는 접근으로 읽었습니다. “듣기를 멈추자”는 표현은 이벤트를 없애자는 뜻보다, 곳곳의 명령형 리스너를 직접 관리하는 부담을 줄이자는 제안에 가까웠어요.
상태 기계와 데이터 흐름
상태 기계로 모든 전이를 직접 나열하면 정확해 보이지만 상태와 이벤트 조합이 늘어날수록 표가 커집니다. 반응형 모델에서는 입력 신호를 변환하고 결합해 출력이 어떻게 만들어지는지를 한 방향의 흐름으로 설명하려 합니다.
| 명령형 질문 | 함수형·반응형 질문 |
|---|---|
| 이 이벤트에서 어느 변수를 바꿀까 | 이 출력은 어떤 입력들로 계산되는가 |
| 리스너를 언제 제거할까 | 값의 생명 주기를 어떻게 구성할까 |
| 순서가 꼬이지 않게 무엇을 먼저 호출할까 | 순서 의존성을 데이터 관계로 표현할 수 있을까 |
| 테스트 전에 어떤 객체를 준비할까 | 같은 입력에 같은 출력을 내는 부분을 분리할 수 있을까 |
모든 UI를 하나의 거대한 반응형 그래프로 만드는 것이 답은 아닙니다. 외부 효과와 순수한 계산을 나누고, 이벤트의 소유권을 분명히 하는 것부터 적용할 수 있습니다.
순수 함수와 참조 투명성
Scala 책에서 가장 오래 남은 개념은 순수 함수와 참조 투명성이었습니다. 순수 함수는 같은 입력에 같은 결과를 내고, 결과 외의 관찰 가능한 부수효과를 만들지 않습니다. 참조 투명한 표현은 그 표현을 계산 결과로 바꿔도 프로그램의 의미가 달라지지 않아요.
이 성질이 있으면 코드를 부분별로 추론하고 테스트하기 쉬워집니다. 파일, 네트워크, 시간과 같은 효과가 사라지는 것은 아니지만 계산의 중심에서 밀어내고 경계에서 다룰 수 있습니다.
Scala를 배우며 낯설었던 점
Scala 문법을 처음 볼 때는 모든 것이 객체처럼 다뤄지는 점, object로 싱글턴을 표현하는 방식, 함수 정의와 세미콜론 없는 문법이 눈에 들어왔습니다. JavaScript의 함수형 표현에 익숙해 빠르게 연결되는 부분도 있었지만, 타입 시스템과 평가 방식은 별도로 배워야 했어요.
문법 목록을 외우기보다 작은 함수를 작성하며 다음을 확인했습니다.
- 입력과 출력 타입을 어떻게 표현하는가
- 변경 가능한 상태를 없애면 함수가 어떻게 달라지는가
- 고차 함수로 반복되는 흐름을 어떻게 조합하는가
- 실패나 효과를 값으로 표현하면 호출부가 무엇을 알게 되는가
지금 남은 적용 기준
함수형 프로그래밍은 특정 언어를 선택하거나 모든 것을 한 줄로 쓰는 스타일이 아니었습니다. 복잡한 흐름에서 바뀌는 부분과 계산하는 부분을 구분하고, 가능한 영역을 예측 가능한 값 변환으로 만드는 사고방식에 가까웠어요.
- 비즈니스 규칙을 I/O와 분리할 수 있는가
- 상태를 여러 곳에서 직접 바꾸고 있지 않은가
- 함수의 결과가 숨은 전역 값이나 실행 순서에 의존하는가
- 이벤트 연결을 해제하고 오류를 처리하는 주체가 분명한가
- 추상화가 실제 복잡성을 줄였는가
처음에는 유행하는 키워드라 적어 둔 공부였지만, 끝에는 “이 코드를 부분별로 믿고 설명할 수 있는가”라는 질문으로 남았습니다.
이어 읽기
- 《You Don’t Know JS》 스터디를 마치며 — 함수, 스코프와 객체 모델을 먼저 살펴본 JavaScript 학습 기록입니다.
- 웹 개발 공부에서 남은 연결고리 — 이벤트·상태에 관한 개념을 실제 프론트엔드 문제와 플랫폼 경계에 연결합니다.
- 개발자로 성장하며 남긴 질문들 — Scala와 함수형 프로그래밍을 공부하게 된 조직 변화와 회고가 담겨 있습니다.