- Published on
2023.12.17
[함수형 코딩] - 01 / 02 / 03
01. 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다
함수형 프로그래밍이란?
함수형 프로그래밍의 정의
- 수학 함수를 사용하고 부수 효과를 피하는 것이 특징인 프로그래밍 패러다임
- 부수 효과 없이 순수 함수만 사용하는 프로그래밍 스타일
부수 효과
함수가 리턴값 이외에 하는 모든 일, 메일 보내기
, 전역 상태 수정하기
등
필요한 리턴값외에 의도하지 않은 부수 효과가 발생할 수 있어 함수형 프로그래밍에서는 가능한 피하려고 함
순수 함수
인자에만 의존하고 부수 효과가 없는 함수로, 같은 입력에 대하여 항상 같은 출력을 기대할 수 있는 함수
그렇기에 함수형 프로그래밍을 한다면 부수 효과를 피하고 순수 함수만 사용해야 할 것 같지만, 실제 개발에서는 이러한 정의가 크게 도움이 되지 않는다.
실용적인 측면에서의 문제
문제 1: 부수 효과는 필요하다.
부수 효과는 소프트웨어를 실행하는 이유이다. 정의와는 다르게 부수 효과는 필요하다.
문제 2: 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있다.
부수 효과는 실제로 필요하고, 그에 따른 문제점을 다룰 방법들이 있기에 프로그래머는 순수 함수가 아니어도 사용한다.
문제 3: 함수형 프로그래밍은 실용적이다.
정의만을 읽으면 실제 개발에서는 사용하지 않는 것처럼 느껴질 수 있지만 그렇지 않다. 많은 소프트웨어가 함수형 프로그래밍으로 만들어진다.
실제 개발에 적용하기 위해 함수형 프로그래밍의 정의와 학문적인 내용보다는, 기술을 통해 함수형 프로그래밍을 배우는 것이 중요하다. 여기서 중요한 내용이 함수형 프로그래밍의 기술인 액션
, 계산
, 데이터
이다.
액션
실행 시점과 횟수에 의존한다.
부수 효과를 일으킨다.sendEmail()
saveUserDB(user)
getCurrentTime()
계산
호출하는 시점이나 횟수가 중요하지 않다. 항상 같은 값을 리턴하기 때문
언제, 어디서 계산해도 결과는 같고 외부에 영향을 주지 않아 테스트하기 쉽고 안전하다.sum(numbers)
string_length(str)
데이터
이벤트에 대해 기록한 사실. 문자열, 객체 등 값 자체.
실행하지 않아도 데이터 자체로 의미가 있다.[1, 10, 2, 45, 3, 98]
{"firstname": "Eric", "lastname": "Noramand"}
함수형 프로그래밍의 시작
함수형 프로그래밍의의 기술과 개념은 코드를 액션
과 계산
, 데이터
로 구분하는 것에서 시작한다.
시나리오를 통해 구분해 보기
1단계: 사용자가 작업 완료 표시를 함
실행 횟수에 의존하므로액션
2단계: 클라이언트가 서버로 메시지를 보냄
메시지를 보내는 것은액션
, 메시지 자체는 서버에서 해석해야 하는 값이므로데이터
3단계: 서버가 메시지를 받음
메시지를 받는 것은 횟수에 의존하므로액션
4단계: 서버가 데이터베이스를 변경
내부 상태를 바꾸므로액션
5단계: 서버가 누구에게 알림을 보낼지 결정
결정하는 것은계산
, 입력값이 같다면 서버는 항상 같은 결정을 내리기 때문6단계: 서버가 이메일로 알림을 보냄
이메일 보내기는액션
, 같은 메일을 한 번 보내는 것과 두 번 보내는 것은 다르다.
함수형 프로그래밍의 장점
데이터와 계산은 실행 시점이나 횟수에 의존하지 않는다. 코드를 데이터와 계산으로 바꿀수록 분산 시스템에서의 문제를 해결할 수 있고, 액션을 격리시켜 코드에 주는 영향을 최소화할 수 있다.
02. 현실에서의 함수형 사고
파트 I: 액션, 계산, 데이터
계층화 설계
변경 가능성을 기준으로 코드를 나눈다. 자주 바뀌지 않는 것을 아래로, 자주 바뀌는 것을 위로 계층을 나누었을 때, 기술 스택
이 가장 아래로, 도메인 규칙
이 중간에, 비즈니스 규칙
이 가장 위로 간다. 이를 통해 비즈니스, 도메인 및 기술 문제를 명확하게 분리할 수 있다. 가장 위에 위치한 코드는 의존성이 거의 없으므로 쉽게 바꿀 수 있다. 이러한 아키텍처 패턴을 계층형 설계
라고 부른다. 계층형 설계로 만든 코드는 테스트
, 재사용
, 유지보수
가 쉽다.
변경 가능성 | 메인 레이어 |
---|---|
자주 바뀌는 것 | 비즈니스 규칙 |
↕ | 도메인 규칙 |
자주 바뀌지 않는 것 | 기술 스택 |
파트 II: 일급 추상
타임라인 다이어그램을 통해 액션을 시간 순서대로 볼 수 있다. 하지만 분산 시스템에서 타임라인 다이어그램을 통해 액션을 살펴보면, 독립된 액션의 실행 순서를 확인할 수 없다. 어떤 액션이 먼저 끝날지 알 수 없기 때문, 서로 다른 타임라인에 있는 액션 간 실행 순서는 보장할 수 없다. 이를 해결하기 위한 방법들이 있다.
타임라인 커팅
여러 타임라인이 동시에 진행될 때 순서를 맞추는 방법, 타임라인에 점선을 그려 이전 작업이 끝날 때까지 다음 작업을 진행하지 말라는 것을 시각화한다. 타임라인 커팅은 고차 동작
으로 구현한다.
03. 액션과 계산 데이터의 차이를 알기
액션과 계산 데이터는 어디에나 적용할 수 있다.
- 액션과 계산, 데이터는 어디에나 적용할 수 있다.
- 액션에는 계산과 데이터, 또 다른 액션이 있을 수 있다.
- 계산은 더 작은 계산과 데이터로 나누고 연결할 수 있다.
- 데이터는 데이터만 조합할 수 있다.
- 계산은 머릿 속에서 나도 모르게 일어난다.
예제를 보고 액션을 구분하려고 했는데 생각보다 헷갈린다. 내가 시점이라고 생각했던 게 시점이 아니기도 하고, 계산이라고 생각했는데 액션이기도 하고..? 액션인데 계산.. 계산인데 액션..? 😵💫😵
데이터의 장점
- 직렬화
- 동일성 비교
- 자유로운 해석 (사용하기 나름) - 장점이자 단점
액션보다 계산이 좋은 이유
계산으로 바꿀 수 있는 액션이 있다면 바꾸는 것이 좋다.
- 액션보다 테스트하기가 편하다.
- 기계적인 분석이 쉽다. (정적 분석)
- 조합하기 좋다. 계산을 조합해 더 큰 계산을 만들 수 있다. (일급 계산)
액션은 코드 전체로 퍼진다.
액션을 부르는 함수도 액션이 된다.
액션을 조심스럽게 다뤄야 하는 이유.
액션은 함수형 프로그래밍에서 가장 중요하다.
예시를 보면서 상태나 온갖 호출과 참조가 모두 액션인 것을 보고, 액션이 전파된다는 것까지 보고나니 내 코드, 더 나아가 프로젝트 전체가 액션인 것은 아닌가 하는 생각이 든다... 여유가 생기면 정말 집중해서 프로젝트를 깔끔하고 좋은 코드로 바꾸고 싶다 ㅠ