[Android] compositionLocal란?

우발자·2026년 6월 13일

CompositionLocal가 무엇이며 어떻게 쓰이는 지 알아볼려고 한다.


1️⃣ CompositionLocal이란?

컴포저블 트리에서 데이터를 파라미터로 일일이 넘기지 않고, 하위 트리 전체에 전달하는 메커니즘이다. 예를 들어 테마 색상, 화면 설정 같은 걸 모든 컴포저블에 일일이 내려주게 되는 일은 매우 귀찮은 작업이 될 것이다. 그래서 특정 하위 컴포저블에게 필요할 때 바로 사용할 수 있게 해준다.

초기화하는 법

val LocalElevation = compositionLocalOf { 4.dp }

val LocalElevation = staticCompositionLocalOf { 4.dp }

val LocalUser = staticCompositionLocalOf<User> {
	error("No user provided")
}

사용법

CompositionLocalProvider(LocalElevation provides 8.dp) {
	MyContent() // 이 하위 트리에서 사용 가능
}

@Composable
fun MyContent(){
	val elevation = LocalElevation.current
    Card(elevation = elevation) { /* ... */ }
}

2️⃣ compositionLocalOf와 staticCompositionLocalOf 차이점

값이 바뀔 때 재구성이 되냐 안되냐의 차이점이다.
staticCompositionLocalOf은 말 그대로 정적인 CompositionLocal을 만들 때 사용된다. 만약 값이 바뀐다면 CompositionLocalProvider에 블록 전체가 재구성된다.

그래서 값이 자주 바뀐다면 compositionLocalOf를 사용하는게 유리하다.
compositionLocalOf는 읽은 곳만 재구성 되기 때문이다.

하지만 그렇다고 정적인 값을 생성할 때도 compositionLocalOf를 남발하면 안된다.
compositionLocalOf는 값이 사용될 때마다 어디서 읽혔는지 추적하기 때문에 약간의 오버헤드가 발생할 수 있기 때문이다.

반대로 staticCompositionLocalOf는 어디서 읽히는 지 추적을 안하기 때문에 오버헤드가 없다.

그래서 가장 중요한 건 값이 바뀌는지 안바뀌는지 스스로 판단하고
compositionLocalOf를 쓸지 staticCompositionLocalOf를 쓸지
잘 판단해서 사용하는 것이다


결론

프로젝트를 할 때 상태 호이스팅을 유지할려다보니 파라미터 지옥에 빠지게 되었는데
compositionLocal을 잘 활용하다보니 코드가 점점 개선되는 게 눈으로 보였다.

profile
어제보다 나은 개발자가 되자

0개의 댓글