안드로이드 라이브러리 선택 문서(https://developer.android.com/topic/performance/app-optimization/choose-libraries-wisely?hl=ko)를 보면서 Reflection? Code Generation? 이런 용어가 나오길래 개념 정리가 필요한거 같아 여기에 정리해본다.
안드로이드 라이브러리 (Android Libraries)
│
├── 1. 일반 라이브러리 (Static / Executable)
│ │ - 빌드 시점에 코드를 새로 생성하지 않고, 미리 완성된 클래스/메서드를 직접 호출
│ │
│ ├── 네트워크 통신 (HTTP Client)
│ │ └── OkHttp, Ktor Client
│ │
│ └── 이미지 로딩 (Image Loading)
│ └── Glide, Coil, Picasso
│
└── 2. 메타데이터 기반 라이브러리 (Metadata-driven)
│ - 어노테이션(@) 등을 읽어 보일러플레이트 코드를 대신 처리
│
├── 🅰️ 리플렉션 기반 (Reflection-based)
│ │ - 런타임(앱 실행 중)에 클래스 구조를 탐색하여 동작
│ │ - ⚠️ 특징: 성능/배터리 영향, 초기 로딩 지연, 컴파일 타임 에러 감지 불가
│ │
│ ├── JSON 직렬화 (JSON Parsers)
│ │ ├── Gson
│ │ └── Jackson (기본 설정)
│ │
│ └── 이벤트 버스 (Event Bus)
│ └── EventBus (초기 버전)
│
└── 🅱️ 코드 생성 기반 (Code Generation-based) 🌟 [권장]
│ - 컴파일 타임(앱 빌드 중)에 KSP / Compiler Plugin으로 맞춤형 코드 파일 생성
│ - ✨ 특징: 압도적인 런타임 속도, 컴파일 시점 에러 감지, R8/ProGuard 안전
│
├── JSON 직렬화 (JSON Parsers)
│ ├── Moshi (Codegen / KSP)
│ └── Kotlinx.Serialization (Kotlin Compiler Plugin)
│
├── 데이터베이스 (Database / ORM)
│ └── Room (KSP)
│
├── 의존성 주입 (Dependency Injection)
│ ├── Hilt (KSP / Gradle Plugin)
│ └── Dagger2 (KAPT / KSP)
│
├── UI & 뷰 바인딩 (UI / View Binding)
│ ├── ViewBinding
│ └── DataBinding
│
└── 네트워크 인터페이스 (REST Client)
└── Retrofit (인터페이스를 분석해 런타임 프록시 및 코드 연결)```
일반적으로 생각하는 라이브러리는 만들어진 코드를 사용하기만 하면 되는데, 리플렉션이나 코드생성기반 라이브러리는 런타임이나 컴파일 시점에 동작하는 이유가 뭐지?
그 이유는 라이브러리 개발자는 '내가 만들 앱의 코드(개발자가 작성한 클래스, 변수, 어노테이션)'가 무엇인지 미리 알 수 없기 때문임.
내가 만들 클래스나 SQL문을 라이브러리 개발자가 어떻게 아는가?
개발자가 모든 코드를 작성하고난 후 빌드 시점에 소스파일이 생성되거나 런타임에 코드를 읽고 필요한 동작이 수행됨.
Java/Kotlin 환경에서 컴파일 타임에 어노테이션을 읽어 코드를 생성해 주던 대표적인 빌드 도구입니다. (현재는 속도 문제로 KSP로 대체되는 추세)
구글과 젯브레인(Jetbrains)이 만든 Kotlin 전용 차세대 코드 생성 도구입니다.
KAPT 대비 분석 및 코드 생성 속도가 훨씬 빠르며, 최신 안드로이드 라이브러리(Room, Moshi 등)의 표준으로 자리 잡았습니다.