안녕하세요 또 보게 되었네요 👋

profile.jpeg

이현우(27)

본 세미나의 목적

함수형 프로그래밍과 함수 컴포넌트

Compose는 함수로 UI를 구성합니다. 즉 Compose의 화면을 구성하는 단위인 Composable는 함수이죠(이건 당연하죠?)

그러다보니 자연스럽게 따라오는 개념이 함수형 프로그래밍 개념입니다. 이미 선배 개발자들은 함수를 활용하여 프로그램을 개발할 때 어떤 점을 유의해야하는 지 연구를 한 것들이 있으니 이 내용들 중 일부를 간략히 살펴보도록 하겠습니다.

함수형 프로그래밍 베이스: Function(Pure Function)과 Side Effect

함수형 프로그래밍에서 프로그램의 구성요소는 아주 크게 두가지로 구분할 수 있습니다.

Side Effect

return 값(계산 값) 이외에 다른 상태, 즉 외부의 세계에 변경을 줄 수 있는 함수

Side Effect는 비순수함수로 의역을 하곤 합니다. 즉 순수 함수가 있다는 뜻이겠죠? 이건 뒤에서 다뤄보도록 하겠습니다.

Side Effect는 함수 내부의 값(패러미터, 로컬 변수) 이외에 다른 곳, 이를테면 프로젝트 내의 전역 변수(static 등) Database나 네트워크에 올려져있는 DB 심지어 화면 출력(로깅)도 외부세계로 간주하고 이들의 상태를 변경시키는 함수입니다.

순수 함수(PureFunction, Function)

Pure function은 Side Effect가 없는 함수, 즉 함수의 실행이 외부 세계에 영향을 끼치지 않는 함수를 뜻합니다.

간단하게 함수 내부 변수와 패러미터들을 활용하여 리턴값을 만드는 것을 순수함수라고 부릅니다. 정말 간단한 형태의 더하기/빼기/곱하기 등의 함수들이 대표적인 예시입니다.

fun add(a: Int, b: Int) = a + b

이 순수함수는 참조 투명성(Referentially Transparent)을 가지고 있습니다. 즉 외부 세계에 어떠한 의존을 하지 않고 동일한 패러미터가 들어오면 **동일한 값을 반환해준다(멱동성, idempotency)**는 특성을 가집니다.

함수형 프로그래밍에서는 되도록이면 이런 순수함수만을 활용하여 프로그램을 구성하고자 합니다. 멱동성을 가진 컴포넌트를 활용한다면 특정 케이스를 재현하기 쉬워지고 병렬 문제에서도 안전하니 개발자들이 조금 더 안정적으로 개발할 수 있지 않을까 하는 접근이겠죠.

하지만 우리의 프로그램은 대개의 경우 외부환경과 연동 없이 구성하는 것은 불가능합니다. 단적으로 모바일 프로그래밍은 함수의 결과물을 화면에 출력하죠. 여기서부터 이미 큰 전제가 흔들리기에 함수형 프로그래밍과 프론트엔드의 결합은 어색해 보일 수 있죠. 그렇다면 Compose에서 어떠한 부분들에 이런 개념들이 적용될까요?

아 그만.

아 그만.

Compose와 함수형 프로그래밍: 적절한 접근방식

비록 Compose에서 이런 함수형 프로그래밍 원칙을 철저히 준수하는 것은 굉장히 힘듭니다.

하지만 특정 상황을 쉽게 재현할 수 있는 성질을 활용하면 화면의 상태를 테스트하는 것은 굉장히 쉽기 때문에, Compose에서는 Composable을 설계할 때 이런 원칙들을 채택하기로 합니다.

그 중 이 섹션에는 Composable을 구성하는 State, Effect, Stateless와 Staeful에 대해 간략하게 보고 갈게요.

State와 Effect

우선 Effect라는 말을 듣고 Compose의 LaunchedEffect를 떠올리신 분들이 정말 많을거에요. 네 정확히 그 개념이고, Compose 공식문서에서는 이를 포함한 카테고리를 Side-effects in Compose로 묶어놨습니다.