모바일 개발 · 심화
Combine 프레임워크를 사용하여 실시간 데이터 스트림(예: 웹소켓)을 처리할 때, 백프레셔(Backpressure) 문제를 어떻게 해결할 것이며, 스트림 중간에 발생하는 다양한 종류의 에러를 효과적으로 처리하고 복구하는 전략에 대해 설명하시오.
힌트 · Subscriber의 demand 요청을 통해 백프레셔를 제어하고, catch, replaceError, retry 등의 연산자를 활용하여 에러를 복구하거나 적절히 처리합니다.
PublisherSubscriberBackpressureError HandlingRetry
모범답안
Combine 프레임워크에서 실시간 데이터 스트림을 처리할 때 백프레셔와 에러 처리는 중요한 부분입니다.
백프레셔는 Subscriber가 Publisher에게 demand를 요청하는 방식으로 해결합니다. 즉, Subscriber가 처리할 수 있는 만큼만 데이터를 요청하여 Publisher가 과도하게 데이터를 보내는 것을 방지합니다. receive(subscription:)에서 request(.max(n))을 통해 조절할 수 있습니다.
에러 처리는 catch, replaceError, retry와 같은 연산자를 활용합니다. catch는 에러를 잡아서 대체 Publisher를 제공하고, replaceError는 에러를 특정 값으로 대체합니다. retry는 에러 발생 시 스트림을 재시도하여 일시적인 문제 해결에 유용합니다. 예를 들어, 웹소켓 연결이 끊어졌을 때 retry를 사용하여 재연결을 시도할 수 있습니다. 또한, 에러 로깅 및 사용자에게 적절한 피드백을 제공하는 것도 중요합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 iOS / Swift 면접 질문
- 복잡한 커스텀 UICollectionView 또는 UITableView에서 셀 스크롤 성능 저하가 발생했을 때, 이를 진단하고 최적화하기 위한 고급 기법들을 설명하시오. 특히 오프스크린 렌더링, 레이아웃 계산, 이미지 로딩 관점에서 접근하시오.
- 현재 유지보수 중인 대규모 레거시 MVVM 기반 iOS 앱의 특정 모듈을 Clean Architecture 또는 Composable Architecture로 점진적으로 전환해야 하는 상황입니다. 기존 아키텍처와의 충돌을 최소화하면서 안전하게 마이그레이션하는 전략과 고려사항은 무엇입니까?
- SwiftUI에서 ViewBuilder를 활용하여 고도로 재사용 가능한 커스텀 컨테이너 뷰를 설계하고, 이 컨테이너 뷰 내부의 자식 뷰들이 불필요하게 업데이트되는 것을 방지하기 위한 성능 최적화 기법을 설명하시오. Preference Key와 GeometryReader의 활용 방안을 포함하여 설명하시오.
- 대규모 iOS 프로젝트에서 모듈화(Modularization)를 적용하여 빌드 시간을 단축하고 팀 협업 효율성을 높이고자 할 때, 모듈 간의 의존성 관리 전략과 모듈 분리 기준, 그리고 Xcode 빌드 시스템 관점에서 고려해야 할 최적화 방안은 무엇입니까?