Functional Programming - Side Effect

FP 에서 기본적인 개념이다. 우리가 보통 테스트 코드를 작성하는 이유 중 하나는 Side Effect(부작용) 방지를 위해서다. 그러면 ‘테스트 코드를 많이 만들면 되겠네?’ 라는 접근도 가능하다. 뭐, 틀린 말은 아니다. 그러나 테스트 코드가 모든 부작용을 잡아주지는 않는다. 물론 FP 또한 완벽한 방법이라보다는, 접근을 달리 한 것이고 부작용을 줄이려는 시도가 있는 패러다임이다.

부작용에 대해 설명하기 이전에 간단한 산수인데, 0 x 100 = 0 이고 1 x 100 = 100 이라는 점을 생각한다면, 나중에 만들어낸 함수를 가지고 Composition(조합) 을 하게 되고, 함수 하나의 부작용이 0 개라면 100 개를 조합해도 0 이 될 수 있다. 그러나 함수에 1 개에 부작용이 있기만 해도 100 번이 생길 수 있다. 조합을 하는 순간 Advanced 영역으로 가게 되는데, 그 때 부작용이 없다면 정말 독립적인 함수들로 부작용이 적은 함수 집단을 만들 수 있는 것이다. 이는 극단적인 가정이지만, 함수 자체가 보통 독립적으로 동작할 수 있게 해야하기 한다. 독립적? 무슨 말이지??

1
2
3
function sum () {
return this.x + this.y
}

이런 함수가 있다고 했을 때, 우리는 this 에 의해 sum 의 결과가 좌우된다. 즉,

1
2
3
4
5
// this.x = 3
// this.y = 4
function sum () {
return this.x + this.y
}

라면, 7 이 나와야겠지만, 또 다른 함수가 this.x 를 사용하고 있었고 sum 함수가 실행되기 직전에 this.x = 5 로 값이 바뀌었다면, 이는 9 가 나와서 예상하지 못했던 결과가 될 수 있다. 이렇게 외부로 인해 결과가 뒤바뀔 수 있는게, 부작용이다. 부작용이란 용어는 별거 없다. 외부의 영향으로 생각지 못한 결과가 발생하면 부작용이라 한다.

1
const sum = (x, y) => x + y

이렇게만 해도, sum 함수는 완전 독립적으로 작동한다. 즉, this 의 영향을 전혀 받지 않기 때문에 입력이 들어오면 들어오는 값으로만 처리하면 되는 간단한 함수가 된다. 길게 만들어내는 과정에서 부작용을 만들어낼 수 있지만, 이 함수 자체로는 0 이다. 그럼 함수의 조합에서는 모두 0 이되면 그야말로 부작용이 없을 수 있는 응용 프로그램이 되는 것이다. 의존성이 없어서 테스트 코드 만들기도 좋다는 말도 있다. ‘이게 뭐야!?’ 할 수 있는 부분이지만, 기본에 들어가는 내용이라, 아주 간단하다.

1
const timestamp = () => +new Date()

라는 예제가 있다면, 이는 부작용이 있을까? 있다면 무엇이 문제일까? 물론 코드는 완벽하게 돌아간다. 이 글을 읽는 분을 위해 남겨놓고 다음 글로 향하려고 한다.