Android Jetpack은 API가 아니다 기술 이야기 2020. 5. 11. 00:11

많은 사람들이 안드로이드 API처럼 사용하고 있는 Jetpack은 API가 아니다. Android Jetpack은 품질이 좋은 Application를 만들 수 있게 도와주는 라이브러리와 개발 도구이다. 사실 별로 중요한 것은 아니다. 개발자는 그냥 쓰면 된다.ㅋ 그냥 쓰면 될 수 있게 만들어 놓은 그 이유에 대해서 생각해 보았다.

https://www.turbosquid.com/ko/3d-models/jetpack-jet-pack-02-model-1197803

API란 무엇인가

API는 Application Programming Interface의 약자로 Application 개발자들이 특정 기능을 쉽게 구현할 수 있도록 사용하는 외부 모듈과의 연결 고리이다. 인터페이스!

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다. -위키백과

위키백과에서는 운영체제나 프로그래밍 언어가 제공하는 기능이라고 명시되어 있는데, 꼭 그렇게 제한되는 것은 아니다. 서버에서 제공하는 REST API 같은 것도 있고, Library 형태로 제공되는 API도 있다. 중요한 것은 외부 모듈와의 인터페이스라는 점이다.

안드로이드 API

API는 윈도우 이전부터 있었지만, 아이폰으로부터 촉발된 앱 개발 생태계에서 API는 유명세를 떨치게 되었다. 애플이 앱 스토어를 만들고, 앱 개발자들과 이익을 공유하기 이전에 SW의 가치는 B2B 시장이 중심이었고, 상업용 SW가 대부분이었다. 즉, 게임을 제외하고는 생산 활동을 하기 위한 SW가 대부분이었다. 앱 스토어가 아이폰과 함께 등장했지만, 사람들은 아이폰의 수려한 터치스크린 UI에 더 관심을 갖았다. 한 동안 바탕화면의 아이콘을 좌우로 빨리 흔들었을 때 얼마나 부드럽게 움직이는지 감탄하며 찬양하기에 바빴다. 하지만 진짜 주인공은 앱 스토어였다.

https://editoy.com/posts/5120

그 무렵, 우리 회사에서 당당하게 아이폰을 산 선배가 매일 찬양과 경배를 늘어놓았다. 앱 스토어의 다양한 앱들은 날마다 큰 줄거움과 영감을 준다고, 앱을 구매하기 위해 2~3천원은 커피 한잔 가격 정도라고 했다. 그 뒤로 수년간 폭팔적으로 모바일 앱 생태계가 성장했다. 앱을 만들어서 돈을 많이 번 개인 개발자도 많이 나왔다. 그 생태계를 키워낸 바탕에 API가 있다. 다양하고, 사용하기 쉬운 API를 플랫폼에서 제공하고, 앱 개발자는 그 API를 사용해서 혁신적인 앱들을 뚝딱 뚝딱 만들어 낼 수 있었기 때문이다.

안드로이드 플랫폼에서 제공되는 API는 계속 추가 되었고, 개선되었는데, 플랫폼 버전이 증가해도 이전 버전에서 개발된 앱들이 정상 동작하는 것을 보장하기 때문에 앱 개발자들은 새로운 플랫폼이 출시되어도 앱을 새로 만들 필요가 없었다. 이것이 바로 하위 호환성이다.

Jetpack과 하위 호환성

문제는 새로 나온 API를 낮은 버전에서는 사용할 수 없다는 것이다. 구글에서는 이런 문제를 해결해주기 위해서 Support Library라는 것을 만들어 주었다. 이 라이브러리를 사용하면 이전 버전의 플랫폼에서도 새로 출시된 API를 사용하는 것처럼 앱을 개발 할 수 있다. Support Library는 이후 Jetpack으로 개선, 통합되어 출시되었다.

https://www.lifewire.com/can-your-ps3-play-ps2-games-2717135

물론, 새로 출시된 플랫폼 버전을 사용하면 라이브러리 추가 없이도 새로운 API도 사용할 수 있지만 그렇게되면 이미 시장에 출시된 기기들에서는 그 앱을 사용 할 수가 없다. 따라서 대부분의 개발자들은 가능하면 낮은 버전으로 개발을 하길 원한다. 최대한 많은 기기를 지원하길 원하므로!

API와 라이브러리의 차이

API는 사실 라이브러리다. 그리고 다른 라이브러리도 API를 갖고 있다. 잉? 몬소리지??ㅎㅎ

설명을 해보자면, 흔히 말하는 API는 앞서 말할 것처럼 플랫폼 API를 뜻한다. 플랫폼 API도 인터페이스 일뿐 그 기능을 구현한 구현체가 존재한다. API의 구현체는 라이브러리 형태로 구현되어서 플랫폼에 기본 탑재되어서 출시된다. 따라서 흔히 말하는 API가 있냐 없냐라고 표현하는 것은 그 API를 제공하는 라이브러리가 탑재되어 있는지를 뜻하는 것이다.

플랫폼 API가 아닌 경우, 라이브러리를 다운 받아서 사용하기도 한다. 해당 라이브러리는 어플리케이션 개발자들이 사용할 수 있는 인터페이스를 제공한다. 인터페이스! 바로 그것이 API다. 따라서 일반 라이브러리도 API를 갖고 있다고 할 수 있다.

https://www.oss.kr/info_techtip/show/a9320d1b-08c9-49f7-b53a-f598237064e0?page=8

이런 혼란이 생기는 이유는 API를 플랫폼에 탑재되어 있는 라이브러리와 동일시하고, 기 구현된 기능등으로 칭하는 경우가 많기 때문이다. 어째든, 정리해보면 API는 그저 인터페이스이며, 흔히 말하는 API는 플랫폼 API로 플랫폼에서 제공하는 라이브러리의 인터페이스, 그리고 외부 라이브러리도 앱 개발자를 위한 인터페이스로 API가 있다.

왜 Jetpack으로? Package Dependency or Platform Dependency

별거 아닌데, 되게 길게 적어놓은 것 같다. 왜 Jetpack이 활성화되는지 생각해봤다고 시작했는데, 위에서 어느정도 설명은 다 된 것 같다.

플랫폼 API는 플랫폼에 기본 탑재되어 출시된다. 어플리케이션에서는 별도로 해당 API의 라이브러리(구현체)를 가지고 있지 않아도 된다. 이미 설치되어 있으니! 반면, Jetpack과 같은 라이브러리는 앱 패키지에 포함 되어서 앱이 설치될 때 함께 설치 되어야 한다. 기본 탑재 되어 있는 것이 아니니까!

Jetpack의 장점은 빠른 수정이 가능하고, 필요에 따라서 취사 선택이 가능하다. 플랫폼 API 라이브러리는 구현된 모든 모듈이 기본 탑재되고, 하위 호환성도 보장해야 하기 때문에 개발 후 배포까지 시간이 오래걸린다. 작은 문제를 수정 한다고 해서 모든 단말에 수정 버전을 설치 한다는 것은 사실상 불가능하기 때문에, 오류가 있어도 수정이 어렵고, 개선해도 적용되는데 시간이 오래걸린다. 반면 Jetpack은 개발자가 패키지를 직접 설치하는 방식이기에 수정이 잦고 빠르다. API도 하위 호환성을 보장할 필요가 없기 때문에 막 바뀐다. 출시 노트를 보면 API가 자주 변경되는 것을 확인 할 수 있다.

https://developer.android.com/jetpack/androidx/releases/navigation

여기서 오해의 소지가 있을 수 있는데, Jetpack이 플랫폼 API의 하위 호환성을 위해서 제공되지만, Jetpack 자체는 하위 호환성을 제공하지 않는다! Jetpack은 버전마다 API가 변경될 수 있다. 이렇게 변경되어도 문제가 안되는 것이 그 버전을 사용하는 사람이 API를 확인하고 잘 사용하면 되기 때문이다. 플랫폼 API를 사전에 정해진 규격이 지켜져야 하기 때문에 변경이 어렵다. 즉, Jetpack은 패키지 버전에 따라 API가 다르고, 플랫폼 API는 플랫폼 버전에 따라 API가 다르다!

단점은 어플리케이션이 Jetpack 라이브러리를 포함해야 하므로, 패키지 사이즈가 증가 할 수 있다는 것이 있다. 또한, 여러 버전에 걸쳐 Jetpack API가 변경되면 사용자들은 자신이 사용하는 버전에 맞는 사용법을 이해하고 사용해야 하므로 혼란을 가져 올 수 있는 단점도 있다.

패키지마다 지원하는 버전이 다른데, 그걸 다운받기 전에 확인하기 어려우니, 아에 그걸 정리해둔 사이트까지 생겼다.AndroidX Tech

마치며

Jetpack은 안드로이드의 개발자 생태계가 숙성되면서 어쩔 수 없는 대안으로 제공되고 있는 형국이다. 더욱 쉽게 품질 좋은 앱을 개발할 수 있게 해준다는 감언이설을 앞세우고 있지만, 사실은 지금 형국에서 새로운 API의 기능을 지원하면서도 앱의 품질을 유지 할 수 있는 별다른 방법이 없기 때문에 활성화 되고 있는 것이다. 하지만, 이렇게 계속 커지고 파편화되면서도 혼란 없이 생태계를 유지 할 수 있을 지는 좀 더 지켜봐야 할 것 같다.

Jetpack의 Platform API 의존성은 정해져 있지 않습니다.

Component의 버전 마다 다를 수 있고, 모듈 마다 다를 수 있다. 즉, 25.0.0 버전의 min API Level이 7이고, 26.0.0 버전의 min API Level은 14일 수 있다.

androidx.browser:browser:1.0.0 은 min api level 15 이고,

https://androidx.tech/artifacts/browser/browser/1.0.0

androidx.navigation:navigation-common:2.2.0 은 min api level 14 이다. https://androidx.tech/artifacts/navigation/navigation-common/2.2.0

주의: 지원 라이브러리 버전 26.0.0(2017년 7월)부터 대부분의 라이브러리 패키지를 대상으로 대부분의 지원 라이브러리가 지원하는 최소 API 레벨은 Android 4.0(API 레벨 14)으로 증가했습니다. 자세한 정보는 이 문서의 버전 지원 및 패키지 이름을 참조하세요. https://developer.android.com/topic/libraries/support-library