피드로 돌아가기
Dev.toMobile
원문 읽기
타입 삭제 구간에서도 안전한 타입 복구, Kotlin Generic 설계 전략
Self-Referential Generics in Kotlin: When Type Safety Requires Talking to Yourself
AI 요약
Context
ViewModel과 Domain 계층 사이의 타입 경계에서 타입 정보 소실 발생. 공통 ResultState 채널 사용으로 인해 개별 UseCase의 출력 타입이 erased 상태로 전달됨. 런타임 타입 불일치 위험을 제거하고 컴파일 시점의 타입 안전성 확보가 필요함.
Technical Solution
- BaseViewModel에 자체 상태 모델 M을 바인딩하는 self-referential generic 구조 설계
- UseCase의 출력 타입을 보존하기 위해 reified type parameter를 활용한 inline 확장 함수 구현
- ResultState.Complete의 공변성(covariant)과 UseCase의 반공변성(contravariant)을 이용한 데이터 흐름 최적화
- collectUseCase 함수 내에서 reified 타입을 통해 런타임에 실제 타입을 검증하고 안전하게 캐스팅하는 가드 로직 배치
- crossinline 제약 조건을 통해 람다 캡처 시 발생할 수 있는 사이드 이펙트를 방지하고 실행 컨텍스트 최적화
- 타입 삭제가 불가피한 공통 채널 환경에서 명시적 타입 선언을 강제하는 수집 메커니즘 구축
Key Takeaway
타입 삭제가 발생하는 아키텍처 경계에서 reified generic과 self-referential 구조를 결합하면 런타임 안전성과 개발자 경험을 동시에 확보 가능함. 이는 단순한 관례를 넘어 코드 수준에서 강제되는 구조적 제약 조건을 통해 협업 리스크를 줄이는 설계 방식임.
실천 포인트
다수의 개발자가 참여하는 대규모 프로젝트에서 공통 상태 채널을 사용할 때, reified generic 기반의 타입 가드 함수를 도입하여 런타임 타입 오류를 원천 차단할 것