피드로 돌아가기
Dev.toBackend
원문 읽기
함수형 프로그래밍과 부작용 있는 현실 세계를 연결하기 위해 함수형 코어-명령형 셸 아키텍처 도입
Interfacing Pure Functions with Our Impure World
AI 요약
Context
함수형 프로그래밍은 부작용이 없는 순수 함수로 비즈니스 로직을 구현하면 테스트가 쉬워진다는 장점이 있다. 하지만 모든 실제 애플리케이션은 IO, 상태 업데이트, 타이머 관리 같은 부작용이 필요하므로, 순수 함수만으로는 실제 동작하는 애플리케이션을 만들 수 없다.
Technical Solution
- 애플리케이션을 함수형 코어(부작용 없는 순수 비즈니스 로직)와 명령형 셸(코어를 호출하고 부작용 수행)로 분리: 코어는 부작용이 필요한 동작을 설명하는 데이터를 반환하고, 셸이 그것을 해석해 실행
- 함수형 코어 구성: 모든 비즈니스 결정을 순수 함수로 인코딩하고, 이들을 자유롭게 합성해 추상화 계층 구축
- 명령형 셸 구성: 표준 라이브러리로 stderr 쓰기, 프로토콜 스택으로 타 시스템 통신, private 멤버 변경으로 상태 유지, 타이머 관리 등 모든 부작용 수행 (비즈니스 로직 구현 제외)
- 코어의 독립성 확보: 셸이 코어에 의존하지만, 코어는 셸에 독립적이므로 셸 없이 코어를 완전히 격리된 환경에서 테스트 가능
- 구체적 예시: 뱀 게임의 방향 변경 검증 함수를 순수 함수로 구현(현재/요청 방향 입력받아 유효성과 로그 메시지 반환)하고, main 함수에서 키보드 입력 받기, 로그 출력, 상태 변경 같은 부작용 수행
Key Takeaway
순수 함수는 부작용을 수행하는 대신 그 부작용이 무엇이어야 하는지를 설명하는 데이터를 반환하도록 설계하면, 함수형 프로그래밍의 테스트 가능성 이점과 실제 애플리케이션의 부작용 필요성을 동시에 충족할 수 있다.
실천 포인트
C++ 서비스에서 함수형 코어-명령형 셸 패턴을 도입하면, 비즈니스 로직을 순수 함수로 격리하고 IO/상태 변경/타이머는 별도 셸에서 관리함으로써 핵심 로직의 테스트 용이성을 높이고 부작용 관련 버그를 셸 계층에 국소화할 수 있다.