본문 바로가기
MJU Session (22-23)

[Session] Android Jetpack Compose / 김병대

by byungmeo 2023. 1. 29.

작성자 : 김병대


Android Jetpack Compose

 

- 안드로이드의 새로운 네이티브 UI 빌드 툴

Compose는 2021년 7월에 정식으로 출시되었으며, 안드로이드 네이티브 UI를 빌드하기 위한 최신 권장 도구 키트입니다.

Kotlin 언어로만 사용이 가능하며 기존 XML 방식 (View System)을 대체합니다.

Kotlin 코드 만으로 화면을 개발할 수 있다는 것이 가장 큰 차이점 입니다!

 

- Compose의 장점

"적은 코드, 빠르고 쉬운 개발"

기존 XML 개발 방식 (과장된 예시입니다...)
Compose 개발 방식 (현실과 다를 수 있습니다..)

기존에는 하나의 화면을 구성하는 Activity, Fragment, Menu 등의 레이아웃을 XML 언어로 정의하여 .XML 파일로 저장하고 자바 또는 코틀린 코드 파일 상에서는 필요하다면 XML에서 정의된 View를 findViewById 등의 함수를 이용하여 불러온 후 Setter 등을 사용하여 제어하였습니다.

이 방식은 프로젝트를 구성하는 파일이 많아서 이를 연결하고 사용하는 것이 복잡하고, 많이 어렵지는 않지만 XML 이라는 언어를 어느정도 알아야 한다는 단점이 있었습니다. 따라서 많은 화면이 존재하는 앱을 하나 개발하기 위해서는 경우에 따라 위 사진과 같이 많은 xml 파일을 주렁주렁 달고 다녀야 했습니다.

 

하지만 Compose 에서는 단순한 예시로 위와 같이 .kt 파일 하나로만 여러 개의 화면을 만들 수 있습니다. 개인적으로도 코드 파일을 이리저리 옮겨 다니면서 개발을 하는 것도 힘든데 xml 파일까지도 들락날락 하는 것이 정말 불편했습니다.

 

이것이 끝이 아닙니다. Compose에서 가장 중점으로 하는 것은 바로 "개발 생산성의 향상" 입니다.

Compose는 함수형 프로그래밍 방식으로 개발하는데, 모든 것이 함수입니다. 화면 하나가 단 하나의 함수에 담길 수도 있고, 모든 요소 하나하나가 함수로 각각 만들어질 수도 있습니다.

이러한 함수형 프로그래밍 방식의 도입으로 재사용성이 굉장히 높아져 기존의 XML 방식과 비교하여 상용구 (보일러 플레이트) 코드를  줄일 수  있습니다.

간단한 예시로 기존에는 여러 화면에 동일한 버튼이나 이미지 등이 필요하다면 모든 XML 파일에 해당 구성 요소를 정의한 후 코드 파일에서 각각 관리해 주어야 했습니다. 하지만, Compose에서는 이러한 공통된 구성 요소는 모두 하나의 함수로 정의되어 해당 구성 요소에 변경 사항이 생기더라도 쉽게 변경할 수 있습니다.

 

이외에도 개발 생산성을 향상시키는 다양한 특징들이 존재하고 앱의 빌드 시간이나 용량을 줄이는 효과도 있습니다. 어쨋거나 지금까지 Compose를 도입한 경험자들에 의하면 작성해야 하는 코드 수가 줄어들고 개발 속도도 유의미하게 향상되었다고 하니 Compose를 도입하지 않을 이유가 없겠죠??

 

- 여전히 Compose로 쉽게 전환하지 못하는 이유?

지금까지의 말만 들어보면 더 이상 안드로이드 개발자가 XML 방식에 머물 이유가 없어 보입니다. 하지만 그럼에도 여전히 많은 개발자가 안드로이드에서 권장하는 Compose 방식으로 쉽게 전환하지 못하는 이유는 무엇일까요?

개인적으로 Compose에 관심이 있는데 아직까지 제대로 배워볼지 고민되어 이 부분에 대해 깊이 생각해보았습니다!

 

출처 : https://fornewid.medium.com/migrating-from-xml-to-compose-f3e18e179369

첫 번째로 기존 안드로이드 프로젝트를 Compose로 마이그레이션 하기 귀찮아서가 아닐까 생각합니다.

사실 Compose는 기존의 View System(XML 방식)과 완벽하게 상호 운용이 가능하도록 설계되었습니다. 기존의 View System에 Compose Component를 추가할 수 있으며 반대의 경우도 가능합니다.

쉽게 말해 혼용이 가능하기 때문에 기존의 프로젝트에서 천천히 한 화면씩, 한 부분씩 마이그레이션이 가능합니다.

하지만 개발자의 입장에서 생각해보면 그다지 달갑지 않은 소리일 수도 있습니다. 하나의 화면을 Compose로 전환한다면 그 화면을 유지보수 할 수 있는 것은 Compose를 배운 개발자 뿐일 것입니다. 기존에 XML 방식으로 잘 개발하던 개발자들이 굳이 Compose라는 것을 또 다시 배우기란 쉽지 않으며 새롭게 들어오는 신입 개발자들도 Compose를 전혀 모를 가능성이 높은 것도 큰 이유가 될 수 있겠네요.

 

이거.. 쉬운거 맞죠..? (물론 적응하면 볼만합니다..)

두 번째는 기존 XML 방식과 비교해 개발하는 방식이 너무 다르기 때문이라고 생각합니다.

안드로이드에서는 Compose로 코드를 작성하는게 더 쉽다고 주장(?) 합니다. 저는 이 부분이 사람마다 편차가 있다고 생각합니다.

XML 방식은 명령형, Compose는 선언형이라는 차이점이 있습니다.

제가 처음 Flutter라는 프레임워크를 잠시 구경하였을 때 Dart 라는 생소한 언어에 놀란 것도 있지만 가장 크게 저를 당황하게 만든 것은 바로 함수형 프로그래밍 입니다. 개인적인 생각으로 괄호를 치는 타이밍이라던가 많은 부분들이 기존의 전통적인 코딩 스타일과 많은 차이점이 있다고 느꼈는데 기존에 C 계열 언어나 Java로만 개발을 하던 저로써는 너무나도 생소한 방식이었습니다. (람다를 너무 많이 써요.. 적당하면 너무 좋던데 이건 심했습니다)

Compose를 처음 접할 때 느꼇던 감정은 Flutter와 비슷했습니다. (지금도 솔직히 이 점은 마음에 안듭니다..!)어찌 되었든 이러한 이유로 거부감을 느끼는 개발자도 분명 있을 거라고 생각합니다!

 

마지막으로 지금 당장 크게 Compose를 도입해야 할 동기가 부족해서 라고 생각합니다.
물론 Compose는 앱의 빌드 시간과 용량을 유의미하게 감소시켜주는 장점이 있습니다. 하지만 지금 당장 Compose를 도입해야 한다! 라고 할 정도로 비약적으로 감소하지는 않은 것으로 보입니다.또한 실제 앱 구동 시 성능 상으로는 XML 방식과 크게 차이가 없다는 점입니다. 심지어는

특정 환경을 제외하곤 XML 방식이 성능 상으로는 조금 더 우세한 것으로 조사된 자료가 있습니다. (작동 방식이 애초에 다르기 때문입니다)

물론 이는 Compose가 발전하면서 더욱 더 개선될 예정이지만, 지금 현재로써는 당장 Compose를 도입하면서 생기는 리스크를 감수하면서 까지  전환할 메리트가 없다는 것이 큰 이유인 것 같습니다.

Compose가 정식 버전으로 출시한지 아직 2년도 안되었습니다. 지금까지도 많은 변화가 일어났고, 앞으로도 그렇지 않을 것이란 보장은 없습니다. 이러한 이유 탓에 개발자 문서가 여전히 최신화 되어 있지 않은 경우도 많았고 개발자 커뮤니티도 아직 많이 활성화 되지 않아 자료를 검색하기도 어려웠던 기억이 납니다. 이것이 그나마 있던 동기들도 희미하게 만드는 중요한 요소라고 생각합니다.. (신기술의 어쩔 수 없는 딜레마?)

 

- 마무리

제가 Compose를 처음 접한지도 어느덧 3개월이 다 되갑니다.

 

저는 사실 언젠가 있을 프로젝트에서 팀원과의 개발 환경을 통일 하는 것이 좋을 것 같다는 핑계로 현재 Compose 공부를 중단하였지만 이 글을 작성하면서 Compose에 대해 더 깊이 알게 되었습니다.

 

저는 구글이 나중에는 Kotlin 처럼 XML을 밀어내고 Compose를 표준으로 지정하게 될 날이 올지 또는 어디까지나 선택적으로 사용할 수 있는 도구로써만 다룰지는 알 수 없지만 Compose는 충분히 배우고 적용할 만한 가치가 있다고 생각됩니다.

 

또한 XML 방식으로 개발하면서 느꼇던 몇 가지 불편함들이 (동적인 컴포넌트 제어 등) Compose를 통해 쉽고 빠르게 개발할 수 있을 것 같다는 생각이 들었기 때문에 Compose가 좀 더 안정화된다면 시간을 투자해 꼭 공부해 보고 싶다는 생각이 들었습니다.

 

만약 평소에 안드로이드 앱 개발에 관심이 있으셨던 분이라면 첫 시작은 Compose로 하는 것이 어떨까요?

 

- 참고

https://developer.android.com/jetpack/compose?hl=ko

 

https://medium.com/okcredit/comparing-jetpack-compose-performance-with-xml-9462a1282c6b

https://readystory.tistory.com/211