[{"id":"LIFE-001","type":"short","category":"app-lifecycle","difficulty":1,"topic":"앱 상태와 전이","tags":["app-state","lifecycle","background","suspended","inactive"],"question":"사용자가 앱을 쓰다가 전화를 받고, 통화를 끊은 뒤 홈으로 나갔다가 30분 뒤 다시 들어왔습니다. 이 동안 앱은 어떤 상태들을 거치나요?","source":{"kind":"community"}},{"id":"LIFE-002","type":"mcq","category":"app-lifecycle","difficulty":1,"topic":"Inactive 상태","tags":["app-state","inactive","lifecycle"],"question":"앱이 **Inactive** 상태가 되는 상황을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"LIFE-003","type":"short","category":"app-lifecycle","difficulty":1,"topic":"AppDelegate의 역할","tags":["appdelegate","uiapplicationdelegate","launch","lifecycle"],"question":"`AppDelegate`는 어떤 객체이고 어떤 이벤트를 다루나요?","source":{"kind":"community"}},{"id":"LIFE-004","type":"short","category":"app-lifecycle","difficulty":2,"topic":"SceneDelegate 도입 배경","tags":["scenedelegate","uiscene","multi-window","ipad","lifecycle"],"question":"iPad에서 같은 앱을 두 창으로 띄우는 기능 요청이 왔습니다. `SceneDelegate`는 왜 도입됐나요?","source":{"kind":"community"}},{"id":"LIFE-005","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"씬 기반 앱의 콜백","tags":["scenedelegate","appdelegate","lifecycle","callback"],"question":"iOS 13+ 씬 기반(SceneDelegate 사용) UIKit 앱이 백그라운드에서 포그라운드로 돌아올 때 호출되는 콜백은?","source":{"kind":"community"}},{"id":"LIFE-006","type":"short","category":"app-lifecycle","difficulty":2,"topic":"백그라운드 실행 제약","tags":["background","beginbackgroundtask","suspended","background-modes"],"question":"사용자가 저장 버튼을 누르고 바로 홈으로 나가면 서버 저장이 안 된다는 리포트가 있습니다. 이 문제를 어떻게 해결하겠습니까?","source":{"kind":"community"}},{"id":"LIFE-007","type":"mcq","category":"app-lifecycle","difficulty":1,"topic":"앱 진입점과 UIApplicationMain","tags":["main","uiapplicationmain","launch","runloop"],"question":"`@main` 이 붙은 AppDelegate(또는 `UIApplicationMain` 호출)가 앱 실행 시 하는 일을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"LIFE-008","type":"short","category":"app-lifecycle","difficulty":2,"topic":"앱 번들과 App Thinning","tags":["app-bundle","app-thinning","slicing","on-demand-resources","app-size"],"question":"App Store에 표시된 다운로드 크기가 Xcode 아카이브 크기보다 훨씬 작습니다. App Thinning이 어떻게 크기를 줄이기에 그런가요?","source":{"kind":"community"}},{"id":"LIFE-009","type":"short","category":"app-lifecycle","difficulty":2,"topic":"푸시 알림 흐름","tags":["push-notification","apns","device-token","fcm","unusernotificationcenter"],"question":"원격 푸시 한 건이 사용자 기기에 도착하기까지의 전체 흐름은 어떻게 되나요? 앱·APNs·서버 관점에서 설명해 주세요.","source":{"kind":"community"}},{"id":"LIFE-010","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"포그라운드 알림 표시","tags":["local-notification","unusernotificationcenter","willpresent"],"question":"앱이 포그라운드에 있을 때도 로컬/원격 알림 배너를 화면에 보이게 하려면 어떻게 해야 하나요?","source":{"kind":"community"}},{"id":"LIFE-011","type":"short","category":"app-lifecycle","difficulty":2,"topic":"Deep Link와 Universal Link","tags":["deep-link","universal-link","url-scheme","associated-domains","aasa"],"question":"마케팅팀이 문자로 상품 링크를 보내는데 앱이 설치된 사용자는 앱으로, 아닌 사용자는 웹으로 가게 해 달라고 합니다. 이 요구를 만족하려면 무엇을 어떻게 구성하겠습니까?","source":{"kind":"community"}},{"id":"LIFE-012","type":"mcq","category":"app-lifecycle","difficulty":3,"topic":"Universal Link 동작 조건","tags":["universal-link","aasa","associated-domains"],"question":"Universal Link에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"LIFE-013","type":"short","category":"app-lifecycle","difficulty":3,"topic":"샌드박스와 앱 간 데이터 공유","tags":["sandbox","app-group","keychain-sharing","extension","pasteboard"],"question":"메인 앱·위젯·Share Extension이 같은 로그인 세션과 캐시 DB를 써야 합니다. 같은 팀의 앱·익스텐션 사이에 데이터를 어떻게 공유하겠습니까?","source":{"kind":"community"}},{"id":"LIFE-014","type":"short","category":"app-lifecycle","difficulty":3,"topic":"WidgetKit 타임라인과 App Intents","tags":["widgetkit","timeline","app-intents","shortcuts","siri"],"question":"홈 화면 위젯이 '실시간으로 안 바뀐다'는 불만을 받았습니다. WidgetKit은 갱신을 어떻게 다루나요?","source":{"kind":"community"},"since":"iOS 16"},{"id":"LIFE-015","type":"mcq","category":"app-lifecycle","difficulty":1,"topic":"시뮬레이터의 한계","tags":["simulator","device-testing","xcode"],"question":"iOS 시뮬레이터에서 **할 수 없거나 신뢰할 수 없는** 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"LIFE-016","type":"short","category":"app-lifecycle","difficulty":3,"topic":"BGTaskScheduler","tags":["bgtaskscheduler","bgapprefreshtask","bgprocessingtask","background"],"question":"\"매일 밤 사용자가 자는 동안 캐시를 비우고 새 콘텐츠를 미리 받아 두자\"는 요구가 있습니다. 이런 주기 작업을 iOS에서 어떻게 등록하겠습니까?","source":{"kind":"original"},"since":"iOS 13"},{"id":"LIFE-017","type":"mcq","category":"app-lifecycle","difficulty":3,"topic":"BGAppRefreshTask 특성","tags":["bgtaskscheduler","bgapprefreshtask","background"],"question":"`BGAppRefreshTask`에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 13"},{"id":"LIFE-018","type":"short","category":"app-lifecycle","difficulty":4,"topic":"무음 푸시의 신뢰성","tags":["silent-push","content-available","background","apns","throttling"],"question":"채팅 앱이 '새 메시지 무음 푸시(content-available)로 앱을 깨워 미리 동기화'하도록 설계돼 있는데, 실제로는 절반 이상 도착하지 않거나 늦게 온다는 데이터가 있습니다. 왜 그런가요?","source":{"kind":"original"}},{"id":"LIFE-019","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"알림 권한 옵션","tags":["notification-permission","provisional","requestauthorization"],"question":"사용자에게 권한 팝업을 띄우지 않고, 알림을 '조용히' 알림 센터에만 쌓아 두었다가 사용자가 나중에 계속 받을지 결정하게 하려면 어떤 옵션을 요청해야 하나요?","source":{"kind":"original"}},{"id":"LIFE-020","type":"short","category":"app-lifecycle","difficulty":2,"topic":"저전력 모드와 발열 상태 대응","tags":["low-power-mode","thermal-state","processinfo","battery","energy"],"question":"사용자가 저전력 모드를 켜거나 기기가 뜨거워졌을 때 앱은 그 사실을 어떻게 알 수 있나요?","source":{"kind":"original"},"since":"iOS 11"},{"id":"LIFE-021","type":"short","category":"app-lifecycle","difficulty":3,"topic":"권한 요청 설계","tags":["permissions","privacy","info-plist","att","camera","location"],"question":"카메라 권한 거부율이 60%라는 지표가 나왔습니다. 거부율을 낮추면서 심사 가이드라인을 지키려면 어떻게 설계하겠습니까?","source":{"kind":"original"}},{"id":"LIFE-022","type":"short","category":"app-lifecycle","difficulty":4,"topic":"종료와 상태 복원","tags":["termination","state-restoration","nsuseractivity","prewarming","snapshot"],"question":"사용자가 긴 글을 쓰다 다른 앱에 다녀오면 가끔 작성 중이던 내용이 사라진다는 불만이 있습니다. 왜 생기나요?","source":{"kind":"original"},"since":"iOS 15"},{"id":"LIFE-023","type":"short","category":"app-lifecycle","difficulty":4,"topic":"App Extension 제약","tags":["app-extension","share-extension","memory-limit","process","app-group"],"question":"Share Extension으로 큰 사진을 받아 서버에 올리는 기능이 '가끔 조용히 종료'됩니다. App Extension은 메인 앱과 무엇이 다르기에 그런가요?","source":{"kind":"original"}},{"id":"LIFE-024","type":"mcq","category":"app-lifecycle","difficulty":4,"topic":"Notification Service Extension","tags":["notification-service-extension","mutable-content","push","e2ee"],"question":"Notification Service Extension(NSE)에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 10"},{"id":"LIFE-025","type":"short","category":"app-lifecycle","difficulty":3,"topic":"실행 옵션과 콜드 스타트 라우팅","tags":["launch-options","connectionoptions","deep-link","push-tap","cold-start"],"question":"앱이 꺼진 상태에서 푸시를 탭하면 해당 채팅방으로 가야 하는데, 가끔 홈 화면에서 멈추거나 로그인 화면 뒤에 채팅방이 뜨는 버그가 있습니다. 콜드 스타트에서 라우팅을 어떻게 설계해야 하나요?","source":{"kind":"original"}},{"id":"LIFE-026","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"UIBackgroundModes","tags":["background-modes","remote-notification","info-plist","silent-push"],"question":"무음 푸시(`content-available: 1`)로 앱을 백그라운드에서 깨워 데이터를 받게 하려면 Info.plist의 `UIBackgroundModes`에 무엇이 필요한가요?","source":{"kind":"original"}},{"id":"LIFE-027","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"Background→Suspended 전이","tags":["app-state","suspended","background-task","termination"],"question":"앱이 Background 상태에서 Suspended 상태로 넘어가는 순간에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Samsung"}},{"id":"LIFE-028","type":"short","category":"app-lifecycle","difficulty":2,"topic":"알림 권한 안내 화면과 UNUserNotificationCenter 흐름","tags":["push-notification","permission","unusernotificationcenter","delegate","view-lifecycle"],"question":"매니저 라운드 과제로 \"시스템 팝업 전에 우리만의 알림 권한 안내 화면을 먼저 띄우는 기능\" 을 만든 뒤 질문을 받았습니다. 권한 상태(`notDetermined`·`denied`·`authorized`·`provisional`)별로 앱은 무엇을 해야 하나요?","source":{"kind":"company","company":"Swiggy"},"since":"iOS 15.4"},{"id":"LIFE-029","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"APNs 디바이스 토큰 처리","tags":["push-notification","apns","device-token","registerforremotenotifications"],"question":"원격 푸시 흐름에서 디바이스 토큰 처리에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"PhonePe"}},{"id":"LIFE-030","type":"short","category":"app-lifecycle","difficulty":2,"topic":"NotificationCenter 의 스레드와 옵저버 수명","tags":["notificationcenter","objective-c","threading","observer","memory"],"question":"`NotificationCenter.default.post` 를 백그라운드 스레드에서 호출하면 옵저버 코드는 어느 스레드에서 실행되나요?","source":{"kind":"company","company":"ByteDance"},"since":"iOS 15"},{"id":"LIFE-031","type":"short","category":"app-lifecycle","difficulty":2,"topic":"아이콘 탭부터 첫 화면까지의 실행 과정","tags":["app-launch","dyld","objective-c","pre-main","uiapplicationmain","launch-time"],"question":"홈 화면에서 앱 아이콘을 탭한 순간부터 첫 화면이 그려질 때까지, main() 이전 단계까지 포함해 시스템과 앱 안에서 무슨 일이 순서대로 일어나나요?","source":{"kind":"company","company":"Alibaba"}},{"id":"LIFE-032","type":"short","category":"app-lifecycle","difficulty":2,"topic":"프로세스 상태와 iOS 앱 상태의 대응","tags":["app-state","process","suspended","jetsam","memory-pressure"],"question":"OS 수업에서 배운 프로세스 상태(생성·준비·실행·대기·종료)는 iOS 앱 상태(Not Running·Inactive·Active·Background·Suspended)와 어떻게 대응되나요? 특히 Suspended 를 프로세스 관점에서 설명해 주세요.","source":{"kind":"company","company":"Shopee"},"since":"iOS 14"},{"id":"LIFE-033","type":"mcq","category":"app-lifecycle","difficulty":2,"topic":"APNs 우선순위와 헤더","tags":["push-notification","apns","priority","apns-push-type","collapse-id"],"question":"서버팀이 \"APNs 로 보내는 알림의 QoS(우선순위)를 어떻게 정해야 하느냐\" 고 묻습니다. 옳은 설명을 **모두** 고르세요.","source":{"kind":"community","company":"Wipro"}},{"id":"LIFE-034","type":"short","category":"app-lifecycle","difficulty":3,"topic":"웹뷰 기반 앱의 네이티브 브리지와 딥링크","tags":["wkwebview","javascript-bridge","deep-link","wkscriptmessagehandler","security"],"question":"서비스 대부분이 `WKWebView` 로 구현된 앱에서 웹이 네이티브 기능(생체 인증·카메라)을 호출하는 브리지를 유지보수해야 합니다. 브리지는 어떤 API 로 만드나요?","source":{"kind":"community","company":"뱅크샐러드"},"since":"iOS 14"},{"id":"LIFE-035","type":"short","category":"app-lifecycle","difficulty":4,"topic":"백그라운드 BLE 와 차량 디지털 키","tags":["core-bluetooth","background-mode","state-restoration","uwb","digital-key"],"question":"차량 디지털 키 앱을 만듭니다. 사용자가 폰을 주머니에 넣은 채(앱이 백그라운드 상태) 차에 다가가면 BLE 로 잠금을 해제해야 합니다. iOS 에서 백그라운드 상태의 BLE 통신을 위해 어떤 설정과 설계가 필요한가요?","source":{"kind":"community","company":"42dot"},"since":"iOS 14"},{"id":"LIFE-036","type":"short","category":"app-lifecycle","difficulty":2,"topic":"홈으로 나갔을 때의 시퀀스와 커버 뷰","tags":["app-state","snapshot","privacy","background","scene-delegate"],"question":"사용자가 홈으로 나갔을 때(홈 버튼·스와이프) 시스템과 앱에서 어떤 일이 순서대로 일어나나요?","source":{"kind":"company","company":"Tencent"}},{"id":"LIFE-037","type":"mcq","category":"app-lifecycle","difficulty":1,"topic":"홈 이동과 복귀 시 씬 콜백 순서","tags":["app-state","scene-delegate","lifecycle-callbacks"],"question":"씬 기반(SceneDelegate) UIKit 앱에서 사용자가 홈으로 나간 뒤 30초 후 다시 앱으로 돌아왔습니다(앱은 종료되지 않음). 호출되는 콜백을 순서대로 올바르게 나열한 것은?","source":{"kind":"company","company":"Samsung"}},{"id":"LIFE-038","type":"short","category":"app-lifecycle","difficulty":1,"topic":"ViewController 표시 생명주기","tags":["uikit","view-lifecycle","viewdidload","observer"],"question":"UIKit 화면에서 NotificationCenter observer처럼 화면이 보이는 동안에만 필요한 구독은 어느 생명주기 메서드 쌍에서 붙였다 떼겠습니까?","source":{"kind":"community","company":"Barclays"}},{"id":"LIFE-039","type":"short","category":"app-lifecycle","difficulty":1,"topic":"Scene 기반 앱 생명주기","tags":["scene","app-lifecycle","appdelegate","swiftui"],"question":"Scene 기반 iOS 앱에서 푸시 토큰 등록 같은 일과 화면 상태 저장 같은 일을 각각 AppDelegate와 SceneDelegate 중 어디에 두겠습니까?","source":{"kind":"community","company":"Photon Interactive"},"since":"iOS 13"},{"id":"LIFE-040","type":"short","category":"app-lifecycle","difficulty":3,"topic":"멀티 디바이스 상태 복원","tags":["state-restoration","carplay","scene","multidevice"],"question":"iPhone, iPad, CarPlay에서 같은 음악 재생 화면을 지원합니다. 앱이 종료됐다가 scene이 다시 연결될 때 재생 중이던 상태를 무엇을 기준으로 복원하겠습니까?","source":{"kind":"community","company":"드림어스컴퍼니"}},{"id":"LIFE-041","type":"short","category":"app-lifecycle","difficulty":2,"topic":"background 전환 시 민감 화면 보호","tags":["lifecycle","privacy","background","authentication"],"question":"대출 앱이 background로 갈 때 앱 전환기 스냅샷에 계좌 정보가 남지 않아야 합니다. 가림 화면은 어느 lifecycle 콜백에서 올려야 합니까?","source":{"kind":"community","company":"피에프씨테크놀로지스"}},{"id":"ARCH-001","type":"short","category":"architecture","difficulty":1,"topic":"Cocoa MVC","tags":["mvc","cocoa-mvc","massive-view-controller","uikit"],"question":"교과서의 MVC와 UIKit의 Cocoa MVC는 무엇이 다른가요?","source":{"kind":"community"}},{"id":"ARCH-002","type":"mcq","category":"architecture","difficulty":1,"topic":"MVC 역할 배치","tags":["mvc","responsibility","layering"],"question":"MVC로 구성된 iOS 앱에서 '서버에서 받은 날짜 문자열을 사용자 로케일에 맞춰 표시 형식으로 바꾸는 코드'는 어디에 두는 것이 가장 적절한가요?","source":{"kind":"community"}},{"id":"ARCH-003","type":"short","category":"architecture","difficulty":2,"topic":"MVC vs MVVM","tags":["mvc","mvvm","viewmodel","testability","binding"],"question":"MVC로 잘 돌아가는 앱에 MVVM을 도입하자는 제안을 받았습니다. MVVM이 MVC와 근본적으로 다른 점은 무엇인가요?","source":{"kind":"community"}},{"id":"ARCH-004","type":"mcq","category":"architecture","difficulty":2,"topic":"ViewModel 책임 경계","tags":["mvvm","viewmodel","responsibility","uikit"],"question":"MVVM에서 ViewModel이 **가져서는 안 되는** 것을 모두 고르세요.","source":{"kind":"original"}},{"id":"ARCH-005","type":"short","category":"architecture","difficulty":2,"topic":"MVP · VIPER · MVI · RIBs 비교","tags":["mvp","viper","mvi","ribs","comparison"],"question":"MVVM 말고 아는 아키텍처(MVP, VIPER, MVI, RIBs 등)를 하나씩 짚으며 무엇이 다른지 설명해 주세요.","source":{"kind":"community"}},{"id":"ARCH-006","type":"short","category":"architecture","difficulty":3,"topic":"Coordinator 패턴","tags":["coordinator","navigation","mvvm-c","routing","deep-link"],"question":"MVVM-C의 Coordinator는 어떤 문제를 풀기 위한 것인가요?","source":{"kind":"community"}},{"id":"ARCH-007","type":"mcq","category":"architecture","difficulty":3,"topic":"Coordinator 메모리 관리","tags":["coordinator","memory","retain-cycle","weak","lifecycle"],"question":"다음 Coordinator 구현에서 로그인 플로우가 끝난 뒤에도 `LoginCoordinator`가 메모리에 남습니다. 원인으로 가장 알맞은 것은?\n\n```swift\nfinal class AppCoordinator {\n    var children: [Coordinator] = []\n    func showLogin() {\n        let child = LoginCoordinator(nav: nav)\n        child.onFinish = { self.children.removeAll { $0 === child } }\n        children.append(child); child.start()\n    }\n}\n```","source":{"kind":"original"}},{"id":"ARCH-008","type":"short","category":"architecture","difficulty":2,"topic":"의존성 주입","tags":["dependency-injection","protocol","testing","composition-root"],"question":"iOS 앱에서 의존성 주입(DI)은 왜 하는 것인가요?","source":{"kind":"community"}},{"id":"ARCH-009","type":"mcq","category":"architecture","difficulty":2,"topic":"DI 방식 선택","tags":["dependency-injection","initializer","property","environment"],"question":"의존성 주입 방식에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"ARCH-010","type":"short","category":"architecture","difficulty":1,"topic":"싱글톤 패턴","tags":["singleton","global-state","testing","thread-safety"],"question":"iOS 앱에서 싱글톤은 언제 쓰고 무엇이 문제인가요?","source":{"kind":"community"}},{"id":"ARCH-011","type":"short","category":"architecture","difficulty":1,"topic":"Delegate 패턴과 통신 방식 비교","tags":["delegate","notification","kvo","closure","communication"],"question":"UIKit 곳곳에 쓰이는 Delegate 패턴이 무엇인지 설명해 주세요.","source":{"kind":"community"}},{"id":"ARCH-012","type":"mcq","category":"architecture","difficulty":1,"topic":"통신 방식 선택","tags":["delegate","notification","closure","design"],"question":"다음 중 **NotificationCenter**가 가장 적절한 상황은?","source":{"kind":"community"}},{"id":"ARCH-013","type":"short","category":"architecture","difficulty":2,"topic":"KVO 동작 원리","tags":["kvo","kvc","objective-c-runtime","isa-swizzling","observation"],"question":"Objective-C 런타임의 KVO는 내부적으로 어떻게 프로퍼티 변화를 감지하나요?","source":{"kind":"community"}},{"id":"ARCH-014","type":"short","category":"architecture","difficulty":3,"topic":"간이 NotificationCenter 구현","tags":["pub-sub","observer","notification","coding","weak","thread-safety"],"question":"라이브 코딩입니다. Foundation의 NotificationCenter 없이, 이름으로 구독하고 발행하는 간이 EventBus를 Swift로 설계·구현해 보세요. 옵저버가 사라진 뒤 핸들러가 남지 않도록 수명과 해제 API를 어떻게 처리할지 말해 주세요.","source":{"kind":"community","company":"PayPal"}},{"id":"ARCH-015","type":"mcq","category":"architecture","difficulty":2,"topic":"NotificationCenter 동작","tags":["notification","notificationcenter","thread","observer"],"question":"Foundation `NotificationCenter`에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"ARCH-016","type":"short","category":"architecture","difficulty":2,"topic":"SOLID 원칙","tags":["solid","srp","ocp","lsp","isp","dip"],"question":"SOLID 다섯 원칙을 도형·동물 말고 iOS 코드 예시로 설명해 주세요.","source":{"kind":"community"}},{"id":"ARCH-017","type":"mcq","category":"architecture","difficulty":2,"topic":"디자인 패턴 식별","tags":["design-pattern","observer","adapter","decorator","facade","factory"],"question":"다음 중 상황과 디자인 패턴이 올바르게 짝지어진 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"ARCH-018","type":"short","category":"architecture","difficulty":3,"topic":"레거시 MVC → MVVM 마이그레이션","tags":["migration","legacy","mvvm","refactoring","strangler"],"question":"5년 된 MVC 앱(뷰 컨트롤러 150개, 테스트 거의 없음)을 MVVM으로 옮기라는 요구를 받았습니다. 서비스는 계속 배포되어야 합니다. 어떤 전략으로 진행하나요?","source":{"kind":"community"}},{"id":"ARCH-019","type":"short","category":"architecture","difficulty":3,"topic":"API 클라이언트 추상화","tags":["protocol","generic","network-layer","endpoint","abstraction"],"question":"인증 서버, 상품 서버, 결제 서버용으로 비슷하지만 조금씩 다른 네트워크 클라이언트가 세 개 있습니다(헤더, 인코딩, 에러 형식이 다름). 이를 프로토콜로 어떻게 추상화해 중복을 없애나요?","source":{"kind":"community"}},{"id":"ARCH-020","type":"short","category":"architecture","difficulty":3,"topic":"모듈화 전략","tags":["modularization","spm","framework","build-time","boundary"],"question":"단일 타깃으로 커진 앱을 모듈로 나누려 합니다. 어떤 기준으로 모듈 경계를 긋나요?","source":{"kind":"community","company":"Airbnb"}},{"id":"ARCH-021","type":"short","category":"architecture","difficulty":4,"topic":"팀 규모별 아키텍처·품질 전략","tags":["scaling","team","modularization","code-ownership","ci","conflict"],"question":"iOS 팀이 5명 → 10명 → 100명으로 커진다고 할 때, 각 단계에서 코드 충돌·품질·아키텍처를 어떻게 다르게 관리해야 하나요?","source":{"kind":"community"}},{"id":"ARCH-022","type":"mcq","category":"architecture","difficulty":3,"topic":"모듈 의존 방향","tags":["modularization","dependency","interface","circular"],"question":"`SearchFeature` 모듈이 검색 결과에서 `CheckoutFeature`의 결제 화면을 열어야 합니다. 두 Feature 사이에 순환 의존을 만들지 않으면서 이를 구현하는 올바른 방법은?","source":{"kind":"original"}},{"id":"ARCH-023","type":"short","category":"architecture","difficulty":3,"topic":"TCA 도입 판단","tags":["tca","composable-architecture","unidirectional","reducer","tradeoff"],"question":"팀에서 TCA(The Composable Architecture) 도입을 검토 중입니다. TCA가 해결하는 문제는 무엇인가요?","source":{"kind":"original"},"since":"iOS 16"},{"id":"ARCH-024","type":"mcq","category":"architecture","difficulty":3,"topic":"TCA 구성 요소","tags":["tca","reducer","effect","state","action"],"question":"TCA에서 '버튼을 누르면 네트워크로 목록을 받아 화면에 표시한다'를 구현할 때, 각 요소의 역할로 **틀린** 것은?","source":{"kind":"original"},"since":"iOS 16"},{"id":"ARCH-025","type":"short","category":"architecture","difficulty":2,"topic":"반응형 프로그래밍(RxSwift/Combine)","tags":["rxswift","combine","reactive","async-sequence","stream"],"question":"RxSwift(또는 Combine)로 대표되는 반응형 프로그래밍이 iOS에서 어떤 문제를 풀어 주나요?","source":{"kind":"community"}},{"id":"ARCH-026","type":"short","category":"architecture","difficulty":4,"topic":"대규모 SwiftUI 앱 구조","tags":["swiftui","large-scale","modularization","navigation","state","di"],"question":"수십 개 화면, 여러 팀이 개발하는 SwiftUI 앱을 처음부터 설계한다면 상태 관리·화면 이동·의존성 주입·모듈 경계를 어떻게 잡나요?","source":{"kind":"community"},"since":"iOS 17"},{"id":"ARCH-027","type":"mcq","category":"architecture","difficulty":4,"topic":"Method Swizzling","tags":["method-swizzling","objective-c-runtime","aop","risk"],"question":"Method Swizzling에 대한 설명으로 **옳은** 것을 모두 고르세요.","source":{"kind":"community"}},{"id":"ARCH-028","type":"short","category":"architecture","difficulty":4,"topic":"Clean Architecture와 책임 설계","tags":["clean-architecture","use-case","domain","boundary","responsibility","oop"],"question":"Clean Architecture를 iOS에 적용할 때 레이어와 의존 규칙을 설명해 주세요.","source":{"kind":"community"}},{"id":"ARCH-029","type":"short","category":"architecture","difficulty":2,"topic":"DI vs DIP","tags":["dependency-injection","dependency-inversion","solid","protocol","testability"],"question":"의존성 주입(Dependency Injection)과 의존성 역전 원칙(Dependency Inversion Principle)은 이름이 비슷한데 무엇이 다른가요?","source":{"kind":"company","company":"Walmart"}},{"id":"ARCH-030","type":"mcq","category":"architecture","difficulty":2,"topic":"싱글톤 단위 테스트","tags":["singleton","unit-test","testability","mock","dependency-injection"],"question":"`AnalyticsManager.shared`처럼 코드 곳곳에서 직접 참조하는 싱글톤이 있는 코드베이스에서, 이를 쓰는 뷰모델을 단위 테스트하려 합니다. 올바른 접근을 **모두** 고르세요.","source":{"kind":"company","company":"Walmart"}},{"id":"ARCH-031","type":"short","category":"architecture","difficulty":2,"topic":"서드파티 라이브러리 판단","tags":["third-party","dependency","spm","adapter","trade-off"],"question":"과제 리뷰입니다. 제출한 앱에 서드파티 라이브러리를 하나도 쓰지 않았는데, 면접관이 왜 안 썼는지, 만약 써야 한다면 어떤 부분을 어떤 라이브러리로 바꾸겠는지 묻습니다. 판단 기준과 함께 답해 주세요.","source":{"kind":"company","company":"Gojek"}},{"id":"ARCH-032","type":"short","category":"architecture","difficulty":3,"topic":"분석 이벤트 디스패치 설계","tags":["analytics","protocol","dispatcher","open-closed","take-home"],"question":"테이크홈 과제입니다. 분석 이벤트를 여러 서비스(Google Analytics, Snowplow 등)로 보내는 계층을 Swift만으로 설계하세요. 조건: 호출부는 한 줄, 이벤트는 모듈화되어 추가·삭제가 쉬움, 서비스마다 이벤트 이름·파라미터가 다를 수 있음, 서비스는 이벤트를 선택적으로 수신 가능, 서비스 추가가 기존 코드를 건드리지 않음. 타입을 어떻게 설계하나요?","source":{"kind":"company","company":"Headspace"}},{"id":"ARCH-033","type":"short","category":"architecture","difficulty":3,"topic":"탭 기반 앱의 데이터 계층 설계","tags":["repository","single-source-of-truth","caching","startup","whiteboard"],"question":"화이트보드 설계입니다. 메시지 탭과 연락처 탭만 있는 간이 Outlook 앱을 만듭니다. API에서 읽은 데이터가 두 탭에 지연 없이 반영되어야 하고, 앱 시작 속도와 다운로드를 최적화해 연락처가 가능한 한 빨리 보여야 합니다. 계층 구조와 데이터 흐름을 설계해 주세요.","source":{"kind":"company","company":"Microsoft"}},{"id":"ARCH-034","type":"mcq","category":"architecture","difficulty":2,"topic":"싱글톤 해제(deinit)","tags":["singleton","deinit","lifetime","scope","session"],"question":"`static let shared = SessionManager()` 형태의 싱글톤에 대해 \"deinit이 호출되게 할 수 있나요? 필요한 실제 사례가 있나요?\"라는 질문에 옳은 답을 **모두** 고르세요.","source":{"kind":"company","company":"Paytm"}},{"id":"ARCH-035","type":"short","category":"architecture","difficulty":2,"topic":"비즈니스 로직의 위치","tags":["mvvm","business-logic","viewmodel","domain","separation-of-concerns"],"question":"마지막으로 만든 화면 하나를 골라 처음부터 끝까지 설명해 보세요. 그 화면에서 비즈니스 로직은 어디에 두었고 왜 그랬나요?","source":{"kind":"company","company":"CRED"}},{"id":"ARCH-036","type":"short","category":"architecture","difficulty":3,"topic":"MVVM의 한계와 점진적 리팩터링","tags":["mvvm","trade-off","refactoring","strangler","architecture-decision"],"question":"이 기능에 MVVM을 골랐다고 하셨는데, MVVM이 오히려 해가 되는 경우는 언제인가요?","source":{"kind":"company","company":"CRED"}},{"id":"ARCH-037","type":"mcq","category":"architecture","difficulty":3,"topic":"대규모 앱의 딥링크 처리","tags":["deep-link","universal-link","router","modularization","auth"],"question":"수십 개 모듈로 나뉜 대규모 앱에서 딥링크(URL 스킴·Universal Link·푸시 페이로드)를 처리하는 설계로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Flipkart"}},{"id":"ARCH-038","type":"short","category":"architecture","difficulty":3,"topic":"요청 상태 머신 설계","tags":["state-machine","enum","loading-state","cancellation","unidirectional"],"question":"네트워크 요청이 있는 화면은 로딩·성공·실패·재시도·새로고침·취소 상태가 얽힙니다. 이 상태 전이를 어떻게 설계하나요?","source":{"kind":"company","company":"Didi"}},{"id":"ARCH-039","type":"short","category":"architecture","difficulty":3,"topic":"확장 가능한 검색 API 설계","tags":["api-design","closure","predicate","open-closed","asyncsequence"],"question":"아래 파일 검색 함수가 있습니다. 이제 'UTF-8 txt 또는 H.264 mp4' 그리고 '최근 일주일 안에 수정된 파일'만 찾아야 하고, 앞으로 조건이 계속 늘어날 예정입니다. 파라미터를 계속 추가하지 않고 이 API를 어떻게 확장하나요?\n\n```swift\nfunc findFiles(in dir: URL, suffix: String) -> [URL]\n```","source":{"kind":"company","company":"Kuaishou"}},{"id":"ARCH-040","type":"short","category":"architecture","difficulty":3,"topic":"Clean Architecture 원과 사용자 흐름","tags":["clean-architecture","dependency-rule","use-case","user-flow","design-intent"],"question":"테크리드가 \"iOS 개발할 때 클린 아키텍처의 원(동심원 다이어그램)과 사용자 관점이 잘 안 맞는 것 같다\"고 말합니다. 사용자가 겪는 흐름은 화면→로직→서버→화면인데 다이어그램은 안쪽만 가리키는 화살표뿐입니다. 원이 말하는 것과 말하지 않는 것을 구분해서 답해 주세요.","source":{"kind":"company","company":"네이버웹툰"}},{"id":"ARCH-041","type":"short","category":"architecture","difficulty":3,"topic":"Server Driven UI","tags":["server-driven-ui","sdui","component-registry","versioning","feed"],"question":"피드 화면의 섹션 구성·순서·카드 종류를 앱 배포 없이 바꾸고 싶습니다. Server Driven UI의 스키마와 클라이언트 렌더러를 어떻게 설계하나요?","source":{"kind":"community","company":"당근"}},{"id":"ARCH-042","type":"short","category":"architecture","difficulty":3,"topic":"장기 유지보수를 위한 설계","tags":["maintainability","design-decision","testability","adr","yagni"],"question":"\"이 기능을 몇 년 뒤에도 유지보수하려면 어떻게 설계해야 할까요?\"라는 질문을 받았습니다. 최근에 만든 기능 하나를 예로 들어, 시간이 지나도 고치기 쉬운 구조를 만들기 위해 무엇을 기준으로 결정했는지 설명해 주세요.","source":{"kind":"company","company":"당근"}},{"id":"ARCH-043","type":"short","category":"architecture","difficulty":3,"topic":"재사용 UI 컴포넌트 경계","tags":["uikit","reusable-component","collection-view","configuration"],"question":"UIKit 장바구니 화면에서 상품 카드가 목록, 검색, 추천에 모두 쓰이지만 각 화면마다 탭 동작과 배지가 다릅니다. 재사용 가능한 `UICollectionViewCell` 컴포넌트를 설계할 때 셀에는 어떤 입력과 이벤트만 노출하겠습니까?","source":{"kind":"community","company":"Instacart"}},{"id":"ARCH-044","type":"short","category":"architecture","difficulty":3,"topic":"MVC에서 MVVM으로 이전","tags":["mvvm","repository","migration","caching"],"question":"기존 UIKit 쇼핑 앱의 `UIViewController`가 API 호출, 캐시, 로딩 UI를 모두 처리합니다. MVC를 MVVM으로 옮길 때 네트워크와 캐시 처리는 어느 계층에 두겠습니까?","source":{"kind":"company","company":"JD.com"}},{"id":"ARCH-045","type":"short","category":"architecture","difficulty":3,"topic":"프로토콜 지향 기능 조합","tags":["protocol-oriented","dependency-injection","composition","ios"],"question":"경로 안내, 요금 계산, 실시간 위치 갱신을 가진 iOS 이동 서비스 기능에서 상속 계층이 복잡해졌습니다. 프로토콜 지향 설계로 공통 능력과 서비스별 차이를 어떻게 조합하겠습니까?","source":{"kind":"community","company":"카카오모빌리티"}},{"id":"ARCH-046","type":"short","category":"architecture","difficulty":3,"topic":"점진적 레거시 리팩터링","tags":["refactoring","legacy","feature-flag","migration"],"question":"운영 중인 UIKit 주문 기능의 거대한 ViewController를 한 번에 다시 쓰지 않고 구조를 개선해야 합니다. 배포 가능한 작은 단계로 나눈다면 어떤 seam을 먼저 만들겠습니까?","source":{"kind":"community","company":"우아한형제들"}},{"id":"ARCH-047","type":"short","category":"architecture","difficulty":2,"topic":"파일 목록 기능 모듈화","tags":["feature-module","repository","search","refresh"],"question":"검색과 당겨 새로고침이 있는 iOS 파일/폴더 목록 기능을 설계합니다. UI 프레임워크와 무관하게 유지보수하려면 목록 조회, 검색, 새로고침의 상태와 데이터 접근을 어떤 모듈 경계로 나누겠습니까?","source":{"kind":"community","company":"Dropbox"}},{"id":"ARCH-048","type":"short","category":"architecture","difficulty":1,"topic":"Singleton의 범위","tags":["singleton","dependency-injection","testability","global-state"],"question":"여행 앱에서 전역 `SessionManager.shared`가 인증, 캐시, 분석, 실험 값을 모두 들고 있어 테스트가 어렵습니다. Singleton으로 남겨도 되는 것과 생성자 주입으로 바꿔야 하는 것을 어떻게 가르겠습니까?","source":{"kind":"company","company":"Expedia"}},{"id":"BUILD-001","type":"short","category":"build-distribution","difficulty":1,"topic":"의존성 관리 도구 비교","tags":["spm","cocoapods","carthage","dependency-manager"],"question":"CocoaPods, Carthage, Swift Package Manager는 의존성을 프로젝트에 넣는 방식이 어떻게 다른가요?","source":{"kind":"community"}},{"id":"BUILD-002","type":"mcq","category":"build-distribution","difficulty":1,"topic":"Swift Package Manager","tags":["spm","package-swift","binary-target"],"question":"Swift Package Manager에 대해 **옳은 설명**을 모두 고르세요.","source":{"kind":"community"}},{"id":"BUILD-003","type":"short","category":"build-distribution","difficulty":1,"topic":"브랜치 전략","tags":["git","branching","trunk-based","gitflow","release-branch"],"question":"Git 브랜치를 왜 나눠 쓰나요?","source":{"kind":"community"}},{"id":"BUILD-004","type":"short","category":"build-distribution","difficulty":3,"topic":"iOS CI/CD 파이프라인","tags":["ci-cd","fastlane","xcode-cloud","testflight","automation"],"question":"iOS 앱의 CI/CD 파이프라인을 처음부터 설계한다면, PR마다 도는 파이프라인은 어떤 단계로 구성하겠습니까?","source":{"kind":"community"}},{"id":"BUILD-005","type":"short","category":"build-distribution","difficulty":4,"topic":"대규모 팀 CI/CD 설계","tags":["ci-cd","monorepo","merge-queue","modularization","scale"],"question":"iOS 개발자 100명 이상이 하나의 앱을 만드는 조직입니다. 하루 수백 개 PR이 들어오는데, PR 각각은 CI를 통과했는데도 합치고 나면 main이 깨지는 일이 잦습니다. CI/CD를 어떻게 설계해야 main이 깨지지 않고 배포 주기를 유지할 수 있을까요?","source":{"kind":"community"}},{"id":"BUILD-006","type":"short","category":"build-distribution","difficulty":1,"topic":"코드 사이닝 기본 요소","tags":["code-signing","bundle-id","certificate","provisioning-profile","entitlements"],"question":"번들 ID, 인증서, Entitlements는 프로비저닝 프로파일과 어떻게 연결되나요?","source":{"kind":"company","company":"카카오"}},{"id":"BUILD-007","type":"mcq","category":"build-distribution","difficulty":2,"topic":"서명 오류 진단","tags":["code-signing","provisioning-profile","certificate","xcode-error"],"question":"동료 Mac에서는 되는데 내 Mac에서 아카이브하면 `Provisioning profile \"AppStore Profile\" doesn't include signing certificate \"Apple Distribution: ...\"` 에러가 납니다. **가장 가능성 높은 원인**은?","source":{"kind":"company","company":"카카오"}},{"id":"BUILD-008","type":"short","category":"build-distribution","difficulty":2,"topic":"배포 방식 비교","tags":["distribution","ad-hoc","enterprise","testflight","app-store","development"],"question":"Development, Ad Hoc, Enterprise(In-House), App Store(TestFlight 포함) 배포 방식은 서로 어떻게 다른가요?","source":{"kind":"company","company":"카카오"}},{"id":"BUILD-009","type":"short","category":"build-distribution","difficulty":1,"topic":"OS 메이저 업데이트 대응","tags":["wwdc","ios-version","deployment-target","beta","deprecation"],"question":"WWDC에서 새 iOS 메이저 버전이 발표되면 팀에서는 어떤 순서로 대응하나요?","source":{"kind":"community"}},{"id":"BUILD-010","type":"mcq","category":"build-distribution","difficulty":2,"topic":"Deployment Target과 SDK","tags":["deployment-target","sdk","available","compatibility"],"question":"Deployment Target이 iOS 16인 앱에서 iOS 17에 추가된 API를 쓰려고 합니다. **컴파일과 런타임 모두 안전한** 방법은?","source":{"kind":"original"}},{"id":"BUILD-011","type":"mcq","category":"build-distribution","difficulty":2,"topic":"TestFlight","tags":["testflight","beta","app-store-connect"],"question":"TestFlight에 대해 **옳은 설명**을 모두 고르세요.","source":{"kind":"original"}},{"id":"BUILD-012","type":"short","category":"build-distribution","difficulty":3,"topic":"App Store 심사 준비","tags":["app-review","rejection","guidelines","privacy","demo-account"],"question":"첫 App Store 제출을 앞두고 있습니다. 심사 리젝을 줄이기 위해 제출 전에 무엇을 점검하겠습니까?","source":{"kind":"original"}},{"id":"BUILD-013","type":"mcq","category":"build-distribution","difficulty":3,"topic":"Privacy Manifest","tags":["privacy-manifest","required-reason-api","privacyinfo","app-store"],"question":"`PrivacyInfo.xcprivacy`(Privacy Manifest)에 **선언하는 항목**을 모두 고르세요.","source":{"kind":"original"},"since":"Xcode 15"},{"id":"BUILD-014","type":"short","category":"build-distribution","difficulty":2,"topic":"빌드 환경 분리","tags":["xcconfig","scheme","build-configuration","environment","bundle-id"],"question":"개발·스테이징·프로덕션 서버를 하나의 프로젝트에서 나눠 빌드하려 합니다. 스킴, Build Configuration, xcconfig를 어떻게 구성하겠습니까?","source":{"kind":"original"}},{"id":"BUILD-015","type":"mcq","category":"build-distribution","difficulty":2,"topic":"Debug vs Release 구성","tags":["build-configuration","optimization","assert","testability"],"question":"Xcode 기본 Debug 구성과 Release 구성의 차이로 **옳은 것**을 모두 고르세요.","source":{"kind":"original"}},{"id":"BUILD-016","type":"short","category":"build-distribution","difficulty":3,"topic":"빌드 시간 단축","tags":["build-time","incremental-build","modularization","type-checking","explicit-modules"],"question":"클린 빌드 15분, 한 줄 고쳐도 증분 빌드 2분이 걸리는 프로젝트를 받았습니다. 어디부터 측정하겠습니까?","source":{"kind":"original"}},{"id":"BUILD-017","type":"short","category":"build-distribution","difficulty":3,"topic":"CI 코드 사이닝","tags":["code-signing","fastlane-match","ci","keychain","app-store-connect-api"],"question":"CI 서버에서 아카이브와 App Store 업로드를 자동화하려 합니다. 인증서·프로비저닝 프로파일·App Store Connect 인증을 CI에서 어떻게 안전하게 다루겠습니까?","source":{"kind":"community"}},{"id":"BUILD-018","type":"mcq","category":"build-distribution","difficulty":3,"topic":"xcodebuild 아카이브·내보내기","tags":["xcodebuild","archive","export-options","ipa"],"question":"CI에서 `xcodebuild archive`로 만든 `.xcarchive`를 App Store 업로드용 `.ipa`로 만들 때 필요한 `ExportOptions.plist`의 **역할**로 옳은 것은?","source":{"kind":"original"}},{"id":"BUILD-019","type":"short","category":"build-distribution","difficulty":3,"topic":"SPM 의존성 버전 관리","tags":["spm","semantic-versioning","package-resolved","dependency-resolution"],"question":"SPM에서 의존성 버전 규칙(`from:`, `upToNextMinor`, `exact`, `branch`)을 어떤 기준으로 골라 쓰나요?","source":{"kind":"community"}},{"id":"BUILD-020","type":"short","category":"build-distribution","difficulty":4,"topic":"정적 vs 동적 링킹","tags":["static-library","dynamic-framework","mergeable-libraries","dyld","launch-time"],"question":"앱이 동적 프레임워크 40개를 임베드하고 있습니다. 정적 링크로 바꾸면 무엇이 좋아지고 무엇이 나빠지나요?","source":{"kind":"original"},"since":"Xcode 15"},{"id":"BUILD-021","type":"mcq","category":"build-distribution","difficulty":4,"topic":"XCFramework","tags":["xcframework","binary-distribution","library-evolution","sdk"],"question":"사내 SDK를 소스 비공개 바이너리로 배포하려 합니다. **XCFramework가 필요하거나 함께 요구되는 것**을 모두 고르세요.","source":{"kind":"original"}},{"id":"BUILD-022","type":"short","category":"build-distribution","difficulty":4,"topic":"대규모 프로젝트 빌드 시스템","tags":["tuist","xcodegen","bazel","pbxproj","monorepo"],"question":"모듈 100개 이상인 앱에서 `project.pbxproj` 충돌과 느린 빌드로 팀이 고통받고 있습니다. 프로젝트 생성 도구(XcodeGen/Tuist)와 Bazel 같은 빌드 시스템 중 무엇을 어떤 기준으로 선택하겠습니까?","source":{"kind":"community"}},{"id":"BUILD-023","type":"short","category":"build-distribution","difficulty":2,"topic":"버전과 빌드 번호","tags":["version","build-number","cfbundleversion","marketing-version","semver"],"question":"`CFBundleShortVersionString`과 `CFBundleVersion`은 어떻게 다른가요?","source":{"kind":"original"}},{"id":"BUILD-024","type":"mcq","category":"build-distribution","difficulty":2,"topic":"빌드 번호 규칙","tags":["build-number","testflight","app-store-connect"],"question":"버전 `3.2.0`, 빌드 `120`을 TestFlight에 올린 뒤 버그를 고쳐 다시 올리려 합니다. App Store Connect가 업로드를 **받아 주는** 조합은?","source":{"kind":"original"}},{"id":"BUILD-025","type":"short","category":"build-distribution","difficulty":3,"topic":"출시 리스크 관리","tags":["phased-release","rollback","expedited-review","feature-flag","release-management"],"question":"App Store에는 롤백이 없습니다. 새 버전에 치명적 버그가 있을 때 피해를 최소화하려면 출시 과정에 어떤 장치를 두겠습니까?","source":{"kind":"original"}},{"id":"BUILD-026","type":"mcq","category":"build-distribution","difficulty":2,"topic":"App Store 배포 서명 요건","tags":["code-signing","distribution-certificate","provisioning-profile","app-store"],"question":"App Store에 제출할 빌드를 서명하는 데 **필요한 것**을 모두 고르세요.","source":{"kind":"company","company":"카카오"}},{"id":"BUILD-027","type":"short","category":"build-distribution","difficulty":3,"topic":"모노레포 vs 멀티레포","tags":["monorepo","multi-repo","spm","ci","code-ownership"],"question":"온사이트 질문입니다. \"모노레포와 여러 개의 작은 레포 중 하나를 골라야 한다면 무엇을 고르고 왜 그렇게 하겠어요?\" iOS 앱과 사내 모듈(디자인 시스템·네트워킹·기능 모듈) 조직을 가정하고 답해 주세요.","source":{"kind":"company","company":"Gojek"}},{"id":"BUILD-028","type":"mcq","category":"build-distribution","difficulty":2,"topic":"APNs 인증서·키 발급","tags":["apns","certificate","p12","p8","push"],"question":"푸시 서버가 쓸 APNs 인증 자료를 준비합니다. **옳은 설명**을 모두 고르세요.","source":{"kind":"company","company":"Mastercard"}},{"id":"BUILD-029","type":"short","category":"build-distribution","difficulty":3,"topic":"Tuist 프로젝트의 SPM 의존성","tags":["tuist","spm","dependencies","project-generation"],"question":"Tuist로 생성하는 프로젝트에 서드파티 라이브러리를 SPM으로 넣으려면 어떻게 구성하나요?","source":{"kind":"company","company":"Zomato"},"since":"Tuist 4"},{"id":"BUILD-030","type":"mcq","category":"build-distribution","difficulty":1,"topic":"CocoaPods install vs update","tags":["cocoapods","podfile","lockfile","dependency"],"question":"CocoaPods를 쓰는 프로젝트에서 `pod install`과 `pod update`의 차이로 **옳은 것**을 모두 고르세요.","source":{"kind":"company","company":"TikTok"}},{"id":"BUILD-031","type":"short","category":"build-distribution","difficulty":3,"topic":"컴파일에서 실행 파일까지","tags":["compiler","llvm","linker","static-library","dynamic-library","dyld"],"question":"Swift 소스 파일이 iPhone에서 실행되는 바이너리가 되기까지 어떤 단계를 거치나요?","source":{"kind":"company","company":"Meituan"}},{"id":"BUILD-032","type":"mcq","category":"build-distribution","difficulty":2,"topic":".ipa 구조","tags":["ipa","bundle","code-signing","frameworks","mobileprovision"],"question":"아카이브해서 내보낸 `.ipa` 파일의 압축을 풀어 봤습니다. **구조에 대해 옳은 설명**을 모두 고르세요.","source":{"kind":"company","company":"Pinduoduo"}},{"id":"BUILD-033","type":"short","category":"build-distribution","difficulty":3,"topic":"심사 없는 핫픽스와 동적 코드 금지","tags":["hotfix","feature-flag","remote-config","app-review","objective-c","jspatch"],"question":"출시된 앱에 치명적인 버그가 있는데 App Store 심사를 기다릴 수 없습니다. 과거 중국 앱들이 쓰던 JSPatch 같은 **동적 코드 패치**를 Apple은 왜 금지했고 어떻게 검출했나요?","source":{"kind":"company","company":"Baidu"}},{"id":"BUILD-034","type":"short","category":"build-distribution","difficulty":2,"topic":"베타 테스트 운영","tags":["testflight","beta","feedback","release-process","ci-cd"],"question":"하이어링 매니저가 이력서를 보며 묻습니다. \"베타 테스트와 CI/CD는 어떻게 운영했나요?\" TestFlight 기반 베타 프로그램을 어떤 그룹 구성으로 운영했는지, 어떤 빌드를 언제 누구에게 보냈는지 설명해 주세요.","source":{"kind":"company","company":"Flipkart"}},{"id":"BUILD-035","type":"short","category":"build-distribution","difficulty":3,"topic":"A/B 실험과 전량 롤아웃","tags":["ab-test","experiment","feature-flag","rollout","remote-config"],"question":"앱에 A/B 실험 기능을 넣으려 합니다. 사용자 배정은 어디서 어떻게 하겠습니까? 클라이언트 관점의 설계를 말해 주세요.","source":{"kind":"company","company":"Alibaba"}},{"id":"BUILD-036","type":"short","category":"build-distribution","difficulty":2,"topic":"fastlane 기반 CI/CD 구성","tags":["fastlane","match","jenkins","ci-cd","code-signing"],"question":"Jenkins(또는 GitHub Actions)와 fastlane으로 iOS CI/CD를 구성한다면 어떤 레인(lane)을 어떻게 나누겠습니까?","source":{"kind":"community","company":"카카오뱅크"}},{"id":"BUILD-037","type":"short","category":"build-distribution","difficulty":3,"topic":"Tuist 모듈화 프로젝트 구성","tags":["tuist","modularization","project-generation","build-cache","workspace"],"question":"Tuist로 모듈화 프로젝트를 처음부터 구성해 본 경험을 묻습니다. 모듈을 어떤 단위와 계층으로 나눴는지 설명해 주세요.","source":{"kind":"community","company":"신한카드"},"since":"Tuist 4"},{"id":"BUILD-038","type":"short","category":"build-distribution","difficulty":3,"topic":"App Store Connect API 배포 자동화","tags":["app-store-connect-api","fastlane","spm","automation","release"],"question":"TestFlight 업로드부터 심사 제출·단계적 출시까지 사람 손 없이 돌리려 합니다. App Store Connect API로 무엇까지 자동화할 수 있나요?","source":{"kind":"community","company":"밀리의서재"}},{"id":"BUILD-039","type":"short","category":"build-distribution","difficulty":2,"topic":"Xcode 컴파일 시간 단축","tags":["xcode","build-time","modules","incremental-build"],"question":"이커머스 iOS 앱의 clean build가 15분을 넘겨 CI와 로컬 모두 느립니다. 어느 단계가 느린지 무엇으로 측정해 개선 우선순위를 정하겠습니까?","source":{"kind":"community","company":"Tokopedia"}},{"id":"BUILD-040","type":"short","category":"build-distribution","difficulty":2,"topic":"모바일 배포 자동화","tags":["ci-cd","testflight","signing","automation"],"question":"택시 호출 앱의 iOS 배포가 한 사람의 Xcode 클릭에 의존합니다. CI에서 서명부터 TestFlight 업로드까지 자동으로 돌리려면 파이프라인을 어떻게 구성하겠습니까?","source":{"kind":"community","company":"카카오모빌리티"}},{"id":"BUILD-041","type":"short","category":"build-distribution","difficulty":3,"topic":"Tuist 모듈 의존성","tags":["tuist","modules","dependency-graph","interface"],"question":"숙박 예약 앱의 Tuist 멀티모듈 프로젝트에서 Feature 모듈들이 서로의 구현 모듈을 직접 import해 하나만 고쳐도 전체가 다시 빌드됩니다. 모듈 의존 구조를 어떻게 바꾸겠습니까?","source":{"kind":"community","company":"여기어때"}},{"id":"BUILD-042","type":"short","category":"build-distribution","difficulty":3,"topic":"Fastlane 릴리스 재현성","tags":["fastlane","github-actions","release","artifact"],"question":"공유 킥보드 앱을 여러 사람이 각자 맥에서 Fastlane으로 배포하다 보니 빌드 번호와 환경 설정이 사람마다 달라집니다. 누가 돌려도 같은 결과가 나오게 하려면 lane의 입력을 어떻게 고정하겠습니까?","source":{"kind":"community","company":"더스윙"}},{"id":"CONC-001","type":"short","category":"concurrency","difficulty":1,"topic":"GCD 기본","tags":["gcd","dispatch-queue","thread-pool","serial","concurrent"],"question":"GCD(Grand Central Dispatch)가 무엇이고, 스레드를 직접 만드는 것 대신 왜 큐에 작업을 넘기는 방식을 쓰나요?","source":{"kind":"community"}},{"id":"CONC-002","type":"mcq","category":"concurrency","difficulty":1,"topic":"동기/비동기와 직렬/동시","tags":["sync","async","serial","concurrent","dispatch-queue"],"question":"`sync`/`async`와 serial/concurrent 큐에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"CONC-003","type":"short","category":"concurrency","difficulty":1,"topic":"메인 스레드와 UI","tags":["main-thread","ui","main-actor","runloop","checker"],"question":"UIKit 화면에서 네트워크 응답 콜백에 `label.text = result`를 했더니 가끔 화면이 늦게 바뀌거나 아예 안 바뀝니다. 원인이 무엇인가요?","source":{"kind":"community"}},{"id":"CONC-004","type":"mcq","category":"concurrency","difficulty":2,"topic":"serial 큐 자기 sync","tags":["deadlock","sync","main-queue","serial","libdispatch"],"question":"UIKit 뷰컨트롤러의 `viewDidLoad`(메인 스레드)에서 다음 GCD 코드를 실행하면?\n\n```swift\nDispatchQueue.main.sync {\n    print(\"inside\")\n}\nprint(\"after\")\n```","source":{"kind":"community"}},{"id":"CONC-005","type":"short","category":"concurrency","difficulty":2,"topic":"GCD vs OperationQueue","tags":["operationqueue","operation","gcd","dependency","cancellation"],"question":"이미지 다운로드 → 리사이즈 → 디스크 캐시 저장 파이프라인을 만드는데, 사용자가 스크롤하면 진행 중인 작업을 취소해야 합니다. GCD와 OperationQueue 중 무엇을 고르겠습니까?","source":{"kind":"community"}},{"id":"CONC-006","type":"mcq","category":"concurrency","difficulty":2,"topic":"QoS","tags":["qos","quality-of-service","priority","global-queue"],"question":"사용자가 버튼을 눌러 결과를 기다리고 있는 상황에서 JSON 파싱을 GCD 백그라운드 큐로 보내려 합니다. 가장 적절한 QoS는?","source":{"kind":"community"}},{"id":"CONC-007","type":"short","category":"concurrency","difficulty":2,"topic":"레이스 컨디션","tags":["race-condition","data-race","lock","serial-queue","actor","atomic"],"question":"여러 스레드에서 호출되는 아래 코드는 `count`가 기대보다 작게 나옵니다. 왜 그런지 CPU 수준에서 설명해 주세요.\n\n```swift\nfinal class Stats {\n    var count = 0\n    func hit() { count += 1 }\n}\n```","source":{"kind":"community"}},{"id":"CONC-008","type":"mcq","category":"concurrency","difficulty":2,"topic":"배리어와 reader-writer","tags":["barrier","concurrent-queue","reader-writer","gcd"],"question":"GCD 동시 큐로 만든 다음 캐시 구현에서 `.barrier` 플래그의 역할로 **옳은** 것은?\n\n```swift\nlet q = DispatchQueue(label: \"cache\", attributes: .concurrent)\nfunc read(_ k: String) -> Data? { q.sync { store[k] } }\nfunc write(_ k: String, _ v: Data) {\n    q.async(flags: .barrier) { store[k] = v }\n}\n```","source":{"kind":"original"}},{"id":"CONC-009","type":"short","category":"concurrency","difficulty":3,"topic":"데드락 진단","tags":["deadlock","debugging","lldb","lock-ordering","sync"],"question":"QA에서 \"가끔 앱이 완전히 멈추는데 크래시 로그는 없다\"는 리포트가 왔습니다. 데드락을 의심할 때 어떤 순서로 원인을 찾겠습니까?","source":{"kind":"company","company":"Apple"}},{"id":"CONC-010","type":"short","category":"concurrency","difficulty":2,"topic":"여러 비동기 작업 조합","tags":["dispatchgroup","semaphore","async-let","taskgroup","fan-out"],"question":"화면 진입 시 프로필·피드·알림 API 3개를 병렬로 호출하고 모두 끝났을 때 한 번에 UI를 그려야 합니다. GCD로 구현한다면 어떻게 하겠습니까?","source":{"kind":"community"},"since":"Swift 5.5"},{"id":"CONC-011","type":"mcq","category":"concurrency","difficulty":2,"topic":"세마포어와 뮤텍스","tags":["semaphore","mutex","lock","synchronization"],"question":"`DispatchSemaphore`와 뮤텍스(`NSLock`, `Mutex`)에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"CONC-012","type":"short","category":"concurrency","difficulty":2,"topic":"async/await 동작 원리","tags":["async-await","suspension","continuation","cooperative-thread-pool","completion-handler"],"question":"Swift Concurrency에서 `await`를 만나면 실제로 무슨 일이 일어나고, 스레드가 블로킹되는 것과는 어떻게 다른가요?","source":{"kind":"community"},"since":"Swift 5.5"},{"id":"CONC-013","type":"short","category":"concurrency","difficulty":2,"topic":"Task의 동작","tags":["task","unstructured","detached","inheritance","priority","cancellation"],"question":"Swift Concurrency에서 `Task { }`를 만들면 그 코드는 언제, 어디서 실행되나요?","source":{"kind":"community"},"since":"Swift 5.5"},{"id":"CONC-014","type":"mcq","category":"concurrency","difficulty":3,"topic":"구조화된 동시성","tags":["structured-concurrency","async-let","taskgroup","cancellation"],"question":"구조화된 동시성(`async let`, `TaskGroup`)에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"},"since":"Swift 5.5"},{"id":"CONC-015","type":"short","category":"concurrency","difficulty":4,"topic":"actor 재진입성","tags":["actor","reentrancy","isolation","await","invariant"],"question":"Swift Concurrency 로 만든 아래 이미지 캐시 actor는 같은 키에 대해 네트워크 요청이 두 번 나가는 경우가 있습니다. actor가 상태를 보호해 주는데도 왜 이런 일이 생기나요?\n\n```swift\nactor ImageCache {\n    private var cache: [URL: UIImage] = [:]\n    func image(for url: URL) async throws -> UIImage {\n        if let hit = cache[url] { return hit }\n        let img = try await download(url)\n        cache[url] = img\n        return img\n    }\n}\n```","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"CONC-016","type":"mcq","category":"concurrency","difficulty":3,"topic":"Sendable","tags":["sendable","swift-6","strict-concurrency","value-type","actor"],"question":"Swift 6 strict concurrency에서 **추가 조치 없이 `Sendable`로 취급되는(또는 자동 채택되는) 것을 모두** 고르세요.","source":{"kind":"original"},"since":"Swift 6"},{"id":"CONC-017","type":"short","category":"concurrency","difficulty":3,"topic":"Swift 6 마이그레이션","tags":["swift-6","strict-concurrency","migration","completion-handler","mainactor"],"question":"completion handler와 GCD로 짜인 대형 앱을 Swift 6 strict concurrency로 옮기라는 과제를 받았습니다. 어떤 순서로 옮기겠습니까?","source":{"kind":"community"},"since":"Swift 6"},{"id":"CONC-018","type":"short","category":"concurrency","difficulty":3,"topic":"MainActor 격리","tags":["mainactor","global-actor","nonisolated","isolation","ui"],"question":"Swift Concurrency에서 `@MainActor`를 뷰모델 클래스 전체에 붙이는 것과 특정 메서드에만 붙이는 것은 무엇이 다른가요?","source":{"kind":"original"},"since":"Swift 5.7"},{"id":"CONC-019","type":"mcq","category":"concurrency","difficulty":2,"topic":"Combine 연산자와 스케줄러","tags":["combine","debounce","throttle","scheduler","receive-on"],"question":"검색창 입력마다 API를 호출하지 않고 '입력이 멈춘 뒤 300ms'에 한 번만 호출하고, 결과는 메인 스레드에서 받으려 합니다. 올바른 Combine 파이프라인은?","source":{"kind":"community"},"since":"iOS 13"},{"id":"CONC-020","type":"short","category":"concurrency","difficulty":3,"topic":"Thread Sanitizer","tags":["tsan","thread-sanitizer","data-race","debugging","ci"],"question":"Thread Sanitizer는 어떤 원리로 데이터 레이스를 잡나요?","source":{"kind":"community"}},{"id":"CONC-021","type":"mcq","category":"concurrency","difficulty":4,"topic":"협력적 취소","tags":["cancellation","task","checkcancellation","task-sleep"],"question":"Swift Concurrency 의 다음 코드에서 `t.cancel()` 직후 실제로 일어나는 일로 **옳은** 것은?\n\n```swift\nlet t = Task {\n    var sum = 0\n    for i in 0..<1_000_000_000 { sum &+= i }\n    try Task.checkCancellation()\n    try await Task.sleep(for: .seconds(5))\n    return sum\n}\nt.cancel()\n```","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"CONC-022","type":"short","category":"concurrency","difficulty":4,"topic":"디스패치 큐 직접 설계","tags":["design","queue","thread-pool","condition-variable","serial","concurrent"],"question":"GCD 없이 `MyQueue`를 직접 설계해 보세요. `async(_:)`로 클로저를 넣으면 백그라운드 스레드 풀이 실행하고, serial/concurrent 모드를 지원하며, `sync(_:)`도 제공해야 합니다. 핵심 자료구조와 동기화 원리를 설명해 주세요.","source":{"kind":"company","company":"Amazon"}},{"id":"CONC-023","type":"short","category":"concurrency","difficulty":3,"topic":"비동기 네트워크 클라이언트 설계","tags":["design","network-client","async","cancellation","retry","deduplication"],"question":"Swift Concurrency(async/await, actor)로 여러 화면에서 동시에 쓰는 네트워크 클라이언트 API를 설계해 보세요. 메인 스레드를 절대 막지 않아야 하고, 같은 요청 중복 제거·취소·재시도가 필요합니다. 인터페이스와 내부 동시성 구조를 설명해 주세요.","source":{"kind":"community","company":"Snap"},"since":"Swift 5.5"},{"id":"CONC-024","type":"mcq","category":"concurrency","difficulty":1,"topic":"순차 await 와 async let","tags":["async-await","async-let","parallel","sequential","task"],"question":"Swift Concurrency 에서 `fetchProfile()`과 `fetchFeed()`가 각각 1초 걸린다고 할 때, 다음 두 코드의 총 소요 시간에 대한 설명으로 **옳은 것**은?\n\n```swift\n// A\nlet p = await fetchProfile()\nlet f = await fetchFeed()\n\n// B\nasync let p = fetchProfile()\nasync let f = fetchFeed()\nlet (profile, feed) = await (p, f)\n```","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"CONC-025","type":"short","category":"concurrency","difficulty":2,"topic":"RunLoop","tags":["runloop","timer","main-thread","runloop-mode","scrolling"],"question":"스크롤하는 동안 화면의 카운트다운 `Timer`가 멈췄다가 스크롤이 끝나면 한꺼번에 따라잡습니다. RunLoop 관점에서 원인이 무엇인가요?","source":{"kind":"community"}},{"id":"CONC-026","type":"mcq","category":"concurrency","difficulty":1,"topic":"iOS 동시성 도구 종류","tags":["thread","gcd","operationqueue","async-await","overview"],"question":"iOS에서 백그라운드 실행(동시성)을 구현하는 수단으로 **적절한 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"CONC-027","type":"short","category":"concurrency","difficulty":4,"topic":"실시간 처리 파이프라인","tags":["realtime","video","60fps","backpressure","buffer-pool","pipeline"],"question":"카메라 프리뷰에 실시간 필터를 적용하는 앱을 만듭니다. 60fps를 유지하면서 메모리 안전성(버퍼 누수·경합 없음)을 지켜야 합니다. 캡처 → 처리 → 렌더 파이프라인을 어떤 스레드/큐 구조로 설계하겠습니까?","source":{"kind":"community"}},{"id":"CONC-028","type":"short","category":"concurrency","difficulty":3,"topic":"지연 작업 취소","tags":["dispatchworkitem","asyncafter","cancellation","task-sleep","debounce"],"question":"`DispatchQueue.main.asyncAfter(deadline: .now() + 2) { showTooltip() }`로 예약한 작업을 사용자가 2초 안에 화면을 떠나면 취소해야 합니다. GCD로는 어떻게 구현하겠습니까?","source":{"kind":"community"},"since":"Swift 5.5"},{"id":"CONC-029","type":"short","category":"concurrency","difficulty":2,"topic":"class vs actor, @MainActor","tags":["actor","mainactor","isolation","class","swift-concurrency"],"question":"Swift에서 class와 actor의 차이는 무엇인가요?","source":{"kind":"community","company":"Walmart"},"since":"Swift 5.5"},{"id":"CONC-030","type":"short","category":"concurrency","difficulty":3,"topic":"completion handler → async/await 점진 이전","tags":["async-await","continuation","migration","cancellation","legacy"],"question":"완료 핸들러(completion handler) 기반으로 짜인 오래된 네트워킹 계층이 있고 앱 전체에서 수백 곳이 호출합니다. 호출부를 한꺼번에 깨뜨리지 않고 async/await로 옮기려면 어떻게 하겠습니까?","source":{"kind":"company","company":"PayPal"},"since":"Swift 5.5"},{"id":"CONC-031","type":"short","category":"concurrency","difficulty":2,"topic":"Combine zip vs combineLatest","tags":["combine","zip","combinelatest","network","async-let"],"question":"서로 다른 두 네트워크 요청(사용자 프로필, 계좌 목록)을 Combine으로 동시에 보내고 **둘 다 완료됐을 때만** 결과를 한 번 내보내는 파이프라인을 작성해 보세요. `zip`과 `combineLatest` 중 무엇을 쓰고 왜인가요?","source":{"kind":"company","company":"Capital One"},"since":"iOS 13"},{"id":"CONC-032","type":"short","category":"concurrency","difficulty":3,"topic":"동시 다운로드, 순서 보장 표시","tags":["taskgroup","structured-concurrency","ordering","cancellation","images"],"question":"이미지 id 배열 `[3, 1, 2]`가 주어집니다. 각 이미지를 **동시에** 다운로드하되, 화면에는 id 순서(1, 2, 3)대로 표시해야 합니다. Swift Concurrency로 어떻게 구현하겠습니까?","source":{"kind":"company","company":"PhonePe"},"since":"Swift 5.5"},{"id":"CONC-033","type":"mcq","category":"concurrency","difficulty":3,"topic":"중첩 큐 출력 예측","tags":["gcd","main-queue","sync","deadlock","output-prediction"],"question":"다음 GCD 코드를 메인 스레드에서 실행합니다. 출력 결과는?\n\n```swift\nprint(\"A\")\nDispatchQueue.main.async {\n    print(\"B\")\n    DispatchQueue.main.async { print(\"C\") }\n    DispatchQueue.global().sync {\n        print(\"D\")\n        DispatchQueue.main.sync { print(\"E\") }\n    }\n    print(\"F\")\n}\nprint(\"G\")\n```","source":{"kind":"company","company":"Zomato"}},{"id":"CONC-034","type":"mcq","category":"concurrency","difficulty":3,"topic":"직렬/동시 큐의 sync 대기 시간","tags":["gcd","serial","concurrent","sync","timing"],"question":"GCD 큐를 받는 다음 함수를 메인 스레드에서 호출하면 반환까지 약 몇 초가 걸릴까요? `queue`가 (1) 직렬 큐일 때와 (2) 동시(concurrent) 큐일 때를 각각 답하세요.\n\n```swift\nfunc run(on queue: DispatchQueue) {\n    queue.async { Thread.sleep(forTimeInterval: 5) }\n    queue.sync  { Thread.sleep(forTimeInterval: 3) }\n}\n```","source":{"kind":"company","company":"Kuaishou"}},{"id":"CONC-035","type":"mcq","category":"concurrency","difficulty":3,"topic":"무락 증가 연산의 결과 범위","tags":["race-condition","data-race","atomicity","lock","threads"],"question":"다섯 개의 스레드가 공유 변수 `count`(초기값 0)에 대해 각각 `count += 1`을 20번씩, 락 없이 실행합니다. 모두 끝났을 때 `count`가 가질 수 있는 값의 범위는? (증가는 읽기 → 더하기 → 쓰기 세 단계로 이뤄지고, 각 단계 사이에 다른 스레드가 끼어들 수 있다고 가정)","source":{"kind":"company","company":"NetEase"}},{"id":"CONC-036","type":"short","category":"concurrency","difficulty":3,"topic":"다중 읽기·단일 쓰기 큐","tags":["gcd","barrier","reader-writer","objective-c","actor"],"question":"프로퍼티를 '여러 스레드가 동시에 읽되 쓰기는 한 번에 하나만' 되게 만들려고 합니다. Objective-C 시절엔 getter에서 `dispatch_sync`, setter에서 `dispatch_barrier_async`를 쓰는 패턴이 있었는데, 면접관이 묻습니다. \"getter가 `sync`면 동기인데 어떻게 여러 읽기가 동시에 되나요?\" 설명해 주세요.","source":{"kind":"company","company":"ByteDance"}},{"id":"CONC-037","type":"mcq","category":"concurrency","difficulty":2,"topic":"concurrent 큐 자기 sync와 스레드 생성","tags":["gcd","concurrent","sync","thread-pool","output-prediction"],"question":"다음 GCD 코드의 출력 결과는? 그리고 `queue.async`가 호출될 때마다 새 스레드가 만들어지나요?\n\n```swift\nlet queue = DispatchQueue(label: \"xyz\", attributes: .concurrent)\nprint(1)\nqueue.async {\n    print(2)\n    queue.sync { print(3) }\n}\nprint(4)\n```","source":{"kind":"company","company":"Xiaohongshu"}},{"id":"CONC-038","type":"short","category":"concurrency","difficulty":2,"topic":"의존 작업 조합","tags":["dispatchgroup","barrier","operationqueue","async-let","priority-inversion"],"question":"독립적인 작업 A, B, C가 있습니다. C는 반드시 A와 B가 모두 끝난 뒤 실행돼야 하고, A와 B의 순서는 상관없으며 서로 중첩하지 않습니다. 구현 방법을 장단점과 함께 아는 대로 말해 주세요.","source":{"kind":"company","company":"Didi"}},{"id":"CONC-039","type":"short","category":"concurrency","difficulty":2,"topic":"검색 디바운스 구현","tags":["debounce","dispatchworkitem","task","cancellation","search"],"question":"검색창에 글자를 입력할 때마다 API를 호출하면 요청이 폭주합니다. 마지막 입력 후 300ms 동안 추가 입력이 없을 때만 호출되도록 디바운스를 GCD로 직접 구현해 보세요.","source":{"kind":"company","company":"Flipkart"}},{"id":"CONC-040","type":"short","category":"concurrency","difficulty":2,"topic":"느린 API와 화면 이탈","tags":["cancellation","task","weak-self","timeout","ui-state"],"question":"상세 화면에 들어가면 아래처럼 API를 호출해 데이터를 보여줍니다.\n\n```swift\nfinal class DetailViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        api.fetchDetail(id: id) { result in\n            self.render(result)\n        }\n    }\n}\n```\n\n면접관이 묻습니다. \"응답이 오기 전에 사용자가 뒤로 가기를 누르면 어떻게 되죠?\" 이 코드에서 생길 수 있는 문제와, 떠난 화면의 요청이 낭비되지 않게 하는 해결책을 설명하세요.","source":{"kind":"company","company":"CRED"}},{"id":"CONC-041","type":"short","category":"concurrency","difficulty":4,"topic":"Swift 6 빌드와 싱글톤 경쟁 상태","tags":["swift6","strict-concurrency","sendable","singleton","actor"],"question":"과제로 제출한 앱은 `static let shared`로 만든 싱글톤 `ImageCache`(내부에 `var storage: [URL: UIImage]`)를 여러 화면이 백그라운드 큐에서 읽고 씁니다. 면접관이 묻습니다. \"이 프로젝트를 Swift 6 언어 모드로 빌드하면 어떤 일이 생길까요?\"","source":{"kind":"community"},"since":"Swift 6"},{"id":"CONC-042","type":"short","category":"concurrency","difficulty":3,"topic":"딕셔너리 캐시의 스레드 안전","tags":["thread-safety","dictionary","nscache","lock","actor"],"question":"메시지 목록 화면에서 셀마다 프로필 이미지를 비동기로 내려받아 `[String: UIImage]` 딕셔너리에 캐시합니다. 여러 스레드가 동시에 읽고 쓰면서 가끔 크래시가 납니다. 왜 크래시가 나나요?","source":{"kind":"company","company":"Microsoft"}},{"id":"CONC-043","type":"short","category":"concurrency","difficulty":1,"topic":"iOS 동시성 수단 선택","tags":["swift-concurrency","async-await","actor","mainactor"],"question":"새 iOS 기능에서 네트워크 결과를 여러 화면이 공유하고 UI도 갱신해야 합니다. Swift Concurrency의 `async/await`, `Task`, `actor`를 각각 어떤 역할에 쓰겠습니까?","source":{"kind":"community","company":"Oracle"},"since":"Swift 5.5"},{"id":"CONC-044","type":"short","category":"concurrency","difficulty":2,"topic":"UI 스레드와 백그라운드 작업","tags":["mainactor","background-work","uikit","threading"],"question":"이미지 변환과 API 응답 처리가 있는 UIKit 화면에서 스크롤이 멈춥니다. 어떤 작업을 main actor 밖으로 보내겠습니까?","source":{"kind":"community","company":"Grindr"},"since":"Swift 5.5"},{"id":"CONC-045","type":"short","category":"concurrency","difficulty":2,"topic":"공유 캐시의 data race","tags":["actor","data-race","cache","inflight"],"question":"여러 이미지 요청이 같은 메모리 캐시 딕셔너리를 동시에 읽고 씁니다. 가끔 크래시가 나고, 로그를 보면 같은 URL을 두 번 내려받은 흔적도 있습니다. Lock 대신 actor로 고친다면 어떤 상태를 actor 안에 두겠습니까?","source":{"kind":"community","company":"Zalando"},"since":"Swift 5.5"},{"id":"CONC-046","type":"short","category":"concurrency","difficulty":2,"topic":"구조적 취소 전파","tags":["cancellation","structured-concurrency","task-group","search"],"question":"검색어가 바뀔 때 이전 검색의 네트워크, 디코딩, 이미지 작업이 모두 멈춰야 합니다. 부모 Task와 자식 Task의 취소 전파를 이용해 작업 트리를 어떻게 구성하겠습니까?","source":{"kind":"company","company":"Square"},"since":"Swift 5.5"},{"id":"CONC-047","type":"short","category":"concurrency","difficulty":2,"topic":"동시 요청의 최신 상태만 적용","tags":["stale-response","cancellation","state","concurrency"],"question":"세금 요약 화면에서 필터를 빠르게 바꾸면 여러 API 요청이 거의 동시에 끝납니다. 마지막에 고른 필터의 결과만 화면에 남게 하려면 요청과 상태 변경을 어떻게 관리하겠습니까?","source":{"kind":"community","company":"Intuit"},"since":"Swift 5.5"},{"id":"CONC-048","type":"short","category":"concurrency","difficulty":2,"topic":"async let과 TaskGroup","tags":["async-let","taskgroup","fanout","error-handling"],"question":"뱅킹 앱 홈에서 서로 독립적인 계좌, 카드, 알림 데이터를 동시에 가져와야 합니다. `async let`과 TaskGroup 중 무엇을 어떤 기준으로 고르겠습니까?","source":{"kind":"community","company":"HSBC"},"since":"Swift 5.5"},{"id":"CONC-049","type":"short","category":"concurrency","difficulty":3,"topic":"동일 URL 다운로드 합치기","tags":["actor","image-download","deduplication","task"],"question":"사진 그리드에서 여러 셀이 같은 사진 URL을 동시에 요청하지만 네트워크 다운로드는 한 번만 해야 합니다. actor 안에서 in-flight Task를 어떻게 보관해 요청을 합치겠습니까?","source":{"kind":"company","company":"Dropbox"},"since":"Swift 5.5"},{"id":"CONC-050","type":"short","category":"concurrency","difficulty":2,"topic":"DispatchGroup fan-out 오류 처리","tags":["dispatchgroup","callbacks","fanout","errors"],"question":"콜백 기반으로 짜인 결제 앱에서 독립 API 세 개가 모두 끝난 뒤 결제 요약을 만들어야 합니다. `DispatchGroup`의 enter와 leave를 어디에 두어 짝을 맞추겠습니까?","source":{"kind":"company","company":"Razorpay"}},{"id":"CS-001","type":"short","category":"cs-fundamentals","difficulty":1,"topic":"스택과 큐","tags":["stack","queue","data-structure","navigation","operationqueue"],"question":"스택과 큐의 차이를 설명해 주세요.","source":{"kind":"community","company":"Apple"}},{"id":"CS-002","type":"mcq","category":"cs-fundamentals","difficulty":1,"topic":"배열 vs 연결 리스트","tags":["array","linked-list","complexity"],"question":"채팅 화면의 메시지 목록을 담을 자료구조를 고릅니다. 연결 리스트보다 Swift `Array`가 유리한 이유로 **가장 정확한** 것은?","source":{"kind":"community","company":"Snap"}},{"id":"CS-003","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"Array 삽입 복잡도","tags":["array","complexity","prepend","deque","cow"],"question":"실시간 피드에서 새 게시물이 도착할 때마다 `posts.insert(newPost, at: 0)`을 호출합니다. 게시물이 5만 개 쌓이면 어떤 문제가 생기나요?","source":{"kind":"original"}},{"id":"CS-004","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"해시맵과 Dictionary","tags":["hashmap","dictionary","hashable","collision","open-addressing"],"question":"해시맵을 직접 구현한다면 어떻게 만들겠습니까?","source":{"kind":"community","company":"Meta"}},{"id":"CS-005","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"Hashable 일관성","tags":["hashable","equatable","set","bug"],"question":"다음 타입을 `Set`에 넣었을 때 발생하는 문제로 옳은 것은?\n\n```swift\nstruct User: Hashable {\n    let id: Int\n    var name: String\n    static func == (a: User, b: User) -> Bool { a.id == b.id }\n    func hash(into h: inout Hasher) { h.combine(id); h.combine(name) }\n}\n```","source":{"kind":"original"}},{"id":"CS-006","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"LRU 캐시","tags":["lru","cache","linked-list","dictionary","nscache","image-cache"],"question":"메모리 이미지 캐시를 LRU로 직접 구현해야 합니다. 어떤 자료구조로 get/put을 O(1)로 만들 수 있나요?","source":{"kind":"community"}},{"id":"CS-007","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"비트 연산과 OptionSet","tags":["bitwise","optionset","bitmask","enum"],"question":"다음 코드와 `OptionSet`·비트 연산에 대한 설명으로 **옳은 것을 모두** 고르세요.\n\n```swift\nstruct Perm: OptionSet {\n    let rawValue: UInt8\n    static let read  = Perm(rawValue: 1 << 0)\n    static let write = Perm(rawValue: 1 << 1)\n    static let exec  = Perm(rawValue: 1 << 2)\n}\nlet p: Perm = [.read, .write]\n```","source":{"kind":"original"}},{"id":"CS-008","type":"short","category":"cs-fundamentals","difficulty":4,"topic":"Diff 알고리즘","tags":["diffable-data-source","diff","myers","heckel","hashable","collectionview"],"question":"`UICollectionViewDiffableDataSource`에 새 스냅샷을 적용하면 어떤 원리로 삽입·삭제·이동을 계산하나요? 왜 아이템 식별자가 `Hashable`이어야 하는지도 함께요.","source":{"kind":"original"},"since":"iOS 15"},{"id":"CS-009","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"탐색 알고리즘 선택","tags":["binary-search","linear-search","dictionary","trie","search"],"question":"연락처 1만 명 목록에서 이름으로 검색하는 기능을 만듭니다. 순차 검색과 '정렬 후 이진 탐색'은 성능이 어떻게 다르고, 실제 앱에서는 어떤 구조를 쓰겠습니까?","source":{"kind":"community"}},{"id":"CS-010","type":"mcq","category":"cs-fundamentals","difficulty":1,"topic":"Swift 컬렉션 복잡도","tags":["complexity","array","set","dictionary","big-o"],"question":"다음 Swift 컬렉션 연산 중 평균 시간 복잡도가 **O(1)**인 것을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"CS-011","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"프로세스와 스레드","tags":["process","thread","os","extension","main-thread"],"question":"프로세스와 스레드의 차이를 설명해 주세요. 스레드끼리는 무엇을 공유하고 무엇은 따로 갖나요?","source":{"kind":"community"}},{"id":"CS-012","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"스레드 폭발","tags":["thread-explosion","gcd","concurrent-queue","semaphore"],"question":"GCD 로 URL 200개를 내려받는 다음 코드를 실행하면 시스템 스레드 수가 60개 이상으로 치솟고 앱이 멈춥니다. 원인으로 가장 정확한 것은?\n\n```swift\nfor url in urls { // 200개\n    DispatchQueue.global().async {\n        let sema = DispatchSemaphore(value: 0)\n        download(url) { _ in sema.signal() }\n        sema.wait()\n        process()\n    }\n}\n```","source":{"kind":"original"}},{"id":"CS-013","type":"short","category":"cs-fundamentals","difficulty":4,"topic":"의존성 그래프와 위상 정렬","tags":["graph","topological-sort","dependency","cycle-detection","modularization","di"],"question":"30개 모듈로 나뉜 앱에서 DI 컨테이너가 서비스들을 초기화하는데, 초기화 순서를 손으로 관리하다 \"A 는 B 를 필요로 하고 B 는 A 를 필요로 한다\"는 크래시가 났습니다. 의존성 그래프에서 안전한 초기화 순서를 구하는 알고리즘을 설명해 주세요.","source":{"kind":"original"}},{"id":"CS-014","type":"short","category":"cs-fundamentals","difficulty":1,"topic":"TCP vs UDP","tags":["tcp","udp","network","urlsession","quic"],"question":"TCP와 UDP의 차이를 설명해 주세요. 패킷이 유실되면 각각 어떻게 되나요?","source":{"kind":"company","company":"카카오"}},{"id":"CS-015","type":"mcq","category":"cs-fundamentals","difficulty":3,"topic":"부동소수점 오차와 Decimal","tags":["floating-point","decimal","ieee754","currency","precision"],"question":"결제 금액 계산에서 `0.1 + 0.2 == 0.3`이 `false`로 나와 테스트가 실패했습니다. 부동소수점과 `Decimal`에 대한 설명으로 **옳은 것을 모두** 고르세요.","source":{"kind":"original"}},{"id":"CS-016","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"QUIC와 모바일 네트워크","tags":["quic","http3","tcp","connection-migration","0-rtt","urlsession"],"question":"지하철에서 Wi-Fi와 LTE가 계속 바뀌는 사용자의 앱 요청이 자주 끊깁니다. TCP 기반 HTTP/2와 QUIC 기반 HTTP/3는 이 상황을 각각 어떻게 다루나요?","source":{"kind":"original"},"since":"iOS 15"},{"id":"CS-017","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"첫 요청 지연 분석","tags":["dns","tls","handshake","latency","urlsessiontaskmetrics","preconnect"],"question":"앱을 콜드 스타트하면 첫 API 응답이 800ms인데 두 번째부터는 120ms입니다. 그 사이에 네트워크 계층에서 무슨 일이 일어나는지 단계별로 설명해 주세요.","source":{"kind":"original"}},{"id":"CS-018","type":"mcq","category":"cs-fundamentals","difficulty":1,"topic":"이미지 포맷","tags":["png","jpeg","heic","webp","image-format"],"question":"이미지 포맷에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"},"since":"iOS 14"},{"id":"CS-019","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"정렬 알고리즘과 Swift sort","tags":["sort","stable-sort","merge-sort","quick-sort","timsort","introsort"],"question":"병합 정렬과 퀵 정렬의 동작과 시간·공간 복잡도를 비교해 주세요.","source":{"kind":"community","company":"Snap"},"since":"Swift 5"},{"id":"CS-020","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"안정 정렬","tags":["sort","stable-sort","ui"],"question":"이름순으로 이미 정렬된 연락처 배열을 `contacts.sort { $0.isFavorite && !$1.isFavorite }`로 다시 정렬했더니 즐겨찾기 그룹 안의 이름 순서가 유지됩니다. 이것이 보장되는 이유는?","source":{"kind":"original"}},{"id":"CS-021","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"트리 탐색과 뷰 계층","tags":["bfs","dfs","tree","view-hierarchy","recursion"],"question":"원본 뷰 계층의 특정 `UIView` 인스턴스가 주어지고, 같은 구조로 복제된 뷰 계층이 있습니다. 복제본에서 대응되는 뷰를 찾는 함수를 어떻게 설계하겠습니까?","source":{"kind":"community","company":"Meta"}},{"id":"CS-022","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"재귀와 스택 한계","tags":["recursion","iteration","stack-overflow","thread-stack","merge-sort","json"],"question":"깊이가 수천 단계인 중첩 JSON을 재귀로 순회하다가 백그라운드 스레드에서만 크래시가 납니다. 원인은 무엇인가요?","source":{"kind":"company","company":"TikTok"}},{"id":"CS-023","type":"mcq","category":"cs-fundamentals","difficulty":3,"topic":"캐시 지역성","tags":["cache-locality","struct","class","memory-layout","performance"],"question":"10만 개의 좌표를 순회하며 거리를 합산합니다. 다음 두 코드 중 A가 B보다 눈에 띄게 빠른 **주된** 이유는?\n\n```swift\nstruct P { var x, y: Double }   // A: [P]\nfinal class Q { var x, y: Double } // B: [Q]\n```","source":{"kind":"community"}},{"id":"CS-024","type":"short","category":"cs-fundamentals","difficulty":4,"topic":"Trie 기반 자동완성","tags":["trie","autocomplete","memory","search","top-k"],"question":"오프라인에서도 동작하는 검색어 자동완성을 만들어야 합니다. 후보 단어 50만 개, 입력마다 상위 10개를 16ms 안에 돌려줘야 합니다. 자료구조를 어떻게 설계하나요?","source":{"kind":"community"}},{"id":"CS-025","type":"short","category":"cs-fundamentals","difficulty":4,"topic":"프리픽스 합과 이진 탐색","tags":["prefix-sum","binary-search","layout","scroll","collectionview"],"question":"셀 높이가 제각각인 커스텀 세로 레이아웃(UICollectionViewLayout 서브클래스)을 만듭니다. `layoutAttributesForElements(in rect:)`가 스크롤마다 호출되는데, 셀 2만 개를 매번 순회하면 버벅입니다. 어떤 자료구조와 알고리즘으로 O(log n)에 보이는 셀 범위를 찾을 수 있나요?","source":{"kind":"original"}},{"id":"CS-026","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"순수 함수","tags":["pure-function","functional","side-effect","swiftui"],"question":"다음 중 **순수 함수**(같은 입력에 항상 같은 출력, 부수 효과 없음)인 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"CS-027","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"O(1) 최댓값 스택","tags":["stack","max-stack","protocol","xctest","amortized"],"question":"편집기의 실행 취소 스택처럼 push/pop 되는 값 중 \"현재 최댓값\"을 O(1)에 돌려주는 스택을 만들려고 합니다. 먼저 Swift 프로토콜로 인터페이스를 정의하고, 구현 아이디어를 설명해 주세요.\n\n```swift\nprotocol MaxStack {\n    associatedtype Element: Comparable\n    mutating func push(_ x: Element)\n    mutating func pop() -> Element?\n    func peekMax() -> Element?\n}\n```","source":{"kind":"company","company":"Apple"},"estimatedMinutes":5},{"id":"CS-028","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"스트림 이동 평균","tags":["ring-buffer","sliding-window","moving-average","fps","stream"],"question":"화면의 프레임 시간이 매 프레임 들어오는 스트림에서, 언제 물어봐도 \"최근 k개 프레임의 평균 시간\"을 즉시 돌려주는 타입을 설계해 주세요. 매초 60번 호출되므로 계산이 가벼워야 합니다. 자료구조와 갱신 방식, 복잡도를 설명하세요.","source":{"kind":"company","company":"Meta"},"estimatedMinutes":4},{"id":"CS-029","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"가장 가까운 K개 장소","tags":["k-nearest","heap","quickselect","geo","map"],"question":"수만 개 장소의 id와 좌표(위도·경도)가 있습니다. 사용자의 현재 위치가 주어지면 가장 가까운 10개 장소를 찾아 그 중심 좌표를 돌려주는 함수를 설계해 주세요. 어떤 알고리즘과 자료구조를 쓰고 복잡도는 얼마인가요?","source":{"kind":"company","company":"Google"},"estimatedMinutes":5},{"id":"CS-030","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"앵커 기준 양방향 조회","tags":["binary-search","sorted-array","pagination","anchor","dedupe"],"question":"채팅 메시지가 id 오름차순으로 정렬된 배열에 있습니다. 푸시 알림을 눌러 특정 메시지로 진입할 때, 그 id를 기준으로 앞 5개·뒤 5개까지 총 최대 11개를 오름차순으로 돌려주는 함수를 작성한다면 어떻게 하겠습니까?","source":{"kind":"company","company":"Reddit"},"estimatedMinutes":4},{"id":"CS-031","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"TTL이 있는 LRU 캐시","tags":["lru","ttl","cache","expiry","linked-list","hashmap"],"question":"LRU 캐시를 구현한 뒤 면접관이 이어서 묻습니다. \"이제 각 항목이 저장된 지 일정 시간이 지나면 만료되게 해 주세요. 그러면 무엇이 비싸지나요?\" 만료를 가장 싸게 검사하는 방식과 그 방식이 치르는 대가를 설명해 주세요.","source":{"kind":"company","company":"PayPal"},"estimatedMinutes":5},{"id":"CS-032","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"슬라이딩 윈도우의 전제","tags":["sliding-window","two-pointers","prefix-sum","monotonic"],"question":"거래 금액 배열에서 \"합이 한도 L 이하인 가장 긴 연속 구간\"을 두 포인터 슬라이딩 윈도우로 O(n)에 풀었습니다. 면접관이 \"환불이 섞여서 음수 금액이 들어오면요?\"라고 묻습니다. 무엇이 문제인가요?","source":{"kind":"company","company":"PayPal"}},{"id":"CS-033","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"인접 중복 없는 재배열","tags":["greedy","heap","priority-queue","feed","diversity"],"question":"피드에 보여줄 게시물 목록이 있는데, 같은 작성자의 글이 연속으로 나오지 않게 순서를 바꿔야 합니다. 어떤 알고리즘으로 재배열하나요? 시간 복잡도도 말해 주세요.","source":{"kind":"company","company":"Audible"},"estimatedMinutes":4},{"id":"CS-034","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"손상된 로그 파싱","tags":["parsing","validation","log","top-k","streaming","robustness"],"question":"앱이 남긴 네트워크 로그 파일이 있습니다. 각 줄은 `사용자ID(4자리) 페이지명 시작시각(hh:mm:ss) 종료시각(hh:mm:ss)` 형식인데, 일부 줄은 깨져 있습니다. 유효한 줄만 골라 로딩이 가장 느렸던 페이지 2개를 찾는 함수를 어떻게 설계하겠습니까? 깨진 줄은 어떻게 다루겠습니까?","source":{"kind":"company","company":"Mastercard"},"estimatedMinutes":4},{"id":"CS-035","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"시간 창 이상 탐지","tags":["hashmap","time-window","stream","fraud","sorting"],"question":"거래 목록(카드번호, 국가, 시각)이 시각 오름차순으로 들어옵니다. \"같은 카드가 5분 안에 서로 다른 두 나라에서 사용됨\"을 탐지하는 가장 효율적인 접근은 무엇인가요?","source":{"kind":"company","company":"JPMorgan"}},{"id":"CS-036","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"연결 영역 크기와 재귀 한계","tags":["flood-fill","bfs","dfs","matrix","connected-components","space-complexity"],"question":"이미지 마스크가 N×M 격자로 주어지고 1은 전경, 0은 배경입니다. 상하좌우로 이어진 1 덩어리(연결 영역)마다 크기를 구해 배열로 돌려주는 함수를 작성한다면 어떻게 하겠습니까? iPhone에서 4000×3000 마스크를 처리한다고 가정하세요.","source":{"kind":"company","company":"Microsoft"},"estimatedMinutes":5},{"id":"CS-037","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"가상 메모리의 역할","tags":["virtual-memory","paging","mmap","jetsam","address-space","os"],"question":"\"기기에 물리 메모리가 충분히 크면 가상 메모리는 필요 없지 않느냐\"는 질문을 받았습니다. 어떻게 답하겠습니까?","source":{"kind":"company","company":"Shopee"},"estimatedMinutes":5},{"id":"CS-038","type":"mcq","category":"cs-fundamentals","difficulty":1,"topic":"구간 겹침 판정","tags":["range","interval","overlap","nsrange"],"question":"텍스트 하이라이트 범위 두 개가 겹치는지 판단하는 함수를 만듭니다. 두 반열린 구간 `a = [a.lower, a.upper)`, `b = [b.lower, b.upper)`가 **겹친다**는 조건으로 올바른 것은 무엇인가요?","source":{"kind":"company","company":"Zomato"}},{"id":"CS-039","type":"short","category":"cs-fundamentals","difficulty":3,"topic":"메모리보다 큰 데이터의 중복 제거","tags":["external-memory","hash-partition","bloom-filter","dedupe","streaming","sqlite"],"question":"한 줄에 URL 하나씩 담긴 1TB 로그 파일에서 중복 URL을 제거해야 하는데 쓸 수 있는 메모리는 1GB뿐입니다. 어떻게 하겠습니까?","source":{"kind":"company","company":"Alibaba"},"estimatedMinutes":5},{"id":"CS-040","type":"mcq","category":"cs-fundamentals","difficulty":2,"topic":"Luhn 체크섬","tags":["luhn","checksum","validation","card-number","fintech"],"question":"카드번호 입력 화면에서 서버 요청 전에 Luhn 알고리즘으로 번호를 검증하려고 합니다. Luhn 검증에 대해 맞는 설명을 **모두** 고르세요.","source":{"kind":"community","company":"Capital One"}},{"id":"CS-041","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"무한 스크롤의 cursor 설계","tags":["pagination","cursor","infinite-scroll","deduplication"],"question":"핀 보드처럼 끝없이 내려가는 iOS 목록에서 같은 항목이 두 번 보이거나 다음 페이지가 빠지는 일을 막으려 합니다. offset 대신 cursor를 쓴다면 어떤 상태와 함께 저장하겠습니까?","source":{"kind":"community","company":"Pinterest"}},{"id":"CS-042","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"재고 관리 객체 설계","tags":["object-oriented-design","inventory","invariant","domain-model"],"question":"재고 입고, 예약, 판매, 취소 연산을 차례로 처리하는 Swift 재고 관리 시스템을 설계합니다. 재고 수량의 불변식은 어떤 도메인 타입으로 지키겠습니까?","source":{"kind":"company","company":"Square"}},{"id":"CS-043","type":"short","category":"cs-fundamentals","difficulty":1,"topic":"두 연결 리스트의 첫 교차 노드","tags":["linked-list","two-pointers","identity","algorithm"],"question":"두 단방향 연결 리스트가 뒤쪽 노드를 공유할 수 있습니다. 값이 같은 노드가 아니라 실제로 처음 공유하는 노드를 O(n) 시간, O(1) 추가 공간으로 찾는 방법을 설명해 주세요.","source":{"kind":"company","company":"Zoom"}},{"id":"CS-044","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"36진수 문자열 덧셈","tags":["string","base36","carry","arithmetic"],"question":"숫자와 알파벳으로 표현한 두 36진수 문자열을 정수로 바꾸지 않고(오버플로 없이) 더해 문자열로 돌려줘야 합니다. 각 자릿수 변환, carry 처리, 앞쪽 0 제거를 어떻게 구현하겠습니까?","source":{"kind":"company","company":"Bilibili"}},{"id":"CS-045","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"O(1) LRU 캐시","tags":["lru-cache","hash-map","linked-list","data-structure"],"question":"최근 사용한 항목만 남기는 LRU 캐시를 설계합니다. `get`과 `put`을 평균 O(1)로 만들기 위해 HashMap과 이중 연결 리스트가 각각 무엇을 맡습니까?","source":{"kind":"community","company":"Deloitte"}},{"id":"CS-046","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"그래프 최단 경로의 방문 처리","tags":["graph","bfs","visited-set","shortest-path"],"question":"집 꾸미기 추천에서 방과 방의 연결 그래프를 따라 최소 이동 횟수를 구합니다. 모든 간선 비용이 같을 때 BFS가 최단 경로를 보장하는 이유를 설명해 주세요.","source":{"kind":"company","company":"오늘의집"}},{"id":"CS-047","type":"short","category":"cs-fundamentals","difficulty":2,"topic":"HashMap과 Set의 복잡도 선택","tags":["hashmap","set","complexity","swift"],"question":"한 시간짜리 코딩 테스트에서 고객 ID 목록의 중복을 찾고 각 ID의 등장 횟수도 세야 합니다. Swift `Set`과 `Dictionary`를 각각 언제 쓰겠습니까?","source":{"kind":"community","company":"N26"}},{"id":"CS-048","type":"short","category":"cs-fundamentals","difficulty":1,"topic":"괄호 균형 검사","tags":["stack","brackets","string","algorithm"],"question":"Swift 문자열에 `()[]{}`가 섞여 있을 때 올바르게 중첩됐는지 스택으로 검사합니다. 닫는 괄호를 만났을 때 어떤 비교를 해야 합니까?","source":{"kind":"community","company":"Zalando"}},{"id":"MEM-001","type":"short","category":"memory-arc","difficulty":1,"topic":"ARC 기본","tags":["arc","reference-counting","retain","release","lifetime"],"question":"ARC가 무엇이고 왜 필요한가요?","source":{"kind":"company","company":"카카오"}},{"id":"MEM-002","type":"mcq","category":"memory-arc","difficulty":1,"topic":"strong / weak / unowned","tags":["weak","unowned","strong","optional"],"question":"`weak` 참조에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"MEM-003","type":"short","category":"memory-arc","difficulty":2,"topic":"순환 참조 진단과 해결","tags":["retain-cycle","leak","memory-graph","deinit","weak"],"question":"특정 화면을 닫아도 그 뷰컨트롤러가 메모리에서 사라지지 않는 것 같습니다. 순환 참조가 실제로 있는지 어떻게 확인하겠습니까?","source":{"kind":"community"}},{"id":"MEM-004","type":"mcq","category":"memory-arc","difficulty":2,"topic":"클로저 캡처와 누수","tags":["closure","capture","weak-self","retain-cycle"],"question":"다음 두 코드 중 순환 참조가 **생기는** 것은?\n\n```swift\n// (A)\nfinal class VM {\n    var onChange: (() -> Void)?\n    func bind() { onChange = { self.reload() } }\n}\n// (B)\nfinal class VC {\n    func load() { DispatchQueue.global().async { self.parse() } }\n}\n```","source":{"kind":"community"}},{"id":"MEM-005","type":"short","category":"memory-arc","difficulty":2,"topic":"weak vs unowned 선택","tags":["weak","unowned","lifetime","crash"],"question":"`weak` 대신 `unowned`를 쓰는 기준은 무엇인가요?","source":{"kind":"community"}},{"id":"MEM-006","type":"short","category":"memory-arc","difficulty":2,"topic":"delegate와 약한 참조","tags":["delegate","weak","anyobject","protocol"],"question":"`weak var delegate: MyDelegate?`로 선언하려는데 컴파일러가 거부합니다. 이유와 고치는 방법을 설명해 주세요.","source":{"kind":"community"}},{"id":"MEM-007","type":"mcq","category":"memory-arc","difficulty":2,"topic":"순환 참조 발생 조건","tags":["retain-cycle","timer","notification","closure","task"],"question":"다음 중 (별도 조치가 없을 때) 순환 참조 또는 영구 누수가 **생기는 경우를 모두** 고르세요.","source":{"kind":"community"}},{"id":"MEM-008","type":"short","category":"memory-arc","difficulty":3,"topic":"Core Foundation 객체와 ARC","tags":["core-foundation","unmanaged","toll-free-bridging","takeretainedvalue","cfrelease"],"question":"`SecItemCopyMatching`이나 `CGImageSource` 같은 C API 가 돌려주는 Core Foundation 객체를 Swift 에서 다룰 때, `Unmanaged`·`takeRetainedValue()`·`takeUnretainedValue()`는 언제 쓰나요? Create/Get 규칙과 연결해 설명해 주세요.","source":{"kind":"original"}},{"id":"MEM-009","type":"short","category":"memory-arc","difficulty":2,"topic":"retain cycle vs memory leak","tags":["retain-cycle","leak","abandoned-memory"],"question":"\"순환 참조\"와 \"메모리 누수\"는 같은 말인가요?","source":{"kind":"community"}},{"id":"MEM-010","type":"mcq","category":"memory-arc","difficulty":1,"topic":"스택과 힙","tags":["stack","heap","allocation","struct","class"],"question":"스택과 힙에 대한 설명으로 **옳은** 것은?","source":{"kind":"community"}},{"id":"MEM-011","type":"short","category":"memory-arc","difficulty":3,"topic":"클로저 캡처 원리","tags":["closure","capture","capture-list","box","heap"],"question":"클로저가 외부 변수를 캡처할 때 실제로 메모리에서 무슨 일이 일어나나요? 캡처 리스트 `[x]`를 쓸 때와 안 쓸 때의 차이를 아래 코드 결과로 설명해 주세요.\n\n```swift\nvar count = 0\nlet a = { print(count) }\nlet b = { [count] in print(count) }\ncount = 10\na(); b()\n```","source":{"kind":"community"}},{"id":"MEM-012","type":"mcq","category":"memory-arc","difficulty":2,"topic":"캡처 리스트","tags":["closure","capture-list","value-capture"],"question":"다음 코드의 출력은?\n\n```swift\nfinal class Counter { var n = 0 }\nlet c = Counter()\nvar tag = \"A\"\nlet f = { [c, tag] in print(c.n, tag) }\nc.n = 5\ntag = \"B\"\nf()\n```","source":{"kind":"original"}},{"id":"MEM-013","type":"short","category":"memory-arc","difficulty":4,"topic":"weak 참조의 런타임 구현","tags":["weak","side-table","refcount","runtime","performance"],"question":"\"weak가 strong보다 느리다\"는 말이 왜 사실인지 Swift 런타임의 참조 카운트 구조(인라인 refcount, side table)로 설명해 주세요.","source":{"kind":"community"}},{"id":"MEM-014","type":"short","category":"memory-arc","difficulty":2,"topic":"MRC와 autorelease","tags":["mrc","retain","release","autorelease","autoreleasepool","objective-c"],"question":"ARC 이전 Objective-C에서는 `retain`/`release`/`autorelease`를 직접 호출했습니다. 각각 무엇이었고 ARC가 무엇을 바꿨나요?","source":{"kind":"community"}},{"id":"MEM-015","type":"mcq","category":"memory-arc","difficulty":2,"topic":"autoreleasepool 활용","tags":["autoreleasepool","peak-memory","loop","uiimage"],"question":"다음 코드에서 메모리가 순간적으로 치솟아 종료되는 문제가 있습니다. 가장 적절한 수정은?\n\n```swift\nfor url in imageURLs {   // 5,000개\n    let data = try Data(contentsOf: url)\n    let image = UIImage(data: data)\n    let thumb = image?.preparingThumbnail(of: size)\n    save(thumb)\n}\n```","source":{"kind":"community"}},{"id":"MEM-016","type":"short","category":"memory-arc","difficulty":2,"topic":"얕은 복사와 깊은 복사","tags":["shallow-copy","deep-copy","nscopying","struct","class"],"question":"`struct Order { var items: [Item]; let customer: Customer }`에서 `Item`은 struct, `Customer`는 class입니다. `var copy = order`로 복사한 뒤 `copy.customer.name`을 바꾸면 원본은 어떻게 되나요?","source":{"kind":"community"}},{"id":"MEM-017","type":"short","category":"memory-arc","difficulty":3,"topic":"iOS 메모리 구조와 Jetsam","tags":["virtual-memory","jetsam","memory-warning","background","footprint"],"question":"백그라운드로 보낸 앱이 돌아와 보면 처음부터 다시 시작되는 경우가 있습니다. iOS의 메모리 관리 방식(가상 메모리, 압축, Jetsam)으로 이 현상을 설명해 주세요.","source":{"kind":"community"}},{"id":"MEM-018","type":"mcq","category":"memory-arc","difficulty":3,"topic":"class 성능과 ARC 트래픽","tags":["final","private","dispatch","arc-traffic","performance"],"question":"class 기반 코드의 성능(디스패치·ARC 비용)을 개선하는 방법으로 **효과가 있는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"MEM-019","type":"short","category":"memory-arc","difficulty":3,"topic":"unowned 크래시 시나리오","tags":["unowned","crash","lifetime","closure","async"],"question":"UITableView 셀에서 이미지를 비동기로 싣는 아래 코드는 가끔 크래시합니다. 어떤 조건에서, 왜 크래시하나요?\n\n```swift\nfinal class ImageCell: UITableViewCell {\n    func load(_ url: URL) {\n        loader.fetch(url) { [unowned self] image in\n            self.imageView?.image = image\n        }\n    }\n}\n```","source":{"kind":"original"}},{"id":"MEM-020","type":"short","category":"memory-arc","difficulty":4,"topic":"메모리 레이아웃","tags":["memorylayout","size","stride","alignment","existential","enum-layout"],"question":"`MemoryLayout<T>.size`, `stride`, `alignment`는 각각 무엇이고 왜 셋이 다를 수 있나요? 아래 struct를 예로 들어 설명해 주세요.\n\n```swift\nstruct A { var a: Bool; var b: Int64; var c: Bool }\n```","source":{"kind":"original"}},{"id":"MEM-021","type":"mcq","category":"memory-arc","difficulty":2,"topic":"Objective-C 프로퍼티 속성","tags":["objective-c","copy","strong","nsstring","property-attribute"],"question":"Objective-C 코드에서 `@property (nonatomic, copy) NSString *name;`처럼 `NSString` 프로퍼티에 `strong` 대신 `copy`를 쓰는 이유로 가장 알맞은 것은?","source":{"kind":"community"}},{"id":"MEM-022","type":"short","category":"memory-arc","difficulty":3,"topic":"값 타입의 메모리 비용","tags":["value-type","cow","arc-traffic","struct","existential","performance"],"question":"\"struct를 쓰면 ARC 비용이 없다\"는 말은 어디까지 사실인가요?","source":{"kind":"community"}},{"id":"MEM-023","type":"mcq","category":"memory-arc","difficulty":3,"topic":"unowned 사용 판단","tags":["unowned","weak","closure","lifetime"],"question":"다음 중 `[unowned self]` 캡처가 **안전한 경우를 모두** 고르세요.","source":{"kind":"original"}},{"id":"MEM-024","type":"short","category":"memory-arc","difficulty":4,"topic":"심화 누수 추적","tags":["leak","instruments","malloc-stack","vm-tracker","cgimage","abandoned-memory"],"question":"Leaks 인스트루먼트와 Memory Graph 모두 깨끗한데 특정 화면을 오갈 때마다 실기기 메모리가 30MB씩 늘어납니다. 이런 케이스에서 원인이 될 수 있는 것들은 무엇인가요?","source":{"kind":"original"}},{"id":"MEM-025","type":"short","category":"memory-arc","difficulty":1,"topic":"메모리 누수의 영향","tags":["leak","memory-warning","jetsam","user-impact"],"question":"메모리 누수란 무엇인가요?","source":{"kind":"community"}},{"id":"MEM-026","type":"mcq","category":"memory-arc","difficulty":1,"topic":"deinit 호출 시점","tags":["deinit","reference-count","lifetime"],"question":"다음 코드의 출력은?\n\n```swift\nfinal class Session { deinit { print(\"bye\") } }\nvar a: Session? = Session()\nvar b = a\na = nil\nprint(\"1\")\nb = nil\nprint(\"2\")\n```","source":{"kind":"original"}},{"id":"MEM-027","type":"short","category":"memory-arc","difficulty":3,"topic":"Task와 self 캡처","tags":["task","swift-concurrency","weak-self","capture","cancellation"],"question":"Swift Concurrency로 옮긴 뒤 팀에서 \"`Task { }` 안에서도 `[weak self]`를 항상 써야 하나\"로 논쟁이 붙었습니다. 언제 불필요하고, 어떤 Task에서는 꼭 필요한가요?","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"MEM-028","type":"mcq","category":"memory-arc","difficulty":4,"topic":"소유권 수식어와 ~Copyable","tags":["ownership","borrowing","consuming","noncopyable","swift-5.9"],"question":"Swift 5.9의 소유권 기능(`borrowing`/`consuming` 파라미터, `~Copyable` 타입)에 대한 설명으로 **옳은** 것은?","source":{"kind":"original"},"since":"Swift 5.9"},{"id":"MEM-029","type":"short","category":"memory-arc","difficulty":3,"topic":"구독 수명과 메모리 관리","tags":["combine","cancellable","closure","weak-self","subscription"],"question":"라이브 코딩에서 Combine 을 쓰는 다음 ViewModel 코드를 받았습니다. 가격 스트림을 구독해 `priceText`에 반영하는 기능을 추가하고, 구독 해제를 어떻게 처리할지 코드와 함께 설명하세요.\n\n```swift\nfinal class ProductViewModel {\n    @Published var priceText = \"\"\n    private let priceStream: AnyPublisher<Decimal, Never>\n    init(priceStream: AnyPublisher<Decimal, Never>) {\n        self.priceStream = priceStream\n    }\n}\n```","source":{"kind":"company","company":"쿠팡"},"since":"iOS 13"},{"id":"MEM-030","type":"mcq","category":"memory-arc","difficulty":2,"topic":"누수 패턴 판별","tags":["leak","timer","notificationcenter","closure","delegate"],"question":"다음 코드 조각 중 `ViewController`가 화면에서 사라진 뒤에도 해제되지 않게 만드는(누수를 일으키는) 것을 **모두** 고르세요. 각 코드는 `viewDidLoad`에서 실행되며 `self`는 `UIViewController`입니다.","source":{"kind":"company","company":"하이퍼커넥트"}},{"id":"MEM-031","type":"short","category":"memory-arc","difficulty":1,"topic":"weak vs strong","tags":["weak","strong","arc","reference-counting","optional"],"question":"`weak`와 `strong`의 차이를 설명해 주세요.","source":{"kind":"company","company":"이베이코리아"}},{"id":"MEM-032","type":"short","category":"memory-arc","difficulty":3,"topic":"ARC 꼬리질문 심화","tags":["arc","retain-release","value-type","ownership","compiler"],"question":"\"ARC를 설명해 보세요\"로 시작해 꼬리질문이 이어집니다. 먼저, retain/release는 누가 언제 삽입하나요?","source":{"kind":"company","company":"네이버웹툰"}},{"id":"MEM-033","type":"short","category":"memory-arc","difficulty":3,"topic":"ARC 해제 단계와 weak/unowned 선택","tags":["arc","deinit","weak","unowned","lifecycle"],"question":"객체의 마지막 strong 참조가 사라지는 순간부터 메모리가 실제로 반환되기까지 ARC가 하는 일을 단계별로 설명해 주세요.","source":{"kind":"company","company":"PayPal"}},{"id":"MEM-034","type":"mcq","category":"memory-arc","difficulty":2,"topic":"ARC와 weak의 규칙","tags":["arc","weak","compile-time","enum","value-type"],"question":"ARC와 `weak`에 대한 다음 설명 중 **맞는 것을 모두** 고르세요.","source":{"kind":"company","company":"Zomato"}},{"id":"MEM-035","type":"short","category":"memory-arc","difficulty":3,"topic":"struct 복사와 COW 버퍼 주소","tags":["struct","cow","array","memory-address","copy"],"question":"```swift\nstruct Example { var a: Int; var tags: [String] }\nlet s1 = Example(a: 1, tags: [\"x\"])\nvar s2 = s1\ns2.a = 9\n```\n`s2.a = 9` 이후 `s1.a`·`s2.a`가 저장된 주소와 `tags` 배열의 버퍼 주소는 각각 같은가요, 다른가요?","source":{"kind":"company","company":"Flipkart"}},{"id":"MEM-036","type":"short","category":"memory-arc","difficulty":3,"topic":"루프 안 autorelease 누적","tags":["autoreleasepool","runloop","foundation","bridging","peak-memory"],"question":"데이터 5,000건 이하에서는 잘 돌던 for 루프가 그 이상에서는 메모리 경고 후 크래시합니다. 루프 안에서는 문자열을 잘라 붙이고 `String(format:)`·`NSData` 변환을 반복합니다. 힌트는 'autorelease'입니다. 원인을 설명하세요.","source":{"kind":"company","company":"Microsoft"}},{"id":"MEM-037","type":"mcq","category":"memory-arc","difficulty":3,"topic":"atomic 프로퍼티와 증가 연산","tags":["objective-c","atomic","thread-safety","race-condition","lock"],"question":"Objective-C에서 `@property (atomic) int a;`를 선언하고, 여러 스레드에서 `self.a = self.a + 1`을 합쳐서 10,000번 실행했습니다. 끝났을 때 `a`는 10,000인가요? Swift에서 같은 보장을 얻으려면 어떻게 해야 하나요? **맞는 것을 모두** 고르세요.","source":{"kind":"company","company":"ByteDance"}},{"id":"MEM-038","type":"short","category":"memory-arc","difficulty":3,"topic":"댕글링 포인터와 Zombie Objects","tags":["dangling-pointer","zombie","exc-bad-access","asan","objective-c"],"question":"해제된 객체에 접근하는 댕글링 포인터(야생 포인터)는 ARC 환경에서 어떤 상황에 생기나요?","source":{"kind":"company","company":"Xiaohongshu"}},{"id":"MEM-039","type":"short","category":"memory-arc","difficulty":3,"topic":"ARC vs 가비지 컬렉션","tags":["arc","garbage-collection","deterministic","design-rationale","jetsam"],"question":"iOS는 참조 카운트(ARC)로 메모리를 관리합니다. 만약 참조 카운트 없이 자동 메모리 관리를 구현해야 한다면 어떤 방식이 가능한가요?","source":{"kind":"company","company":"Shopee"}},{"id":"MEM-040","type":"short","category":"memory-arc","difficulty":2,"topic":"누수 수정의 증명","tags":["leak","memory-graph","instruments","regression-test","deinit"],"question":"실제로 겪은 메모리 누수를 하나 떠올려 보세요. 어떻게 발견했고, 원인을 어떻게 특정했으며, \"고쳐졌다\"는 것을 어떻게 증명했나요?","source":{"kind":"company","company":"CRED"}},{"id":"MEM-041","type":"short","category":"memory-arc","difficulty":2,"topic":"retain cycle 예시와 싱글톤","tags":["retain-cycle","closure","singleton","weak-self","lifetime"],"question":"retain cycle이 생기는 구체적인 코드 예시를 하나 들고 고쳐 보세요.","source":{"kind":"community","company":"DoorDash"}},{"id":"MEM-042","type":"short","category":"memory-arc","difficulty":2,"topic":"클로저 캡처 순환 참조","tags":["closures","retain-cycle","weak-self","arc"],"question":"메시지 앱의 ViewModel이 프로퍼티로 오래 보관하는 completion 클로저 안에서 `self.messages`를 갱신합니다. 어떤 참조 그래프 때문에 retain cycle이 생깁니까?","source":{"kind":"community","company":"Slack"}},{"id":"MEM-043","type":"short","category":"memory-arc","difficulty":1,"topic":"ARC 소유권과 해제 시점","tags":["arc","ownership","deinit","strong-reference"],"question":"Swift로 만든 iOS 앱에서 ARC는 class 인스턴스의 수명을 어떻게 관리합니까?","source":{"kind":"community","company":"Teladoc Health"}},{"id":"MEM-044","type":"short","category":"memory-arc","difficulty":2,"topic":"깊은 복사·얕은 복사와 COW","tags":["copy","cow","value-semantics","memory"],"question":"Swift에서 `var b = a`로 큰 배열을 다른 변수에 대입한 뒤 `b`만 수정했습니다. 이때 일어나는 것이 얕은 복사인지 깊은 복사인지, Copy-on-Write와 함께 설명해 주세요.","source":{"kind":"company","company":"Xiaomi"}},{"id":"MEM-045","type":"short","category":"memory-arc","difficulty":3,"topic":"저장된 클로저와 self 수명","tags":["closure","retain-cycle","completion","lifetime"],"question":"UIKit ViewController가 프로퍼티에 저장해 둔 업로드 완료 Block이 ViewController의 라벨을 바꿉니다. 업로드가 끝난 뒤에도 프로퍼티에 남아 있는 이 클로저와 self 사이의 고리를 어떻게 끊겠습니까?","source":{"kind":"company","company":"JD.com"}},{"id":"MEM-046","type":"short","category":"memory-arc","difficulty":2,"topic":"화면 전환 뒤 객체 해제 확인","tags":["memory-graph","viewcontroller","timer","observer"],"question":"UIKit 화면을 닫았는데 그 ViewController가 계속 메모리에 남아 있습니다. `deinit` 로그만 믿지 않고 누가 붙잡고 있는지 어떻게 찾겠습니까?","source":{"kind":"community","company":"Zillow"}},{"id":"MEM-047","type":"short","category":"memory-arc","difficulty":1,"topic":"unowned 접근 위험","tags":["unowned","weak","runtime-trap","arc"],"question":"옵셔널 언래핑이 귀찮아서 모든 delegate를 `weak` 대신 `unowned`로 선언하려는 동료가 있습니다. unowned 참조가 옵셔널이 아닌 이유는 무엇입니까?","source":{"kind":"community","company":"Deloitte"}},{"id":"MEM-048","type":"short","category":"memory-arc","difficulty":3,"topic":"값 타입 내부 참조의 공유","tags":["struct","class","value-semantics","reference"],"question":"웹툰 앱의 `Episode` struct 안에 class 타입인 `ImageCache` 프로퍼티가 있습니다. 이 struct를 복사한 뒤 한쪽에서 캐시를 바꾸면 다른 쪽에는 어떤 상태가 공유됩니까?","source":{"kind":"company","company":"네이버웹툰"}},{"id":"NET-001","type":"short","category":"networking","difficulty":1,"topic":"URLSession 구조","tags":["urlsession","urlsessionconfiguration","task","shared"],"question":"`URLSession.shared` 하나로만 통신하던 앱을 넘겨받았습니다. URLSession이 요청 하나를 처리할 때 관여하는 객체들(세션·설정·태스크)의 역할을 설명해 주세요.","source":{"kind":"community"}},{"id":"NET-002","type":"mcq","category":"networking","difficulty":1,"topic":"백그라운드 전송","tags":["background-session","downloadtask","uploadtask"],"question":"URLSession 을 쓰는 앱에서, 사용자가 앱을 홈으로 내보내도 대용량 파일 다운로드가 계속 진행되고, 완료까지 올바르게 처리되게 하려 합니다. 필요한 조건을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"NET-003","type":"short","category":"networking","difficulty":1,"topic":"Codable JSON 디코딩","tags":["codable","decodable","jsondecoder","serialization"],"question":"서버 응답이 `{\"user_id\": 3, \"created_at\": \"2026-09-11T02:00:00Z\"}` 형태로 옵니다. 이 응답을 Codable로 Swift 모델에 매핑하는 과정을 설명해 주세요.","source":{"kind":"community"}},{"id":"NET-004","type":"short","category":"networking","difficulty":2,"topic":"불안정한 응답 스키마 처리","tags":["codable","optional","decodeifpresent","schema"],"question":"Codable 로 다음 모델에 응답을 디코딩하는데, 서버가 `nickname` 필드를 어떤 응답에는 넣고 어떤 응답에는 아예 빼고 보냅니다. 지금 코드에서 무슨 일이 생기나요?\n\n```swift\nstruct Profile: Decodable {\n    let id: Int\n    let nickname: String\n    let tags: [String]\n}\n```","source":{"kind":"community"}},{"id":"NET-005","type":"mcq","category":"networking","difficulty":2,"topic":"Codable 디코딩 결과 예측","tags":["codable","decodable","optional","null"],"question":"Codable 로 JSON 을 디코딩하는 다음 코드를 실행하면 어떻게 되나요?\n\n```swift\nstruct Item: Decodable {\n    let id: Int\n    let name: String?\n    let price: Double\n}\nlet json = #\"{\"id\": 1, \"name\": null, \"price\": \"9.99\"}\"#\nlet item = try JSONDecoder().decode(Item.self, from: Data(json.utf8))\n```","source":{"kind":"original"}},{"id":"NET-006","type":"short","category":"networking","difficulty":2,"topic":"API 에러 처리 설계","tags":["error-handling","result","typed-throws","http-status"],"question":"네트워크 계층에서 `completion(nil)`로 실패를 뭉뚱그려 넘기는 코드를 봤습니다. 시니어라면 API 에러를 어떻게 모델링하고 화면까지 전달하겠습니까?","source":{"kind":"community"},"since":"Swift 6"},{"id":"NET-007","type":"short","category":"networking","difficulty":2,"topic":"재시도 전략","tags":["retry","exponential-backoff","jitter","idempotency"],"question":"결제 확인 API가 가끔 타임아웃이 납니다. 후배가 \"실패하면 3번 더 보내자\"는 PR을 올렸습니다. 어떤 점을 지적하시겠습니까?","source":{"kind":"community"}},{"id":"NET-008","type":"mcq","category":"networking","difficulty":2,"topic":"재시도 대상 판단","tags":["retry","http-status","transient-error"],"question":"멱등한 GET 요청이 실패했습니다. 자동 재시도(백오프 포함)가 적절한 실패를 **모두** 고르세요.","source":{"kind":"original"}},{"id":"NET-009","type":"short","category":"networking","difficulty":2,"topic":"응답 캐싱과 메모리 캐시","tags":["urlcache","nscache","http-cache","memory-warning"],"question":"이미지가 많은 피드 앱에서 메모리 경고가 자주 뜹니다. 응답 캐시를 어떻게 구성했어야 하는지 말해 주세요.","source":{"kind":"community"}},{"id":"NET-010","type":"mcq","category":"networking","difficulty":2,"topic":"NSCache 특성","tags":["nscache","dictionary","cache"],"question":"`NSCache`가 `Dictionary`와 다른 점으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"NET-011","type":"short","category":"networking","difficulty":4,"topic":"네트워크 계층 관측과 요청 우선순위","tags":["urlsessiontaskmetrics","priority","http2","connection-coalescing","circuit-breaker","observability"],"question":"\"특정 지역 사용자만 앱이 느리다\"는 리포트가 왔지만 서버 지표는 정상입니다. 앱의 네트워크 계층에서 무엇을 측정해 원인(DNS·연결·TLS·서버 대기·전송)을 나누겠습니까?","source":{"kind":"original"},"since":"iOS 10"},{"id":"NET-012","type":"short","category":"networking","difficulty":3,"topic":"HTTPS·TLS 동작","tags":["https","tls","certificate","ats","handshake"],"question":"앱이 `https://api.example.com`에 요청을 보낼 때 첫 바이트가 오기까지 TLS 수준에서 무슨 일이 일어나는지 설명해 주세요.","source":{"kind":"community"}},{"id":"NET-013","type":"short","category":"networking","difficulty":3,"topic":"이미지 업로드 파이프라인","tags":["multipart","upload","heic","photokit","background-upload"],"question":"프로필 사진 여러 장을 업로드하는 기능을 만든다고 합시다. 라이브러리가 대신해 주는 multipart 요청은 실제로 어떻게 생겼나요?","source":{"kind":"community"}},{"id":"NET-014","type":"mcq","category":"networking","difficulty":1,"topic":"URLComponents 와 URL 인코딩","tags":["urlcomponents","percent-encoding","query","url"],"question":"검색어 `\"café & bar\"`를 쿼리 파라미터 `q`에 실어 `https://api.example.com/search`에 보내려 합니다. URL 구성에 대한 설명으로 **옳은 것을 모두** 고르세요.","source":{"kind":"original"}},{"id":"NET-015","type":"mcq","category":"networking","difficulty":2,"topic":"HTTP/1.1 vs HTTP/2","tags":["http2","multiplexing","hpack","urlsession"],"question":"HTTP/1.1과 비교한 HTTP/2의 특징으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"NET-016","type":"short","category":"networking","difficulty":2,"topic":"네트워크 연결 상태 처리","tags":["nwpathmonitor","waitsforconnectivity","reachability","connectivity","offline"],"question":"앱이 시작될 때 \"인터넷 연결이 없습니다\" 팝업을 띄우려고 Reachability 로 미리 검사하는 코드가 있습니다. 이 접근의 문제는 무엇입니까?","source":{"kind":"original"},"since":"iOS 12"},{"id":"NET-017","type":"short","category":"networking","difficulty":3,"topic":"WebSocket 연결 관리","tags":["websocket","urlsessionwebsockettask","reconnect","ping","background"],"question":"채팅 앱의 WebSocket 연결이 잘 끊기고, 끊긴 것을 앱이 늦게 알아챈다는 버그 리포트를 받았습니다. iOS에서 연결이 끊긴 것을 제때 알아채려면 어떻게 하겠습니까?","source":{"kind":"community"},"since":"iOS 13"},{"id":"NET-018","type":"mcq","category":"networking","difficulty":1,"topic":"HTTP 메서드와 멱등성","tags":["rest","http-method","idempotent"],"question":"REST API에서 같은 요청을 여러 번 보내도 서버 상태가 한 번 보낸 것과 같은(멱등한) 메서드를 **모두** 고르세요.","source":{"kind":"community"}},{"id":"NET-019","type":"short","category":"networking","difficulty":3,"topic":"특정 네트워크 환경 장애 진단","tags":["debugging","wifi","captive-portal","proxy","ipv6","nwpathmonitor"],"question":"\"셀룰러에서는 되는데 회사 Wi-Fi에서만 이미지 업로드가 실패한다\"는 제보가 왔습니다. 어떤 원인들을 의심하겠습니까?","source":{"kind":"community"}},{"id":"NET-020","type":"short","category":"networking","difficulty":2,"topic":"동기 요청과 async/await 전환","tags":["async-await","urlsession","nsurlconnection","main-thread","semaphore"],"question":"레거시 코드에 `DispatchSemaphore`로 URLSession 응답을 기다려 '동기'로 만든 함수가 있고, 더 오래된 곳엔 `NSURLConnection.sendSynchronousRequest`도 남아 있습니다. 왜 문제인가요?","source":{"kind":"community"},"since":"iOS 15"},{"id":"NET-021","type":"mcq","category":"networking","difficulty":3,"topic":"async URLSession 취소","tags":["async-await","cancellation","task","urlerror"],"question":"Swift Concurrency 로 URLSession 요청을 보내는 다음 코드에서 `task.cancel()`이 네트워크 응답보다 먼저 호출됐습니다. 결과는?\n\n```swift\nlet task = Task {\n    do {\n        let (data, _) = try await URLSession.shared.data(from: url)\n        print(\"received \\(data.count)\")\n    } catch {\n        print(\"error: \\(error)\")\n    }\n}\ntask.cancel()\n```","source":{"kind":"original"},"since":"iOS 15"},{"id":"NET-022","type":"short","category":"networking","difficulty":3,"topic":"토큰 갱신 동시성","tags":["auth","token-refresh","actor","401","race-condition"],"question":"화면 진입 시 API 5개가 동시에 나가는데, 액세스 토큰이 만료돼 5개 모두 401을 받았습니다. 지금 코드는 각 요청이 각자 리프레시를 호출해 서버가 refresh token을 무효화해 버립니다(로그아웃 발생). 어떻게 고치겠습니까?","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"NET-023","type":"short","category":"networking","difficulty":4,"topic":"API→리스트 실습 우선순위","tags":["live-coding","architecture","error-handling","pagination","testing"],"question":"1시간 실습으로 \"공개 API를 호출해 리스트로 보여 주는 앱\"을 만들라고 하면, 아키텍처·에러 처리·UI 성능을 평가한다고 합니다. 시니어로서 어떤 순서로 무엇을 만들겠습니까?","source":{"kind":"community","company":"PayPal"},"since":"iOS 17"},{"id":"NET-024","type":"mcq","category":"networking","difficulty":3,"topic":"URLSessionConfiguration 옵션","tags":["urlsessionconfiguration","waitsforconnectivity","timeout"],"question":"URLSession 을 쓰는 앱에서, 지하철에서 잠깐 연결이 끊긴 사용자의 요청이 즉시 실패 대신 연결이 돌아올 때까지 기다렸다가 자동으로 진행되게 하고 싶습니다. 가장 적절한 설정은?","source":{"kind":"original"}},{"id":"NET-025","type":"short","category":"networking","difficulty":4,"topic":"백그라운드 세션 완료 처리","tags":["background-session","handleeventsforbackgroundurlsession","downloadtask","delegate"],"question":"백그라운드 `URLSession`으로 대용량 파일을 받는 중 사용자가 앱을 완전히 종료했습니다(스와이프 업은 아님, 시스템 종료). 다운로드가 끝났을 때 앱에서 정확히 무슨 일이 순서대로 일어나야 파일을 잃지 않나요?","source":{"kind":"original"}},{"id":"NET-026","type":"mcq","category":"networking","difficulty":4,"topic":"HTTP 캐시 재검증","tags":["urlcache","etag","cache-control","304"],"question":"서버 응답이 `Cache-Control: max-age=60`과 `ETag: \"abc\"`를 포함했고 `URLCache`에 저장됐습니다. 기본 캐시 정책(`.useProtocolCachePolicy`)으로 **90초 뒤** 같은 GET을 보내면 URLSession은 무엇을 하나요?","source":{"kind":"original"}},{"id":"NET-027","type":"short","category":"networking","difficulty":3,"topic":"이미지 다운로더·캐시 설계(요청 병합)","tags":["image-cache","nscache","actor","in-flight","cancellation","live-coding"],"question":"코딩 인터뷰에서 \"URL 로 이미지를 받아 오고, 이전에 받은 적이 있으면 캐시에서 돌려주는 `ImageManager` 를 30분 안에 만들어 보라\"는 과제를 받았습니다. 같은 URL 을 여러 셀이 동시에 요청하는 경우를 어떻게 처리하겠습니까?","source":{"kind":"company","company":"Apple"}},{"id":"NET-028","type":"mcq","category":"networking","difficulty":2,"topic":"서드파티 없이 이미지 다운로드","tags":["urlsession","datatask","downloadtask","main-thread","cell-reuse"],"question":"온사이트 화이트보드에서 \"Kingfisher 같은 라이브러리 없이 URL 목록의 이미지를 받아 리스트 셀에 표시하라\"는 과제를 받았습니다. 올바른 설명을 **모두** 고르세요.","source":{"kind":"company","company":"Google"}},{"id":"NET-029","type":"short","category":"networking","difficulty":2,"topic":"제공된 completion 코드와 비동기 스타일 선택","tags":["async-await","continuation","combine","dependency-injection","live-coding"],"question":"코딩 스크린에서 회사가 준 completion handler 기반 네트워킹 코드와 JSON 파일로 리스트 화면을 만들라고 하면서, async/await·Combine·completion handler 중 무엇을 써도 좋다고 합니다. 무엇을 골라 제공된 코드를 어떻게 연결하겠습니까?","source":{"kind":"company","company":"DoorDash"},"since":"Swift 5.5"},{"id":"NET-030","type":"short","category":"networking","difficulty":3,"topic":"검색 요청 디바운스·취소·순서 역전","tags":["search","debounce","task-cancellation","race-condition","async-await"],"question":"검색바에 글자를 입력할 때마다 서버 검색 API 를 호출해 결과 리스트를 갱신하는 화면을 서드파티 없이 만들라고 합니다. 타이핑이 빠른 사용자에게서 생기는 문제를 async/await 로 어떻게 해결하겠습니까?","source":{"kind":"company","company":"DoorDash"},"since":"Swift 5.5"},{"id":"NET-031","type":"short","category":"networking","difficulty":3,"topic":"송금 중 네트워크 단절과 멱등키","tags":["idempotency","retry","payments","reliability","post"],"question":"사용자가 송금 버튼을 눌렀는데 요청이 나간 직후 신호가 끊겼습니다. 앱은 무엇을 해야 하나요?","source":{"kind":"company","company":"PayPal"}},{"id":"NET-032","type":"mcq","category":"networking","difficulty":3,"topic":"결제 요청 타임아웃 처리","tags":["timeout","idempotency","retry","urlsessionconfiguration","payments"],"question":"결제 확정 `POST /payments` 요청이 `URLError.timedOut` 으로 실패했습니다. 옳은 설명을 **모두** 고르세요.","source":{"kind":"community","company":"Revolut"}},{"id":"NET-033","type":"short","category":"networking","difficulty":2,"topic":"HTTPS 패킷 캡처 원리와 방어","tags":["https","mitm","proxy","certificate-pinning","charles","debugging"],"question":"Charles·Proxyman 같은 도구는 HTTPS 로 암호화된 앱 트래픽을 어떻게 평문으로 보여 줄 수 있나요?","source":{"kind":"company","company":"ByteDance"}},{"id":"NET-034","type":"short","category":"networking","difficulty":3,"topic":"대용량 파일 이어받기와 무결성","tags":["range-request","resume-data","download-task","integrity","background-session"],"question":"수백 MB 짜리 오디오 파일을 받다가 앱이 종료되거나 네트워크가 끊겼을 때, 처음부터 다시 받지 않고 이어받는 기능을 구현하려 합니다. HTTP 에서 어떤 헤더가 관여하나요?","source":{"kind":"company","company":"NetEase"}},{"id":"NET-035","type":"short","category":"networking","difficulty":2,"topic":"URLSession 리다이렉트 처리","tags":["redirect","urlsession-delegate","authorization-header","302","307"],"question":"로그인 후 `Authorization` 헤더를 붙여 보낸 요청이 서버에서 `302` 로 다른 호스트로 리다이렉트되자 `401` 이 돌아옵니다. 이 `401` 은 왜 생겼을까요?","source":{"kind":"company","company":"Tencent"}},{"id":"NET-036","type":"short","category":"networking","difficulty":2,"topic":"HTTPDNS 의 목적과 부작용","tags":["dns","httpdns","sni","cdn","server-trust"],"question":"특정 통신사·지역 사용자만 API 접속이 느리거나 엉뚱한 서버로 붙는다는 제보가 있고, 팀 선배는 \"HTTPDNS 를 붙이자\" 고 합니다. HTTPDNS 는 기존 DNS 의 어떤 문제를 겨냥한 것인가요?","source":{"kind":"company","company":"Alibaba"}},{"id":"NET-037","type":"mcq","category":"networking","difficulty":3,"topic":"TLS 1.2 대비 1.3 의 변화","tags":["tls","tls13","handshake","forward-secrecy","0-rtt"],"question":"서버팀이 TLS 1.3 으로 올렸더니 앱 접속이 더 빨라졌다고 합니다. TLS 1.2 대비 1.3 의 변화로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Meituan"}},{"id":"NET-038","type":"mcq","category":"networking","difficulty":1,"topic":"HTTP 상태 코드 이해","tags":["http","status-code","401","403","429"],"question":"HTTP 응답 상태 코드에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"카카오"}},{"id":"NET-039","type":"mcq","category":"networking","difficulty":2,"topic":"URLRequest 로 JSON POST 보내기","tags":["urlrequest","post","content-type","status-code","code-review"],"question":"사전 과제로 `URLRequest` 를 써서 JSON 을 POST 하는 코드를 작성했습니다. 이 코드의 문제로 옳은 것을 **모두** 고르세요.\n\n```swift\nfunc submit(_ body: Order) async throws -> Receipt {\n    var request = URLRequest(url: url)\n    request.httpMethod = \"POST\"\n    request.httpBody = try JSONEncoder().encode(body)\n    let (data, _) = try await URLSession.shared.data(for: request)\n    return try JSONDecoder().decode(Receipt.self, from: data)\n}\n```","source":{"kind":"company","company":"토스"}},{"id":"NET-040","type":"short","category":"networking","difficulty":2,"topic":"RESTful API 를 클라이언트 관점에서","tags":["rest","http-method","idempotent","api-design","status-code"],"question":"면접관이 \"RESTful API 가 뭔지 설명해 보라\" 고 했습니다. 교과서 정의를 넘어, iOS 클라이언트를 만드는 입장에서 REST 답게 설계된 API 와 그렇지 않은 API 의 차이가 클라이언트 코드에 어떻게 드러나는지 이야기해 주세요.","source":{"kind":"company","company":"이베이코리아"}},{"id":"NET-041","type":"short","category":"networking","difficulty":2,"topic":"URLSession 위의 간단한 네트워킹 레이어 설계","tags":["networking-layer","endpoint","generic","error-handling","urlsession"],"question":"폰스크린에서 \"Swift 로 간단한 네트워킹 레이어를 설계해 보라\" 는 질문을 받았습니다. 서드파티 없이 `URLSession` 위에 어떤 타입들을 두고 각 타입이 무엇을 책임지는지 설명해 주세요.","source":{"kind":"community","company":"Citi"}},{"id":"NET-042","type":"short","category":"networking","difficulty":2,"topic":"JSON 목록 받아 정렬해 표시하기(라이브 코딩)","tags":["json","codable","sorting","live-coding","date-decoding"],"question":"시니어 iOS 가상 온사이트 라이브 코딩입니다. \"공개 JSON API 에서 콘텐츠 목록을 받아 파싱한 뒤, 제목순 또는 날짜순으로 정렬해 보여 주는 앱\" 을 검색 없이 만들어야 합니다. '정렬' 요구가 붙었을 때 정렬 키의 타입과 문자열 비교에서 특히 신경 써야 할 것은 무엇입니까?","source":{"kind":"company","company":"Calm"}},{"id":"NET-043","type":"short","category":"networking","difficulty":2,"topic":"XML 응답 파싱과 표시용 변환 계층","tags":["xml","xmlparser","parsing","take-home","presentation-layer"],"question":"테이크홈 과제로 \"자사 API 에서 XML 피드를 내려받아 목록으로 보여 주고, 영어 문자열을 임의의 '화성어' 로 바꿔 보여 주는 기능을 추가하라\" 는 요구를 받았습니다. JSON 이 아닌 XML 을 서드파티 없이 Swift 에서 어떻게 모델로 파싱하겠습니까?","source":{"kind":"community","company":"The New York Times"}},{"id":"NET-044","type":"mcq","category":"networking","difficulty":3,"topic":"대용량 미디어 다운로드 구현","tags":["download-task","background-session","media","resume-data","discretionary"],"question":"비디오·오디오 파일(수백 MB~GB)을 앱에서 내려받아 오프라인 재생하는 기능을 만듭니다. `URLSession` 기반 구현에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community","company":"Sony"}},{"id":"NET-045","type":"mcq","category":"networking","difficulty":1,"topic":"전송 계층 프로토콜과 데이터링크 기초","tags":["tcp","udp","arp","osi","network-basics"],"question":"iOS 개발자 1차 면접에서 \"전송 계층에는 어떤 프로토콜이 있고, 데이터링크 계층의 프레임과 ARP 는 무엇인가\" 라는 네트워크 기초 질문을 받았습니다. 다음 설명 중 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"SAP"}},{"id":"NET-046","type":"short","category":"networking","difficulty":3,"topic":"REST 스냅샷 + WebSocket 증분 스트림 정합성","tags":["websocket","snapshot","sequence-number","orderbook","consistency"],"question":"거래소 앱의 호가·시세 화면입니다. 처음엔 REST 로 현재 스냅샷을 받고 이후 WebSocket 으로 변경분(증분)만 받아 갱신하도록 설계했는데, 가끔 화면의 호가가 실제와 어긋나는 버그가 있습니다. 스냅샷과 증분 스트림을 어떤 순서·규칙으로 결합해야 정합성이 깨지지 않나요?","source":{"kind":"community","company":"코인원"}},{"id":"NET-047","type":"mcq","category":"networking","difficulty":3,"topic":"라이브 방송: HLS 와 WebSocket 의 역할 분담","tags":["hls","websocket","streaming","live","latency"],"question":"라이브 오디오 방송 앱에서 방송 오디오는 HLS 로 재생하고 채팅은 WebSocket 으로 주고받습니다. 두 프로토콜의 특성과 선택 이유에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community","company":"스푼라디오"}},{"id":"NET-048","type":"short","category":"networking","difficulty":3,"topic":"HLS 위의 FairPlay Streaming 키 교환","tags":["hls","fairplay","drm","avcontentkeysession","offline-playback"],"question":"음원·영상 스트리밍 앱에서 유료 콘텐츠를 HLS 로 재생하는데, 저작권 보호를 위해 FairPlay Streaming(DRM) 을 붙여야 합니다. HLS 재생 흐름 위에서 FairPlay 키 교환이 어떻게 일어나는지(앱·키 서버·AVFoundation 의 역할) 설명해 주세요.","source":{"kind":"community","company":"카카오엔터테인먼트"},"since":"iOS 11"},{"id":"PERF-001","type":"short","category":"performance","difficulty":1,"topic":"Xcode 디버깅 기능","tags":["xcode","debugging","breakpoint","lldb","view-debugger"],"question":"버그를 재현했을 때 Xcode에서 실제로 자주 쓰는 디버깅 기능을 말해 주세요. print만 찍는 것 말고, 각 기능을 언제 꺼내 쓰는지도 함께요.","source":{"kind":"community"}},{"id":"PERF-002","type":"mcq","category":"performance","difficulty":1,"topic":"브레이크포인트","tags":["xcode","breakpoint","debugging"],"question":"Xcode 브레이크포인트로 **코드를 수정하지 않고** 할 수 있는 일을 모두 고르세요.","source":{"kind":"community"}},{"id":"PERF-003","type":"short","category":"performance","difficulty":2,"topic":"Instruments 프로파일링","tags":["instruments","time-profiler","allocations","profiling"],"question":"\"앱이 느리다\"는 막연한 피드백만 받았습니다. Instruments로 어떻게 접근하나요?","source":{"kind":"community","company":"Apple"}},{"id":"PERF-004","type":"mcq","category":"performance","difficulty":1,"topic":"Instruments 템플릿 선택","tags":["instruments","time-profiler"],"question":"특정 버튼을 누르면 화면이 1초 정도 멈춥니다. \"메인 스레드에서 어떤 함수가 시간을 잡아먹는지\"를 보려면 가장 먼저 어떤 Instruments 템플릿을 켜야 할까요?","source":{"kind":"original"}},{"id":"PERF-005","type":"short","category":"performance","difficulty":2,"topic":"크래시 조사 프로세스","tags":["crash","crashlytics","organizer","triage"],"question":"\"어제 배포한 버전에서 크래시가 급증했다\"는 알림을 받았습니다. 지금부터 무엇을 어떤 순서로 하나요?","source":{"kind":"community"}},{"id":"PERF-006","type":"short","category":"performance","difficulty":2,"topic":"크래시 로그 심볼리케이션","tags":["crash","dsym","symbolication","crash-log"],"question":"사용자가 보낸 크래시 로그에 함수명 대신 16진수 주소만 찍혀 있습니다. 읽을 수 있게 만들려면 무엇이 필요한가요?","source":{"kind":"community","company":"Apple"}},{"id":"PERF-007","type":"mcq","category":"performance","difficulty":2,"topic":"크래시 유형 판별","tags":["crash","exc_breakpoint","sigtrap","swift-runtime"],"question":"크래시 리포트에 `EXC_BREAKPOINT (SIGTRAP)` 가 찍혔습니다. Swift 앱에서 이 유형을 만드는 상황을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"PERF-008","type":"short","category":"performance","difficulty":3,"topic":"OOM 종료 탐지","tags":["oom","jetsam","metrickit","memory","crashlytics"],"question":"사용자들이 \"앱이 그냥 꺼진다\"고 하는데 Crashlytics에는 아무 기록이 없습니다. 메모리 부족(OOM) 종료를 의심한다면 어떻게 확인하고 데이터를 모으나요?","source":{"kind":"company","company":"TikTok"},"since":"iOS 14"},{"id":"PERF-009","type":"short","category":"performance","difficulty":3,"topic":"메모리 경고 대응","tags":["memory-warning","image","nscache","downsampling","memory"],"question":"사진 편집 앱이 메모리 경고를 자주 받고 가끔 종료됩니다. 어떤 순서로 원인을 찾겠습니까?","source":{"kind":"community"}},{"id":"PERF-010","type":"short","category":"performance","difficulty":2,"topic":"os_signpost 기반 구간 계측","tags":["os_signpost","logger","instruments","points-of-interest","measurement"],"question":"\"검색 결과가 뜨기까지 너무 오래 걸린다\"는 제보를 받았습니다. `print`에 타임스탬프를 찍는 대신 무엇으로 구간을 측정하겠습니까?","source":{"kind":"original"},"since":"iOS 12"},{"id":"PERF-011","type":"mcq","category":"performance","difficulty":2,"topic":"스크롤 버벅임 원인","tags":["scroll","main-thread","offscreen-rendering","autolayout"],"question":"UICollectionView 스크롤이 끊기는 앱을 받았습니다. 다음 중 **끊김의 원인이 될 수 있는 것**을 모두 고르세요.","source":{"kind":"original"}},{"id":"PERF-012","type":"short","category":"performance","difficulty":3,"topic":"앱 런치 타임","tags":["launch-time","dyld","pre-main","app-launch","cold-start"],"question":"콜드 스타트가 3초 넘게 걸리는 앱을 넘겨받았습니다. 런치 시간을 어떻게 나눠서 측정하겠습니까?","source":{"kind":"original"}},{"id":"PERF-013","type":"mcq","category":"performance","difficulty":3,"topic":"pre-main 최적화","tags":["launch-time","dyld","pre-main","mergeable-libraries"],"question":"앱 런치의 **pre-main 구간**(main() 호출 전) 시간을 줄이는 데 실제로 효과가 있는 방법을 모두 고르세요.","source":{"kind":"original"},"since":"Xcode 15"},{"id":"PERF-014","type":"short","category":"performance","difficulty":2,"topic":"내비게이션 스택 최적화","tags":["uinavigationcontroller","memory","view-controller","navigation"],"question":"딥링크나 복원 로직 때문에 UINavigationController에 뷰 컨트롤러를 수십 개 연속으로 push해야 하는 상황입니다. 이걸 그대로 하면 어떤 문제가 생기나요?","source":{"kind":"community","company":"Google"}},{"id":"PERF-015","type":"short","category":"performance","difficulty":3,"topic":"메모리 버그 진단 도구","tags":["memory","leaks","zombies","memory-graph","address-sanitizer","debugging"],"question":"iOS에서 흔히 만나는 메모리 버그 유형에는 순환 참조 누수 말고도 무엇이 있나요? 특히 오래 걸렸던 사례가 있다면 어떤 유형이었는지도요.","source":{"kind":"company","company":"TikTok"}},{"id":"PERF-016","type":"mcq","category":"performance","difficulty":2,"topic":"진단 도구 매칭","tags":["zombies","exc_bad_access","debugging"],"question":"Xcode 로 디버깅 중인 앱에서 간헐적으로 `EXC_BAD_ACCESS`가 나는데 어떤 객체가 이미 해제된 상태에서 접근되는지 모릅니다. 가장 직접적으로 \"어떤 클래스의 인스턴스에 메시지를 보냈는지\"를 알려 주는 진단 옵션은?","source":{"kind":"original"}},{"id":"PERF-017","type":"short","category":"performance","difficulty":3,"topic":"행(Hang) 진단","tags":["hang","main-thread","metrickit","thread-performance-checker","responsiveness"],"question":"특정 화면에서 가끔 1초 정도 화면이 멈춘다는 제보가 있지만 개발 환경에서는 재현되지 않습니다. 원인을 좁혀 가는 방법을 설명해 주세요.","source":{"kind":"original"},"since":"iOS 16"},{"id":"PERF-018","type":"mcq","category":"performance","difficulty":1,"topic":"자료구조 선택과 성능","tags":["array","set","complexity","hash"],"question":"같은 원소 10만 개를 담았을 때, `Array`보다 `Set`(NSSet)이 **확실히 빠른** 연산을 모두 고르세요.","source":{"kind":"community"}},{"id":"PERF-019","type":"short","category":"performance","difficulty":2,"topic":"코드 최적화 접근법","tags":["optimization","measurement","algorithm","profiling"],"question":"\"이 함수가 느리니 최적화해 달라\"는 요청을 받았습니다. 코드를 바로 고치기 전에 무엇을 하겠습니까?","source":{"kind":"company","company":"TikTok"}},{"id":"PERF-020","type":"mcq","category":"performance","difficulty":1,"topic":"성능 측정 조건","tags":["measurement","release","device","profiling"],"question":"앱 성능을 측정해 최적화 근거로 삼으려 합니다. **올바른 측정 방법**을 모두 고르세요.","source":{"kind":"community","company":"Apple"}},{"id":"PERF-021","type":"short","category":"performance","difficulty":3,"topic":"앱 용량 최적화","tags":["app-size","app-thinning","asset-catalog","on-demand-resources","binary-size"],"question":"앱 다운로드 용량이 200MB를 넘어 셀룰러 다운로드 경고가 뜹니다. 용량이 어디서 나오는지 어떻게 분석하겠습니까?","source":{"kind":"original"}},{"id":"PERF-022","type":"mcq","category":"performance","difficulty":3,"topic":"Animation Hitches 해석","tags":["hitch","animation-hitches","instruments","commit","render","promotion"],"question":"Instruments **Animation Hitches** 템플릿으로 스크롤을 녹화했습니다. 결과를 해석하는 설명으로 **옳은 것을 모두** 고르세요.","source":{"kind":"original"},"since":"iOS 14"},{"id":"PERF-023","type":"short","category":"performance","difficulty":4,"topic":"Time Profiler 콜 트리 해석","tags":["time-profiler","call-tree","instruments","sampling"],"question":"Time Profiler를 돌렸더니 메인 스레드 시간의 80%가 `CA::Transaction::commit`이나 UIKit 내부 프레임에 잡힙니다. 내 코드가 안 보이는데 이 결과를 어떻게 읽겠습니까?","source":{"kind":"original"}},{"id":"PERF-024","type":"short","category":"performance","difficulty":4,"topic":"ARC 트래픽 최적화","tags":["arc","swift_retain","time-profiler","borrowing","existential","optimization"],"question":"Time Profiler 에서 스크롤 중 핫패스의 상위 항목이 `swift_retain`·`swift_release`·`swift_bridgeObjectRetain`으로 채워져 있습니다. 왜 이런 일이 생기나요?","source":{"kind":"original"},"since":"Swift 5.9"},{"id":"PERF-025","type":"mcq","category":"performance","difficulty":4,"topic":"MetricKit","tags":["metrickit","diagnostics","hang","crash","launch-time"],"question":"MetricKit(`MXMetricManager`)을 통해 앱이 **실제로 받을 수 있는 데이터**를 모두 고르세요.","source":{"kind":"original"},"since":"iOS 14"},{"id":"PERF-026","type":"short","category":"performance","difficulty":4,"topic":"재현 불가 프로덕션 버그 조사","tags":["debugging","oslog","observability","feature-flag","production"],"question":"특정 사용자 0.1%에게만 나타나고 개발 환경에서는 절대 재현되지 않는 프로덕션 버그가 있습니다. 어떻게 접근하겠습니까?","source":{"kind":"community","company":"Apple"}},{"id":"PERF-027","type":"short","category":"performance","difficulty":2,"topic":"프로덕션 메모리 누수·크래시 식별","tags":["memory-leak","production","crash","metrickit","organizer"],"question":"하이어링 매니저가 묻습니다. \"개발 중이 아니라 **이미 출시된 앱**에서 메모리 누수가 있다는 걸 어떻게 알아채나요?\" 로컬 도구와 프로덕션 신호를 구분해서 답해 주세요.","source":{"kind":"company","company":"Walmart"},"since":"iOS 14"},{"id":"PERF-028","type":"short","category":"performance","difficulty":2,"topic":"스크롤 버벅임 진단 시작점","tags":["scroll","hitch","time-profiler","main-thread","image-decoding"],"question":"폰스크린에서 면접관이 묻습니다. \"사용자가 '스크롤이 버벅인다'고 신고했습니다. 어디서부터 시작하겠어요?\" 진단 순서와 각 단계에서 보는 것을 말해 주세요.","source":{"kind":"company","company":"PayPal"}},{"id":"PERF-029","type":"mcq","category":"performance","difficulty":3,"topic":"post-main 런치 최적화","tags":["launch-time","post-main","first-frame","didfinishlaunching"],"question":"앱 시작 시간을 줄이려 합니다. `main()` 이후 **첫 프레임이 그려질 때까지(post-main)** 구간을 실제로 단축하는 방법을 모두 고르세요.","source":{"kind":"company","company":"Microsoft"}},{"id":"PERF-030","type":"short","category":"performance","difficulty":3,"topic":"대용량 이미지 메모리 압박","tags":["image","downsampling","imageio","memory","nscache"],"question":"50MB짜리 사진 한 장을 화면에 보여줘야 합니다. 그냥 `UIImage(contentsOfFile:)`로 올리면 메모리가 얼마나 드나요?","source":{"kind":"company","company":"Trip.com"}},{"id":"PERF-031","type":"mcq","category":"performance","difficulty":2,"topic":"디코딩 이미지 메모리 계산","tags":["image","memory","bitmap","png","decoding"],"question":"100×100 픽셀 RGBA PNG 파일(디스크 크기 3KB)을 디코딩해 화면에 그릴 때, 비트맵이 차지하는 메모리에 **가장 가까운** 값은?","source":{"kind":"company","company":"Kuaishou"}},{"id":"PERF-032","type":"short","category":"performance","difficulty":3,"topic":"앱 내 렉(hang) 모니터 구현","tags":["hang","runloop","watchdog","main-thread","monitoring"],"question":"사내 APM에 \"메인 스레드가 일정 시간 이상 멈추면 스택을 남기는\" 기능을 넣으려 합니다. 앱 안에서 렉(卡顿)을 어떻게 감지하겠습니까?","source":{"kind":"company","company":"Tencent"}},{"id":"PERF-033","type":"short","category":"performance","difficulty":3,"topic":"프레임 드롭의 CPU vs GPU 병목","tags":["frame-drop","gpu","cpu","offscreen-rendering","core-animation"],"question":"프레임 드롭이 나는 원인을 CPU 쪽과 GPU 쪽으로 나눠 설명해 주세요.","source":{"kind":"company","company":"Meituan"}},{"id":"PERF-034","type":"short","category":"performance","difficulty":4,"topic":"크래시 리포트 수집 시스템 설계","tags":["crash-reporting","signal","mach-exception","dsym","symbolication"],"question":"서드파티 SDK를 못 쓰는 환경이라 **크래시 로그 수집 시스템을 직접 설계**해야 합니다. 앱 안에서 크래시를 어떻게 잡아 기록하나요?","source":{"kind":"company","company":"Kuaishou"}},{"id":"PERF-035","type":"mcq","category":"performance","difficulty":2,"topic":"출시 앱 크래시 수집 수단","tags":["crash","production","organizer","metrickit","testflight"],"question":"이미 App Store에 출시된 앱에서 **크래시를 감지·수집할 수 있는 수단**을 모두 고르세요.","source":{"kind":"company","company":"Didi"},"since":"iOS 14"},{"id":"PERF-036","type":"short","category":"performance","difficulty":2,"topic":"시스템 자원 효율적 사용","tags":["energy","battery","memory","network","resource-efficiency"],"question":"폰스크린 질문입니다. \"iOS 앱을 설계할 때 시스템 자원(CPU·메모리·네트워크·배터리·디스크)을 효율적으로 쓰기 위해 어떤 것들을 염두에 두나요?\" 자원별로 구체적인 판단 기준을 들어 답해 주세요.","source":{"kind":"company","company":"Meta"}},{"id":"PERF-037","type":"mcq","category":"performance","difficulty":3,"topic":"메인 스레드 블록 지점 탐지","tags":["hang","main-thread","deadlock","debugging","backtrace"],"question":"앱이 특정 조작 후 완전히 멈췄습니다(입력 무반응). **메인 스레드가 어디서 블록됐는지** 알아내는 방법으로 옳은 것을 모두 고르세요.","source":{"kind":"company","company":"Xiaohongshu"}},{"id":"PERF-038","type":"short","category":"performance","difficulty":3,"topic":"내비게이션 앱 배터리 최적화","tags":["battery","energy","location","core-location","background"],"question":"지도·내비게이션 앱은 배터리를 많이 씁니다. 위치 추적 정확도를 유지하면서 배터리 소모를 최소화하려면 어떻게 설계하겠습니까?","source":{"kind":"community","company":"티맵모빌리티"}},{"id":"PERF-039","type":"short","category":"performance","difficulty":3,"topic":"앱 모니터링(APM) 도입·운영","tags":["monitoring","sentry","crashlytics","release-health","alerting"],"question":"Sentry나 Firebase Crashlytics 같은 모니터링을 팀에 처음 도입한다면 어떤 지표를 정의하겠습니까?","source":{"kind":"community","company":"밀리의서재"}},{"id":"PERF-040","type":"short","category":"performance","difficulty":3,"topic":"5초 화면 로딩 계측","tags":["performance","signpost","time-profiler","loading"],"question":"금융 앱의 계좌 상세 화면이 첫 표시까지 5초 걸립니다. 감으로 고치지 않으려면 그 5초를 어떤 구간으로 나누어 측정하겠습니까?","source":{"kind":"community","company":"HSBC"}},{"id":"PERF-041","type":"short","category":"performance","difficulty":2,"topic":"멈춤 현상 원인 찾기","tags":["hang","main-thread","metrickit","profiling"],"question":"출시된 iOS 앱이 가끔 몇 초 동안 터치에 반응하지 않는다는 리뷰가 올라옵니다. 사무실에서는 재현이 안 될 때 main thread가 멈춘 순간의 스택을 어떻게 손에 넣겠습니까?","source":{"kind":"company","company":"Xiaomi"}},{"id":"PERF-042","type":"short","category":"performance","difficulty":2,"topic":"Instruments 누수 조사","tags":["instruments","leaks","allocations","memory-graph"],"question":"특정 화면을 반복해서 열고 닫으면 앱 메모리가 계속 늘어납니다. Leaks, Allocations, Memory Graph를 어떤 순서로 쓰겠습니까?","source":{"kind":"community","company":"Comcast"}},{"id":"PERF-043","type":"short","category":"performance","difficulty":3,"topic":"대용량 이미지 파이프라인","tags":["images","downsampling","memory","imageio"],"question":"수십 MB짜리 사진을 편집하고 저장하는 iOS 기능이 메모리 경고 뒤 종료됩니다. 디코딩부터 저장까지 메모리 피크를 어떻게 낮추겠습니까?","source":{"kind":"community","company":"네이버"}},{"id":"PERF-044","type":"short","category":"performance","difficulty":2,"topic":"성능 개선의 기준선","tags":["performance","baseline","p95","regression"],"question":"\"검색 결과 화면이 40% 빨라졌다\"는 PR을 리뷰합니다. 작성자 노트북의 시뮬레이터 수치와 QA의 실기기 수치를 섞어 비교한 것 같습니다. 개선 주장을 검증할 baseline과 지표를 어떻게 정하겠습니까?","source":{"kind":"community","company":"마이리얼트립"}},{"id":"PERF-045","type":"short","category":"performance","difficulty":3,"topic":"스크롤 hitch 분석","tags":["scrolling","core-animation","prefetch","performance"],"question":"사진 피드 컬렉션 뷰가 스크롤 중 끊깁니다. 원인이 이미지 디코딩인지 레이아웃 계산인지 셀 구성인지 Instruments로 어떻게 구별하겠습니까?","source":{"kind":"community","company":"더스윙"}},{"id":"PERF-046","type":"short","category":"performance","difficulty":2,"topic":"크래시와 성능 상관 분석","tags":["crash","symbolication","performance","observability"],"question":"중고거래 앱 리뷰에 \"느려지다가 꺼진다\"는 말만 반복됩니다. crash log와 성능 trace를 어떻게 연결해 어느 문제부터 고칠지 정하겠습니까?","source":{"kind":"community","company":"중고나라"}},{"id":"PERF-047","type":"short","category":"performance","difficulty":2,"topic":"React Native 성능 경계","tags":["react-native","bridge","profiling","ios"],"question":"React Native로 만든 채팅 화면이 iOS에서 느립니다. JavaScript 렌더링, 네이티브 경계 호출, 네이티브 모듈 중 어디가 병목인지 어떻게 분리하겠습니까?","source":{"kind":"company","company":"뤼튼"}},{"id":"DATA-001","type":"short","category":"persistence","difficulty":1,"topic":"UserDefaults의 용도와 한계","tags":["userdefaults","plist","storage"],"question":"코드 리뷰에서 후배가 액세스 토큰, 프로필 이미지 `Data`, 최근 본 상품 5,000개 배열을 전부 `UserDefaults`에 저장하는 PR을 올렸습니다. 무엇을 지적하시겠습니까?","source":{"kind":"community"}},{"id":"DATA-002","type":"mcq","category":"persistence","difficulty":1,"topic":"파일 쓰기와 원자적 저장","tags":["filemanager","data-write","atomic","documents","file"],"question":"메모 앱이 `Documents/notes.json`에 `Data`를 저장합니다. 파일 쓰기에 대한 설명으로 **옳은 것을 모두** 고르세요.\n\n```swift\ntry data.write(to: url, options: [.atomic])\n```","source":{"kind":"original"}},{"id":"DATA-003","type":"short","category":"persistence","difficulty":1,"topic":"로컬 저장 방식 개관","tags":["storage-choice","userdefaults","keychain","filemanager","swiftdata","core-data"],"question":"새 iOS 프로젝트에서 '즐겨찾기 목록·로그인 세션·다운로드한 PDF·화면 설정'을 로컬에 저장해야 합니다. 각각 어떤 저장 방식을 고르겠습니까?","source":{"kind":"community"}},{"id":"DATA-004","type":"mcq","category":"persistence","difficulty":1,"topic":"Keychain 특성","tags":["keychain","security","userdefaults"],"question":"`UserDefaults`와 비교한 Keychain의 특성으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"DATA-005","type":"short","category":"persistence","difficulty":2,"topic":"Core Data 선택 기준","tags":["core-data","swiftdata","sqlite","storage-choice"],"question":"UserDefaults나 단순 파일 저장 대신 Core Data(또는 SwiftData)를 골라야 하는 요구사항은 무엇입니까?","source":{"kind":"community"}},{"id":"DATA-006","type":"short","category":"persistence","difficulty":2,"topic":"Core Data 스택 구성","tags":["core-data","nspersistentcontainer","nsmanagedobjectcontext","nsfetchrequest","nsfetchedresultscontroller"],"question":"Core Data를 쓰는 화면에서 항목을 추가했는데 리스트가 갱신되지 않는다는 버그가 있습니다. 이 버그가 어디서 생겼을 가능성이 큽니까?","source":{"kind":"community"}},{"id":"DATA-007","type":"mcq","category":"persistence","difficulty":2,"topic":"Core Data 컨텍스트 스레딩","tags":["core-data","threading","nsmanagedobjectid","background-context"],"question":"Core Data 를 쓰는 뉴스 앱입니다. 백그라운드 컨텍스트(`container.newBackgroundContext()`)에서 fetch한 `Article` 객체를 메인 스레드의 뷰에 그대로 넘겨 `article.title`을 읽었습니다. 올바른 설명은?","source":{"kind":"community"}},{"id":"DATA-008","type":"short","category":"persistence","difficulty":2,"topic":"Core Data vs SQLite 직접 사용","tags":["core-data","sqlite","grdb","realm"],"question":"팀원이 \"Core Data는 무겁고 이해하기 어려우니 SQLite를 직접(또는 GRDB로) 쓰자\"고 합니다. 두 접근의 실제 차이는 무엇입니까?","source":{"kind":"community"}},{"id":"DATA-009","type":"short","category":"persistence","difficulty":3,"topic":"Core Data 마이그레이션","tags":["core-data","migration","lightweight-migration","mapping-model"],"question":"Core Data 를 쓰는 앱을 업데이트한 뒤 크래시 리포트가 쏟아집니다. 로그에 \"The model used to open the store is incompatible with the one used to create the store\"가 있습니다. 무슨 일이 일어났나요?","source":{"kind":"community"}},{"id":"DATA-010","type":"mcq","category":"persistence","difficulty":3,"topic":"경량 마이그레이션 범위","tags":["core-data","migration","lightweight-migration"],"question":"Core Data에서 매핑 모델 없이 **경량 마이그레이션**으로 처리되는 변경을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"DATA-011","type":"short","category":"persistence","difficulty":2,"topic":"아카이빙과 plist","tags":["nscoding","nssecurecoding","nskeyedarchiver","plist","codable"],"question":"레거시 코드가 `NSKeyedArchiver`로 모델 객체를 파일에 저장합니다. 최근 OS에서 언아카이브 시 경고와 크래시가 나기 시작했습니다. `NSCoding`과 `NSSecureCoding`의 차이는 무엇입니까?","source":{"kind":"community"}},{"id":"DATA-012","type":"mcq","category":"persistence","difficulty":2,"topic":"관계형 vs 문서/객체 DB","tags":["sqlite","nosql","realm","rdbms"],"question":"iOS 앱의 로컬 저장소로 문서형/객체 DB(예: Realm) 대신 SQLite 기반 관계형 저장소(Core Data·SwiftData·GRDB)를 택하는 근거로 **타당한** 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"DATA-013","type":"short","category":"persistence","difficulty":3,"topic":"Core Data 내부 동작(faulting·save)","tags":["core-data","faulting","nsmanagedobject","save","row-cache"],"question":"Core Data에서 `fetch`로 10,000개 객체를 가져왔는데 메모리가 거의 안 늘었고, 이후 리스트를 스크롤하니 조금씩 늘어납니다. 이 현상을 내부 동작으로 설명해 주세요.","source":{"kind":"community"}},{"id":"DATA-014","type":"mcq","category":"persistence","difficulty":2,"topic":"NSFetchedResultsController","tags":["core-data","nsfetchedresultscontroller","uitableview"],"question":"Core Data 기반 목록 화면에서 `NSFetchedResultsController`가 담당하는 일로 가장 정확한 것은?","source":{"kind":"community"}},{"id":"DATA-015","type":"short","category":"persistence","difficulty":2,"topic":"SwiftData 기본 구조","tags":["swiftdata","model","modelcontainer","modelcontext","query"],"question":"SwiftData로 할 일 목록 앱을 만든다고 합시다. `@Model`, `ModelContainer`, `ModelContext`, `@Query`가 각각 무엇을 하나요?","source":{"kind":"original"},"since":"iOS 17"},{"id":"DATA-016","type":"mcq","category":"persistence","difficulty":2,"topic":"SwiftData 사실 확인","tags":["swiftdata","model","core-data"],"question":"SwiftData에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 17"},{"id":"DATA-017","type":"short","category":"persistence","difficulty":3,"topic":"SwiftData 스키마 마이그레이션","tags":["swiftdata","migration","versionedschema","schemamigrationplan"],"question":"SwiftData 앱을 출시한 뒤 `Todo`에 `priority` 필드를 추가하고, 기존 `title`을 공백 제거해 정리하려 합니다. 어떤 변경이 자동으로 되고 어떤 변경에 `VersionedSchema`와 `SchemaMigrationPlan`이 필요한가요?","source":{"kind":"original"},"since":"iOS 17"},{"id":"DATA-018","type":"short","category":"persistence","difficulty":2,"topic":"샌드박스 디렉터리와 백업","tags":["filemanager","documents","caches","tmp","backup","sandbox"],"question":"\"앱이 iCloud 백업 용량을 2GB나 차지한다\"는 사용자 불만과 함께, 심사에서 '오프라인 저장 데이터 가이드라인' 관련 지적을 받았습니다. 앱 샌드박스의 디렉터리들과 각각의 백업·정리 정책을 설명해 주세요.","source":{"kind":"original"}},{"id":"DATA-019","type":"mcq","category":"persistence","difficulty":1,"topic":"저장 위치 선택","tags":["filemanager","caches","documents"],"question":"서버에서 언제든 다시 받을 수 있는 썸네일 이미지 수천 장을 로컬에 저장하려 합니다. 가장 적절한 디렉터리는?","source":{"kind":"original"}},{"id":"DATA-020","type":"short","category":"persistence","difficulty":3,"topic":"Data Protection과 백그라운드 접근","tags":["data-protection","file-protection","encryption","background","keychain-accessibility"],"question":"잠금 화면 상태에서 백그라운드 푸시로 깨어난 앱이 로컬 DB를 열다 실패한다는 로그가 있습니다. iOS의 파일 보호(Data Protection) 클래스란 무엇입니까?","source":{"kind":"original"}},{"id":"DATA-021","type":"short","category":"persistence","difficulty":3,"topic":"백그라운드 저장과 메인 반영","tags":["core-data","background-context","merge","automaticallymergeschangesfromparent","performbackgroundtask"],"question":"서버에서 받은 데이터를 백그라운드 컨텍스트에서 저장하면 메인 화면이 갱신되지 않거나, 반대로 메인에서 편집 중인 값이 덮어씌워진다는 두 가지 불만이 있습니다. Core Data에서 백그라운드 저장→메인 반영 흐름을 어떻게 구성해야 하나요?","source":{"kind":"original"}},{"id":"DATA-022","type":"mcq","category":"persistence","difficulty":3,"topic":"merge policy 동작","tags":["core-data","mergepolicy","conflict"],"question":"Core Data 를 쓰는 메모 앱입니다. 백그라운드 컨텍스트가 `note.body`를 서버 값으로 바꿔 저장을 먼저 마쳤고, 이를 모르는 메인 컨텍스트에서는 사용자가 `note.title`만 수정해 `save()`를 호출했습니다. 메인 컨텍스트의 `mergePolicy`가 `NSMergeByPropertyObjectTrumpMergePolicy`일 때 결과는?","source":{"kind":"original"}},{"id":"DATA-023","type":"short","category":"persistence","difficulty":4,"topic":"CloudKit 동기화 제약","tags":["cloudkit","nspersistentcloudkitcontainer","swiftdata","sync","conflict"],"question":"로컬 전용이던 SwiftData/Core Data 앱에 iCloud 기기 간 동기화를 붙이려 합니다. `NSPersistentCloudKitContainer`(또는 SwiftData의 `cloudKitDatabase`)를 켜기 전에 스키마와 설계에서 무엇을 바꿔야 하나요?","source":{"kind":"original"}},{"id":"DATA-024","type":"short","category":"persistence","difficulty":4,"topic":"대량 데이터 저장 성능","tags":["core-data","nsbatchinsertrequest","performance","memory","autoreleasepool"],"question":"초기 동기화에서 10만 건을 Core Data에 저장하는데 메모리가 1GB까지 올라가 종료되고, 그동안 UI도 멈춥니다. 원인을 추정해 주세요.","source":{"kind":"original"},"since":"iOS 13"},{"id":"DATA-025","type":"mcq","category":"persistence","difficulty":4,"topic":"익스텐션과 저장소 공유","tags":["app-group","widget","sqlite","persistent-history","multi-process"],"question":"메인 앱의 SwiftData/Core Data 스토어를 위젯 익스텐션에서도 읽으려 합니다. 옳은 설명을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 11"},{"id":"DATA-026","type":"short","category":"persistence","difficulty":4,"topic":"서버-로컬 동기화 설계","tags":["sync","delta-sync","tombstone","offline","conflict"],"question":"메모 앱의 로컬 DB와 서버를 동기화해야 합니다. 매번 전체를 다시 받는 현재 방식은 느리고 데이터도 많이 씁니다. 델타 동기화 프로토콜을 어떻게 설계하겠습니까?","source":{"kind":"original"}},{"id":"DATA-027","type":"short","category":"persistence","difficulty":1,"topic":"영속화 도구 선택 경험","tags":["userdefaults","keychain","swiftdata","file-storage","take-home"],"question":"테이크홈 과제의 서술 문항입니다. \"지금까지 데이터를 영속화하기 위해 어떤 도구를 써 봤나요?\": 도구 이름 나열이 아니라, 각 도구를 어떤 데이터에 왜 썼는지 답해 주세요.","source":{"kind":"company","company":"Headspace"},"since":"iOS 17"},{"id":"DATA-028","type":"short","category":"persistence","difficulty":2,"topic":"서버 모델과 로컬 모델의 분리","tags":["dto","domain-model","swiftdata","schema-evolution","mapper"],"question":"폰스크린에서 \"백엔드에서 데이터 모델을 어떻게 설계하며 모바일에서는 그것을 어떻게 다루나\" 를 물었습니다. 서버 응답 JSON 구조를 그대로 로컬 DB 엔티티로 쓰면, 나중에 서버 쪽 응답 형식이 달라질 때 어떤 문제가 생기나요?","source":{"kind":"company","company":"Bloomberg"},"since":"iOS 17"},{"id":"DATA-029","type":"short","category":"persistence","difficulty":2,"topic":"앱 간 Keychain 공유(access group)","tags":["keychain","access-group","entitlements","app-group","security"],"question":"같은 팀에서 만드는 결제 앱 두 개(메인 앱·가맹점 앱)가 하나의 로그인 토큰을 공유해야 합니다. UserDefaults 나 파일로는 안 된다고 하는데, Keychain 으로는 어떤 조건에서 어떻게 공유하나요?","source":{"kind":"company","company":"PhonePe"}},{"id":"DATA-030","type":"mcq","category":"persistence","difficulty":3,"topic":"멀티스레드 다운로드와 Core Data 컨텍스트 구성","tags":["core-data","managed-object-context","background-context","merge","threading"],"question":"이미지 메타데이터를 스레드 4개에서 병렬로 내려받아 Core Data 에 저장하려 합니다. `NSManagedObjectContext` 를 몇 개, 어떻게 구성해야 하는지에 대해 옳은 설명을 **모두** 고르세요.","source":{"kind":"company","company":"PhonePe"}},{"id":"DATA-031","type":"short","category":"persistence","difficulty":3,"topic":"만료 시간 있는 키-값 저장소 설계","tags":["userdefaults","ttl","sqlite","index","cache","live-coding"],"question":"15분 안에 \"값에 만료 시각이 포함된 키-값 저장소\" 를 설계해 보라고 합니다. `set(key, value, ttl)` 과 `get(key)` 가 만료된 값을 돌려주지 않아야 하고, 처음엔 UserDefaults 로 시작해도 된다고 합니다. 어떻게 설계하겠습니까?","source":{"kind":"company","company":"Zomato"}},{"id":"DATA-032","type":"short","category":"persistence","difficulty":2,"topic":"NSCache 와 직접 만든 LRU 캐시","tags":["nscache","lru","linked-list","image-cache","memory"],"question":"NSCache 가 있는데 왜 이미지 라이브러리들은 LRU 캐시를 직접 만드나요?","source":{"kind":"company","company":"ByteDance"}},{"id":"DATA-033","type":"mcq","category":"persistence","difficulty":2,"topic":"LRU 캐시의 적중률과 자료구조","tags":["lru","cache","hit-rate","linked-list","hashmap"],"question":"이미지 캐시로 LRU 를 채택했습니다. LRU 에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Shopee"}},{"id":"DATA-034","type":"short","category":"persistence","difficulty":2,"topic":"ObjC 런타임 기반 모델 매핑과 Swift 의 대체","tags":["objective-c","runtime","kvc","codable","nssecurecoding","yymodel"],"question":"Objective-C 시절 YYModel·MJExtension 은 클래스 정의만 있으면 JSON→모델 변환과 NSCoding 아카이빙까지 자동으로 해 줬습니다. 런타임의 어떤 기능으로 가능했나요?","source":{"kind":"company","company":"Alibaba"},"since":"Swift 4"},{"id":"DATA-035","type":"short","category":"persistence","difficulty":3,"topic":"오프라인 채팅 DB 설계","tags":["offline-first","chat","outbox","sync","swiftdata","idempotency"],"question":"중고거래 앱의 채팅이 지하철에서도 읽고 쓸 수 있어야 합니다. 오프라인에서 보낸 메시지가 나중에 서버에 도달하고, 순서·중복·읽음 상태가 어긋나지 않도록 로컬 DB 스키마와 동기화 흐름을 설계해 주세요.","source":{"kind":"community","company":"당근"},"since":"iOS 17"},{"id":"DATA-036","type":"short","category":"persistence","difficulty":2,"topic":"Realm vs SwiftData/Core Data 선택","tags":["realm","swiftdata","core-data","threading","migration","swift6"],"question":"레거시 앱이 Realm 을 본격적으로 쓰고 있습니다. 새로 합류한 당신에게 \"Realm 을 계속 쓸지 SwiftData/Core Data 로 갈지\" 의견을 묻습니다. Realm 의 스레딩·객체 모델은 Apple 스택과 어떻게 다른가요?","source":{"kind":"community","company":"왓챠"},"since":"iOS 17"},{"id":"DATA-037","type":"mcq","category":"persistence","difficulty":3,"topic":"LFU 캐시의 특성","tags":["lfu","lru","cache","eviction","algorithm"],"question":"이미지 캐시를 LRU 에서 LFU 로 바꾸자는 제안이 있습니다. LFU 에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Pinduoduo"}},{"id":"DATA-038","type":"mcq","category":"persistence","difficulty":2,"topic":"요구 조건별 저장소 선택","tags":["storage","userdefaults","keychain","caches","app-group","swiftdata"],"question":"금융 앱의 데이터 저장 요구 조건과 저장소 선택이 올바르게 짝지어진 것을 **모두** 고르세요.","source":{"kind":"community","company":"Capital One"}},{"id":"SEC-001","type":"short","category":"security","difficulty":1,"topic":"코드 서명과 앱 무결성","tags":["code-signing","integrity","entitlements","provisioning","security"],"question":"iOS 앱은 왜 반드시 코드 서명이 되어야 실행되나요? 보안 관점에서 서명이 무엇을 보장하는지 중심으로 설명해 주세요.","source":{"kind":"original"}},{"id":"SEC-002","type":"mcq","category":"security","difficulty":1,"topic":"Keychain 접근 속성","tags":["keychain","accessibility","backup"],"question":"다른 기기로 백업 복원해도 옮겨지지 않고, 기기가 잠금 해제된 상태에서만 읽을 수 있게 Keychain 항목을 저장하려 합니다. 알맞은 `kSecAttrAccessible` 값은?","source":{"kind":"original"}},{"id":"SEC-003","type":"short","category":"security","difficulty":2,"topic":"App Transport Security","tags":["ats","https","tls","info-plist"],"question":"레거시 파트너 API가 아직 HTTP만 지원해서 앱 요청이 실패합니다. 요청을 막고 있는 ATS는 무엇인가요?","source":{"kind":"community"}},{"id":"SEC-004","type":"short","category":"security","difficulty":3,"topic":"인증서 피닝","tags":["ssl-pinning","certificate","public-key","urlsession","mitm"],"question":"인증서 피닝(SSL pinning)을 iOS에서 어떻게 구현하나요?","source":{"kind":"community"}},{"id":"SEC-005","type":"mcq","category":"security","difficulty":2,"topic":"인증서 피닝","tags":["ssl-pinning","rotation"],"question":"리프 인증서의 SHA-256 해시를 앱에 하드코딩해 피닝한 앱이 있습니다. 서버가 인증서를 갱신했을 때 가장 먼저 일어나는 일은?","source":{"kind":"original"}},{"id":"SEC-006","type":"short","category":"security","difficulty":2,"topic":"생체인증","tags":["localauthentication","faceid","touchid","biometrics","secaccesscontrol"],"question":"다음 코드로 Face ID 인증에 성공하면 `isUnlocked = true`를 세팅해 송금 화면을 엽니다. 이 방식의 보안상 약점은 무엇인가요?\n\n```swift\nlet ctx = LAContext()\nctx.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,\n                   localizedReason: \"송금 확인\") { ok, _ in\n    if ok { self.isUnlocked = true }\n}\n```","source":{"kind":"community"}},{"id":"SEC-007","type":"mcq","category":"security","difficulty":2,"topic":"탈옥 감지","tags":["jailbreak","detection"],"question":"앱에서 탈옥(jailbreak) 여부를 추정할 때 실제로 사용되는 휴리스틱을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"SEC-008","type":"short","category":"security","difficulty":1,"topic":"탈옥 환경 대응","tags":["jailbreak","threat-model","policy"],"question":"탈옥된 기기에서 우리 앱은 무엇을 잃게 되나요?","source":{"kind":"community"}},{"id":"SEC-009","type":"short","category":"security","difficulty":3,"topic":"보안과 편의성 균형","tags":["fintech","ux","threat-model","session"],"question":"금융 앱에서 보안 요구사항과 사용자 편의성이 충돌할 때 어떤 기준으로 결정하겠습니까? 예: 세션 유지 시간, 재인증 빈도, 화면 캡처 차단.","source":{"kind":"community"}},{"id":"SEC-010","type":"mcq","category":"security","difficulty":1,"topic":"비밀 하드코딩","tags":["api-key","secrets","hardcoding"],"question":"iOS 앱 소스에 있는 다음 코드의 보안 문제에 대한 설명으로 가장 정확한 것은?\n\n```swift\nenum API {\n    static let key = \"sk_live_9f8a7b6c5d4e\"\n    static let base = URL(string: \"https://api.example.com\")!\n}\n```","source":{"kind":"original"}},{"id":"SEC-011","type":"short","category":"security","difficulty":1,"topic":"암호화 기초","tags":["cryptokit","aes","rsa","hash","symmetric","asymmetric"],"question":"암호화에서 대칭키·비대칭키·해시는 각각 언제 쓰이나요?","source":{"kind":"company","company":"카카오"},"since":"iOS 13"},{"id":"SEC-012","type":"mcq","category":"security","difficulty":2,"topic":"CryptoKit","tags":["cryptokit","aead","aes-gcm","chachapoly"],"question":"CryptoKit에서 암호화와 동시에 변조 감지(인증)를 제공하는 AEAD 방식의 API를 **모두** 고르세요.","source":{"kind":"community"},"since":"iOS 13"},{"id":"SEC-013","type":"short","category":"security","difficulty":3,"topic":"OAuth 로그인 흐름","tags":["oauth","pkce","aswebauthenticationsession","wkwebview","sso"],"question":"소셜 로그인을 `WKWebView` 안에서 로그인 페이지를 띄워 처리하는 PR이 올라왔습니다. 왜 이 방식이 권장되지 않나요?","source":{"kind":"original"},"since":"iOS 12"},{"id":"SEC-014","type":"short","category":"security","difficulty":3,"topic":"토큰 수명 관리","tags":["access-token","refresh-token","keychain","401","race"],"question":"앱이 액세스 토큰과 리프레시 토큰을 Keychain에 두고 401이 오면 갱신합니다. 여러 요청이 동시에 401을 받았을 때 리프레시가 중복 실행되는 문제를 어떻게 막나요?","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"SEC-015","type":"mcq","category":"security","difficulty":3,"topic":"Privacy Manifest 와 Required Reason API","tags":["privacy-manifest","required-reason-api","app-tracking-transparency","privacy","app-store"],"question":"App Store 심사에서 `ITMS-91053: Missing API declaration` 경고를 받았습니다. Privacy Manifest·Required Reason API·ATT 에 대한 설명으로 **옳은 것을 모두** 고르세요.","source":{"kind":"original"},"since":"iOS 17"},{"id":"SEC-016","type":"short","category":"security","difficulty":2,"topic":"화면 노출 방지","tags":["snapshot","app-switcher","screenshot","screen-recording","privacy"],"question":"계좌 화면을 보다가 홈으로 나가면 앱 스위처에 잔액이 그대로 보인다는 QA 리포트를 받았습니다. 어떻게 처리하나요?","source":{"kind":"community"}},{"id":"SEC-017","type":"mcq","category":"security","difficulty":2,"topic":"WKWebView 보안","tags":["wkwebview","javascript-bridge","xss","webview"],"question":"`WKScriptMessageHandler`로 웹 페이지가 네이티브 함수(예: 토큰 조회, 결제 열기)를 호출할 수 있게 브릿지를 만들었습니다. 안전하게 운영하기 위해 필요한 조치를 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 14"},{"id":"SEC-018","type":"short","category":"security","difficulty":4,"topic":"리버스 엔지니어링 대응","tags":["obfuscation","reverse-engineering","symbols","anti-tamper","strings"],"question":"경쟁사가 우리 앱을 디컴파일해 API 호출 규격과 프로모션 로직을 그대로 베꼈다는 보고가 있습니다. iOS 앱에서 리버스 엔지니어링을 어렵게 만드는 방법에는 무엇이 있나요?","source":{"kind":"community"}},{"id":"SEC-019","type":"short","category":"security","difficulty":4,"topic":"App Attest","tags":["app-attest","devicecheck","attestation","secure-enclave","bot"],"question":"봇이 우리 API를 직접 호출해 쿠폰을 쓸어갑니다. 서버가 '진짜 App Store에서 설치된 우리 앱'의 요청만 받으려면 App Attest를 어떻게 활용하나요?","source":{"kind":"original"},"since":"iOS 14"},{"id":"SEC-020","type":"mcq","category":"security","difficulty":3,"topic":"Secure Enclave","tags":["secure-enclave","cryptokit","private-key"],"question":"CryptoKit 의 `SecureEnclave.P256.Signing.PrivateKey`로 만든 키에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 13"},{"id":"SEC-021","type":"short","category":"security","difficulty":2,"topic":"iOS 앱 보안 체크리스트","tags":["best-practices","checklist","owasp-masvs"],"question":"새 프로젝트를 시작하는 팀에게 iOS 앱 보안 모범 사례를 우선순위대로 정리해 준다면 무엇을 넣겠습니까?","source":{"kind":"community","company":"Apple"}},{"id":"SEC-022","type":"short","category":"security","difficulty":4,"topic":"딥링크 보안","tags":["deep-link","universal-link","url-scheme","open-redirect","input-validation"],"question":"`myapp://pay` 스킴에 `to=<계좌>&amount=<금액>` 파라미터를 붙인 딥링크로 송금 화면을 여는 기능이 있습니다. 어떤 공격이 가능한가요?","source":{"kind":"original"}},{"id":"SEC-023","type":"mcq","category":"security","difficulty":1,"topic":"HTTPS의 보장 범위","tags":["https","tls","threat-model"],"question":"앱이 모든 통신을 HTTPS로 한다고 할 때, 그것만으로 **보장되지 않는** 것은?","source":{"kind":"community"}},{"id":"SEC-024","type":"short","category":"security","difficulty":3,"topic":"로그·SDK를 통한 정보 유출","tags":["logging","pii","crashlytics","analytics","privacy-manifest","oslog"],"question":"크래시 리포트를 보다가 사용자 이메일과 토큰이 로그 메시지에 그대로 찍혀 있는 것을 발견했습니다. 로그·크래시·분석 SDK를 통한 개인정보 유출을 막기 위해 어떻게 설계하겠습니까?","source":{"kind":"original"},"since":"iOS 17"},{"id":"SEC-025","type":"short","category":"security","difficulty":4,"topic":"트래픽 가로채기 위협 평가","tags":["mitm","proxy","charles","pinning","threat-model","risk"],"question":"QA가 \"Charles 프록시를 걸었더니 우리 앱 API 요청과 응답이 전부 평문으로 보인다\"고 보고했습니다. 이것이 실제 보안 문제인지 판단하는 기준은 무엇인가요?","source":{"kind":"original"}},{"id":"SEC-026","type":"mcq","category":"security","difficulty":2,"topic":"Keychain 잔존 데이터","tags":["keychain","reinstall","logout","first-launch"],"question":"사용자가 앱을 삭제하고 재설치했는데 이전 계정으로 자동 로그인되는 버그가 보고되었습니다. 원인과 표준적인 대응은?","source":{"kind":"community"}},{"id":"SEC-027","type":"short","category":"security","difficulty":3,"topic":"패밀리 앱 간 로그인 상태 공유","tags":["keychain","access-group","session","logout","shared-login","objective-c"],"question":"한 회사의 앱 여러 개(메인 앱, 결제 앱, 클라우드 앱)가 한 번 로그인하면 서로 로그인 상태를 공유해야 합니다. iOS에서 이걸 어떻게 구현하나요?","source":{"kind":"company","company":"Alibaba"},"estimatedMinutes":5},{"id":"SEC-028","type":"short","category":"security","difficulty":3,"topic":"웹 페이지 하이재킹 대응","tags":["hijacking","dns","https","wkwebview","ats","httpdns"],"question":"앱 안의 WKWebView로 띄운 이벤트 페이지에 통신사·공유기 광고가 끼워져 나오거나 엉뚱한 사이트로 넘어간다는 신고가 들어왔습니다. 어떤 종류의 공격인가요?","source":{"kind":"company","company":"Alibaba"},"estimatedMinutes":5},{"id":"SEC-029","type":"short","category":"security","difficulty":3,"topic":"세션 토큰 탈취와 위장","tags":["token","session","replay","device-binding","app-attest","expiry"],"question":"로그인 후 서버가 준 토큰을 모든 요청의 헤더에 실어 보냅니다. 면접관이 \"그 토큰은 언제 만들어지고 언제 만료되는지\" 묻습니다. 어떻게 답하겠습니까?","source":{"kind":"company","company":"Ant Group"},"estimatedMinutes":5},{"id":"SEC-030","type":"short","category":"security","difficulty":3,"topic":"요청 서명과 변조 탐지","tags":["hmac","signature","nonce","timestamp","integrity","replay"],"question":"앱과 서버 사이의 통신 프로토콜을 직접 설계한다면, 전송 중에 내용이 바뀌었다는 것을 서버가 어떻게 알아챌 수 있게 하겠습니까? HTTPS를 이미 쓰고 있다는 전제입니다.","source":{"kind":"company","company":"Baidu"},"estimatedMinutes":5},{"id":"SEC-031","type":"mcq","category":"security","difficulty":2,"topic":"하이브리드 암호화","tags":["https","tls","rsa","aes","hybrid-encryption","key-exchange"],"question":"HTTPS(TLS)는 왜 서버의 공개키(RSA/ECC)로 데이터 전체를 암호화하지 않고, 대칭키만 교환한 뒤 데이터는 대칭 암호(AES 등)로 보내나요? 가장 정확한 설명을 고르세요.","source":{"kind":"company","company":"Tencent"}},{"id":"SEC-032","type":"short","category":"security","difficulty":3,"topic":"피닝과 키 로테이션","tags":["pinning","certificate","public-key","rotation","spki","backup-pin"],"question":"앱이 서버 공개키를 피닝하고 있는데, 보안 정책상 서버 인증서와 키가 주기적으로 교체됩니다. 교체 직후 옛 버전 앱 사용자들이 전부 접속 불가가 되는 사고를 막으려면 클라이언트는 새 공개키를 어떻게 알게 하나요?","source":{"kind":"company","company":"Meituan"},"estimatedMinutes":5},{"id":"SEC-033","type":"mcq","category":"security","difficulty":2,"topic":"프록시 도구의 HTTPS 복호화","tags":["charles","proxy","mitm","certificate","pinning","ats","objective-c"],"question":"Charles·Proxyman 같은 도구로 앱의 HTTPS 요청 본문을 평문으로 볼 수 있으려면 어떤 조건이 필요한가요? 해당하는 것을 **모두** 고르세요.","source":{"kind":"company","company":"ByteDance"}},{"id":"SEC-034","type":"short","category":"security","difficulty":3,"topic":"HTTPS의 한계와 앱 측 방어","tags":["https","tls","attack","dns","downgrade","pinning","defense-in-depth"],"question":"HTTPS를 쓰면 통신이 절대 안전하다고 할 수 없는 이유로, HTTPS 환경에서도 성립하는 대표적인 공격 방식을 들어 주세요.","source":{"kind":"company","company":"Shopee"},"estimatedMinutes":5},{"id":"SEC-035","type":"mcq","category":"security","difficulty":2,"topic":"앱 간 Keychain 공유","tags":["keychain","access-group","entitlements","app-group","team-id"],"question":"두 iOS 앱이 Keychain 데이터를 서로 읽고 쓰려고 합니다. 이것이 가능하려면 무엇이 필요한가요? 맞는 것을 **모두** 고르세요.","source":{"kind":"company","company":"PhonePe"}},{"id":"SEC-036","type":"short","category":"security","difficulty":3,"topic":"민감정보의 메모리 잔존","tags":["memory","sensitive-data","zeroing","string","secure-enclave","fintech"],"question":"카드번호·비밀번호·PIN 같은 값이 입력·처리된 뒤에도 프로세스 메모리에 남아 있어, 메모리 덤프나 크래시 로그로 새어 나갈 수 있다는 지적을 보안 진단에서 받았습니다. Swift/iOS에서 이 문제를 어디까지 해결할 수 있나요?","source":{"kind":"community","company":"스노우온카드"},"estimatedMinutes":5},{"id":"SEC-037","type":"short","category":"security","difficulty":2,"topic":"인앱결제 흐름과 검증","tags":["storekit","iap","receipt","verification","jws","fraud"],"question":"모바일 게임의 앱 내 결제(아이템 구매)가 사용자 탭부터 서버에 아이템이 지급되기까지 어떤 과정을 거치나요?","source":{"kind":"community","company":"넥슨"},"since":"iOS 15","estimatedMinutes":4},{"id":"SEC-038","type":"mcq","category":"security","difficulty":2,"topic":"자격증명 저장 위치","tags":["keychain","credentials","token","storage","data-protection"],"question":"로그인 후 받은 API 토큰과 사용자 자격증명을 기기에 보관해야 합니다. 보안상 허용되는 저장 방식을 **모두** 고르세요.","source":{"kind":"community","company":"JPMorgan"}},{"id":"SEC-039","type":"short","category":"security","difficulty":3,"topic":"뱅킹 거래의 다층 보안","tags":["security","banking","tls","keychain"],"question":"iOS 뱅킹 앱의 송금 기능을 설계합니다. 송금 요청 한 건을 지키기 위해 클라이언트와 서버에 어떤 방어층을 두겠습니까?","source":{"kind":"community","company":"Barclays"}},{"id":"SEC-040","type":"short","category":"security","difficulty":3,"topic":"인앱결제 영수증 검증","tags":["storekit","in-app-purchase","receipt","entitlement"],"question":"웹툰 앱이 인앱결제로 유료 회차를 해금합니다. 결제 성공 후 클라이언트가 UserDefaults에 \"구매 완료\" 플래그를 저장해 잠금을 푸는 설계의 문제는 무엇입니까?","source":{"kind":"community","company":"레진엔터테인먼트"}},{"id":"SWIFT-001","type":"short","category":"swift-language","difficulty":2,"topic":"값 타입과 참조 타입","tags":["struct","class","value-type","cow"],"question":"Swift에서 struct와 class는 근본적으로 무엇이 다른가요?","source":{"kind":"community","company":"Apple"}},{"id":"SWIFT-002","type":"mcq","category":"swift-language","difficulty":1,"topic":"옵셔널","tags":["optional","unwrap"],"question":"다음 중 옵셔널을 안전하게 언래핑하는 방법을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"SWIFT-003","type":"short","category":"swift-language","difficulty":2,"topic":"escaping 클로저","tags":["closure","escaping","non-escaping","capture"],"question":"아래 코드는 컴파일되지 않습니다. 컴파일러가 무엇을 요구하나요?\n\n```swift\nfinal class Loader {\n    var handlers: [() -> Void] = []\n    func register(_ handler: () -> Void) {\n        handlers.append(handler)\n    }\n}\n```","source":{"kind":"community"}},{"id":"SWIFT-004","type":"mcq","category":"swift-language","difficulty":1,"topic":"값 의미론","tags":["struct","class","value-semantics","let"],"question":"다음 코드의 출력은?\n\n```swift\nstruct Point { var x = 0 }\nfinal class Box { var x = 0 }\nvar p1 = Point(); var p2 = p1; p2.x = 5\nlet b1 = Box();  let b2 = b1;  b2.x = 5\nprint(p1.x, b1.x)\n```","source":{"kind":"community"}},{"id":"SWIFT-005","type":"short","category":"swift-language","difficulty":3,"topic":"불투명 타입과 존재 타입","tags":["some","any","existential","opaque","generic","dispatch"],"question":"`func make() -> some Shape`와 `func make() -> any Shape`는 호출자 입장에서 무엇이 다른가요?","source":{"kind":"original"},"since":"Swift 5.7"},{"id":"SWIFT-006","type":"mcq","category":"swift-language","difficulty":2,"topic":"접근 제어","tags":["access-control","open","public","module"],"question":"프레임워크 모듈에서 `open class`로 선언한 것과 `public class`로 선언한 것의 차이로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"SWIFT-007","type":"short","category":"swift-language","difficulty":2,"topic":"프로토콜 지향 프로그래밍","tags":["protocol","pop","oop","protocol-extension","composition"],"question":"팀원이 `BaseViewModel` 클래스를 만들고 모든 화면이 이를 상속하도록 하자고 합니다. 프로토콜 지향 방식으로 대안을 제안한다면 어떻게 설계하겠습니까?","source":{"kind":"community"}},{"id":"SWIFT-008","type":"mcq","category":"swift-language","difficulty":4,"topic":"프로토콜 익스텐션 디스패치","tags":["protocol","extension","dispatch","witness-table"],"question":"다음 코드의 출력은?\n\n```swift\nprotocol Greeter { func hello() -> String }\nextension Greeter {\n    func hello() -> String { \"proto hello\" }\n    func bye() -> String { \"proto bye\" }\n}\nstruct Bot: Greeter {\n    func hello() -> String { \"bot hello\" }; func bye() -> String { \"bot bye\" }\n}\nlet g: any Greeter = Bot()\nprint(g.hello(), g.bye())\n```","source":{"kind":"original"}},{"id":"SWIFT-009","type":"short","category":"swift-language","difficulty":3,"topic":"제네릭과 타입 소거","tags":["generic","associatedtype","type-erasure","any","primary-associated-type"],"question":"`getNext()`와 `hasNext()`를 가진 `Iterator` 프로토콜을 `Int` 전용에서 제네릭(`associatedtype Element`)으로 바꾸려 합니다. 바꾼 뒤 `[Iterator]` 배열을 만들려고 하니 컴파일이 막힙니다. 왜 그런가요?","source":{"kind":"company","company":"Uber"},"since":"Swift 5.7"},{"id":"SWIFT-010","type":"mcq","category":"swift-language","difficulty":1,"topic":"타입 캐스팅","tags":["type-casting","as","downcast","optional"],"question":"`let view: UIView = UILabel()` 일 때, 다음 중 **런타임 크래시가 날 수 있는** 캐스팅은?","source":{"kind":"community"}},{"id":"SWIFT-011","type":"short","category":"swift-language","difficulty":2,"topic":"mutating과 값 타입","tags":["mutating","struct","value-semantics","inout"],"question":"아래 코드에서 컴파일 에러는 어느 줄에서 왜 나나요?\n\n```swift\nstruct Counter {\n    var value = 0\n    func increment() { value += 1 }\n}\nlet c = Counter()\nc.increment()\n```","source":{"kind":"community"}},{"id":"SWIFT-012","type":"mcq","category":"swift-language","difficulty":2,"topic":"defer","tags":["defer","scope","cleanup"],"question":"다음 함수를 호출하면 출력 순서는?\n\n```swift\nfunc run() {\n    defer { print(\"A\") }\n    do {\n        defer { print(\"B\") }\n        print(\"C\")\n    }\n    defer { print(\"D\") }\n    print(\"E\")\n}\n```","source":{"kind":"community"}},{"id":"SWIFT-013","type":"short","category":"swift-language","difficulty":2,"topic":"Any / AnyObject / NSObject","tags":["any","anyobject","nsobject","existential","objc"],"question":"`Any`, `AnyObject`, `NSObject`는 각각 무엇을 담을 수 있나요?","source":{"kind":"community"}},{"id":"SWIFT-014","type":"mcq","category":"swift-language","difficulty":2,"topic":"enum","tags":["enum","associated-value","raw-value","pattern-matching"],"question":"Swift `enum`에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"SWIFT-015","type":"short","category":"swift-language","difficulty":3,"topic":"에러 처리","tags":["error","throws","result","typed-throws","async"],"question":"async/await 로 네트워크 레이어를 설계합니다. 요청 함수의 에러 처리를 `throws`, `Result<T, E>` 반환, Swift 6의 typed throws(`throws(NetworkError)`) 중 무엇을 기본으로 삼겠습니까?","source":{"kind":"community"},"since":"Swift 6"},{"id":"SWIFT-016","type":"short","category":"swift-language","difficulty":3,"topic":"Codable","tags":["codable","decodable","codingkeys","json","date"],"question":"서버 JSON이 snake_case 키를 쓰고, 날짜는 `\"2026-09-11T10:00:00Z\"` 문자열입니다. `Codable`로 이 응답을 디코딩하려면 디코더에 어떤 장치를 두겠습니까?","source":{"kind":"community"}},{"id":"SWIFT-017","type":"mcq","category":"swift-language","difficulty":2,"topic":"고차 함수","tags":["map","compactmap","flatmap","higher-order-function"],"question":"다음 코드의 출력은?\n\n```swift\nlet raw = [\"1\", \"x\", \"3\"]\nlet a = raw.map { Int($0) }\nlet b = raw.compactMap { Int($0) }\nlet c = [[1, 2], [3]].flatMap { $0 }\nprint(a.count, b.count, c.count)\n```","source":{"kind":"community"}},{"id":"SWIFT-018","type":"short","category":"swift-language","difficulty":3,"topic":"String 내부 구조","tags":["string","unicode","grapheme","index","performance"],"question":"`text[3]`처럼 정수로 String에 접근할 수 없고 `text.count`가 O(n)인 이유는 무엇인가요?","source":{"kind":"community"}},{"id":"SWIFT-019","type":"mcq","category":"swift-language","difficulty":2,"topic":"lazy 프로퍼티","tags":["lazy","stored-property","initialization","thread-safety"],"question":"`lazy var` 저장 프로퍼티에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community"}},{"id":"SWIFT-020","type":"short","category":"swift-language","difficulty":3,"topic":"메서드 디스패치","tags":["dispatch","static-dispatch","dynamic-dispatch","vtable","final","wmo"],"question":"Swift에서 정적·테이블·메시지 디스패치는 각각 어떤 메서드 호출에 적용되나요?","source":{"kind":"company","company":"TikTok"}},{"id":"SWIFT-021","type":"short","category":"swift-language","difficulty":4,"topic":"Copy-on-Write 구현","tags":["cow","copy-on-write","isknownuniquelyreferenced","value-semantics","performance"],"question":"대용량 픽셀 버퍼를 감싸는 `struct ImageBuffer`를 만들어야 합니다. 값 의미론은 유지하면서 불필요한 복사를 피하고 싶습니다. Copy-on-Write를 직접 구현한다면 코드 골격과 핵심 API는 어떻게 되나요?","source":{"kind":"community"}},{"id":"SWIFT-022","type":"mcq","category":"swift-language","difficulty":3,"topic":"Property Wrapper","tags":["property-wrapper","projectedvalue","wrappedvalue"],"question":"다음 코드의 출력은?\n\n```swift\n@propertyWrapper struct Clamped {\n    private var v = 0\n    var wrappedValue: Int {\n        get { v } set { v = min(max(newValue, 0), 10) }\n    }\n    var projectedValue: Bool { v == 10 }\n}\nstruct Volume { @Clamped var level: Int }\nvar vol = Volume(); vol.level = 42\nprint(vol.level, vol.$level)\n```","source":{"kind":"community"}},{"id":"SWIFT-023","type":"short","category":"swift-language","difficulty":3,"topic":"초기화 규칙","tags":["initializer","designated","convenience","two-phase","failable","required"],"question":"아래 코드가 컴파일되지 않는 이유는 무엇인가요? 2단계 초기화 규칙으로 설명해 주세요.\n\n```swift\nclass Base { let id: Int; init(id: Int) { self.id = id } }\nclass Child: Base {\n    let name: String\n    init(name: String) {\n        super.init(id: name.count)\n        self.name = name\n    }\n}\n```","source":{"kind":"community"}},{"id":"SWIFT-024","type":"short","category":"swift-language","difficulty":1,"topic":"옵셔널의 정체","tags":["optional","enum","nil","safety"],"question":"옵셔널이 Swift에 있는 이유는 무엇인가요?","source":{"kind":"community"}},{"id":"SWIFT-025","type":"mcq","category":"swift-language","difficulty":1,"topic":"컬렉션 타입","tags":["array","set","dictionary","hashable","collection"],"question":"수만 개의 사용자 ID 중에서 특정 ID가 포함되어 있는지 반복해서 검사해야 합니다. 가장 적합한 컬렉션은?","source":{"kind":"community"}},{"id":"SWIFT-026","type":"short","category":"swift-language","difficulty":2,"topic":"KeyPath","tags":["keypath","writablekeypath","referencewritablekeypath","kvo","functional"],"question":"Swift에서 `\\.name` 같은 KeyPath는 정확히 무엇을 나타내는 값인가요?","source":{"kind":"original"},"since":"Swift 5.2"},{"id":"SWIFT-027","type":"short","category":"swift-language","difficulty":4,"topic":"Objective-C 상호운용","tags":["objc","bridging","interop","dynamic","nsstring","runtime"],"question":"Swift 모듈이 레거시 Objective-C 코드와 서로 호출해야 합니다. 양방향 브리징은 어떻게 설정하나요?","source":{"kind":"community"}},{"id":"SWIFT-028","type":"short","category":"swift-language","difficulty":4,"topic":"ABI 안정성과 라이브러리 진화","tags":["abi","library-evolution","frozen","inlinable","resilience","binary-framework"],"question":"사내 공통 모듈을 XCFramework 바이너리로 배포하려 합니다. Swift ABI 안정성과 Library Evolution(`BUILD_LIBRARY_FOR_DISTRIBUTION`)은 각각 무엇을 보장하나요?","source":{"kind":"community"},"since":"Swift 5.1"},{"id":"SWIFT-029","type":"short","category":"swift-language","difficulty":3,"topic":"ContiguousArray vs Array","tags":["array","contiguousarray","performance","bridging","stdlib"],"question":"자기소개서에 \"`ContiguousArray`가 `Array`보다 빠르다\"고 썼다고 합시다. 프리인터뷰에서 면접관이 \"그런데 왜 실무에서는 개발자들이 `ContiguousArray`를 잘 쓰지 않을까요\"라고 묻습니다. 어떻게 답하겠습니까?","source":{"kind":"company","company":"네이버웹툰"}},{"id":"SWIFT-030","type":"short","category":"swift-language","difficulty":2,"topic":"직렬화 모델의 타입 선택","tags":["struct","class","codable","serialization","value-type"],"question":"서버 응답 JSON을 직렬화·역직렬화(Serialization)하는 모델 타입을 만들 때 class를 써야 하나요, struct를 써야 하나요? 근거를 들어 답해 주세요.","source":{"kind":"company","company":"라인플러스"}},{"id":"SWIFT-031","type":"mcq","category":"swift-language","difficulty":2,"topic":"재귀적 값 타입","tags":["struct","class","recursive","memory-layout","indirect"],"question":"다음 코드를 컴파일하면 어떻게 되나요? 같은 정의를 `class Person`으로 바꾸면요?\n\n```swift\nstruct Person {\n    let name: String\n    let father: Person\n}\n```","source":{"kind":"company","company":"Meesho"}},{"id":"SWIFT-032","type":"mcq","category":"swift-language","difficulty":1,"topic":"옵셔널과 IUO","tags":["optional","iuo","implicitly-unwrapped","nil"],"question":"다음 세 줄 중 컴파일되는 것을 **모두** 고르세요.\n\n```swift\nlet a: String = nil\nlet b: String? = nil\nlet c: String! = nil\n```","source":{"kind":"company","company":"Meesho"}},{"id":"SWIFT-033","type":"mcq","category":"swift-language","difficulty":2,"topic":"Swift 타입 규칙 상식","tags":["initializer","deinit","access-control","closure","hashable"],"question":"Swift 언어 규칙에 대한 다음 설명 중 **맞는 것을 모두** 고르세요.","source":{"kind":"company","company":"Zomato"}},{"id":"SWIFT-034","type":"short","category":"swift-language","difficulty":2,"topic":"private vs fileprivate","tags":["access-control","private","fileprivate","extension","se-0169"],"question":"같은 파일에 `class A { fileprivate func secret() {} }`와 `class B`가 있습니다. B 안에서 `A().secret()`을 호출할 수 있는지, `private`으로 바꾸면 어떻게 달라지나요?","source":{"kind":"company","company":"Gojek"},"since":"Swift 4"},{"id":"SWIFT-035","type":"short","category":"swift-language","difficulty":1,"topic":"고차 함수 조합","tags":["higher-order","map","enumerated","reversed","functional"],"question":"`[\"a\", \"b\", \"c\"]`를 입력받아 `[\"c-0\", \"b-1\", \"a-2\"]`를 만들어 보세요. `for` 루프 대신 고차 함수만 사용해야 합니다. 어떤 함수들을 어떤 순서로 조합하겠습니까?","source":{"kind":"company","company":"Capital One"}},{"id":"SWIFT-036","type":"short","category":"swift-language","difficulty":2,"topic":"compactMap 직접 구현","tags":["generics","rethrows","extension","compactmap","optional"],"question":"`Array`를 확장해 표준 라이브러리의 `compactMap`과 같은 동작을 하는 `myCompactMap`을 직접 구현해 보세요. 제네릭 시그니처는 어떻게 잡겠습니까?","source":{"kind":"company","company":"Walmart"}},{"id":"SWIFT-037","type":"short","category":"swift-language","difficulty":2,"topic":"Optional 확장","tags":["optional","extension","enum","pattern-matching","equatable"],"question":"어떤 옵셔널이든 `someOptional.isNil`처럼 nil 여부를 물을 수 있게 `Optional`을 확장해 보세요. 어떻게 구현하겠습니까?","source":{"kind":"company","company":"Swiggy"}},{"id":"SWIFT-038","type":"mcq","category":"swift-language","difficulty":2,"topic":"초기화·해제·옵저버 규칙","tags":["deinit","required","property-observer","set","optional-chaining"],"question":"Swift의 클래스 초기화·해제·프로퍼티 옵저버에 대한 설명 중 **맞는 것을 모두** 고르세요.","source":{"kind":"company","company":"Didi"}},{"id":"SWIFT-039","type":"short","category":"swift-language","difficulty":3,"topic":"이터레이터의 이터레이터","tags":["iteratorprotocol","sequence","flatten","generics","lazy"],"question":"`[[1, 2], [], [3], [4, 5, 6]]`처럼 '컬렉션의 컬렉션'을 받아 평평한 순서(1, 2, 3, 4, 5, 6)로 하나씩 꺼내 주는 이터레이터를 어떻게 설계하겠습니까? `for-in`에서 그대로 쓸 수 있어야 합니다.","source":{"kind":"company","company":"Airbnb"}},{"id":"SWIFT-040","type":"short","category":"swift-language","difficulty":3,"topic":"extension과 저장 프로퍼티","tags":["extension","stored-property","memory-layout","associated-object","objective-c"],"question":"extension으로 기존 타입에 프로퍼티를 추가하려고 합니다. 연산 프로퍼티는 되는데 저장 프로퍼티는 왜 안 되나요?","source":{"kind":"company","company":"Xiaohongshu"}},{"id":"SWIFT-041","type":"short","category":"swift-language","difficulty":3,"topic":"큰 컬렉션을 가진 값 타입","tags":["cow","dictionary","value-type","performance","inout"],"question":"수십만 개 항목을 가진 매우 큰 `Dictionary`를 struct의 프로퍼티로 넣고, 그 struct를 여기저기 값으로 전달해야 합니다. '가장 빠르게' 넣고 전달하려면 어떻게 해야 하나요?","source":{"kind":"community","company":"Verizon"}},{"id":"SWIFT-042","type":"short","category":"swift-language","difficulty":2,"topic":"제네릭 vs Any와 특수화","tags":["generics","any","specialization","type-safety","overloading"],"question":"코드 리뷰 중 `func larger(_ a: Int, _ b: Int) -> Int`, `larger(_ a: Double, _ b: Double) -> Double`, `larger(_ a: String, ...)`처럼 타입별로 같은 로직을 오버로딩해 둔 함수를 발견했습니다. 제네릭 하나로 바꾸자고 제안하려 합니다. 제네릭으로 받는 것은 파라미터를 `Any`로 받는 것과 무엇이 다른가요?","source":{"kind":"community","company":"IBM"}},{"id":"SWIFT-043","type":"mcq","category":"swift-language","difficulty":2,"topic":"inout 파라미터","tags":["inout","copy-in-copy-out","exclusivity","value-type"],"question":"Swift의 `inout` 파라미터(`func bump(_ x: inout Int)`)에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community","company":"Tinder"}},{"id":"SWIFT-044","type":"short","category":"swift-language","difficulty":3,"topic":"커스텀 Optional 설계","tags":["optional","enum","generics","map","flatmap","monad"],"question":"물음표 옵셔널 문법도 표준 `Optional`도 없다고 가정해 봅시다. '값이 있거나 없거나'를 표현하는 타입을 Swift로 직접 설계한다면 어떻게 정의하겠습니까?","source":{"kind":"community","company":"Grab"}},{"id":"SWIFT-045","type":"short","category":"swift-language","difficulty":1,"topic":"튜플의 용도와 한계","tags":["tuple","struct","multiple-return","destructuring"],"question":"Swift에서 튜플은 언제 쓰는 것이 적절한가요?","source":{"kind":"company","company":"Adobe"}},{"id":"SWIFT-046","type":"mcq","category":"swift-language","difficulty":1,"topic":"struct를 선택해야 하는 상황","tags":["struct","class","value-type","reference-type","design"],"question":"다음 중 Swift에서 class가 아니라 **struct로 만드는 것이 적절한** 경우를 **모두** 고르세요.","source":{"kind":"company","company":"Oura"}},{"id":"SWIFT-047","type":"short","category":"swift-language","difficulty":2,"topic":"원본 보호와 깊은 복사","tags":["reference-type","deep-copy","shallow-copy","nscopying","value-semantics"],"question":"함수에 class 인스턴스를 넘겨 함수 안에서 프로퍼티를 바꿨더니 호출한 쪽의 원본까지 바뀌었습니다. 원본을 보호하려면 어떻게 하나요?","source":{"kind":"company","company":"SAP"}},{"id":"SWIFT-048","type":"short","category":"swift-language","difficulty":2,"topic":"Swift enum이 다른 언어와 다른 점","tags":["enum","associated-values","sum-type","exhaustive-switch","state-modeling"],"question":"Java나 C를 주로 쓰던 동료가 Swift enum도 결국 상수 목록 아니냐고 묻습니다. Swift enum이 다른 언어의 enum과 근본적으로 다른 점은 무엇인가요?","source":{"kind":"company","company":"JD.com"}},{"id":"SWIFT-049","type":"short","category":"swift-language","difficulty":2,"topic":"옵셔널 체이닝의 동작","tags":["optional-chaining","optional","short-circuit","flatten","void-optional"],"question":"아래처럼 옵셔널 체이닝을 여러 단계 이어 붙였을 때 체이닝 도중 `nil`을 만나면 무슨 일이 일어나나요?\n\n```swift\nlet city = user?.address?.city\n```","source":{"kind":"community","company":"Capgemini"}},{"id":"SWIFT-050","type":"mcq","category":"swift-language","difficulty":1,"topic":"guard 문 규칙","tags":["guard","early-exit","optional-binding","control-flow"],"question":"Swift의 `guard` 문에 대한 설명으로 **맞는 것을 모두** 고르세요.","source":{"kind":"community","company":"Infosys"}},{"id":"SWIFT-051","type":"short","category":"swift-language","difficulty":2,"topic":"타입 추론과 컴파일 시간·let vs var","tags":["type-inference","compile-time","let","var","immutability","type-checker"],"question":"Swift는 타입 추론이 있어 타입을 거의 안 써도 되는데, 팀 컨벤션에 \"복잡한 표현식과 public API에는 타입을 명시하라\"는 규칙이 있습니다. 타입 추론이 어떻게 동작하기에 이런 규칙이 생겼나요?","source":{"kind":"community","company":"Cognizant"}},{"id":"SWIFT-052","type":"short","category":"swift-language","difficulty":3,"topic":"C++ 라이브러리 연동","tags":["cpp-interop","objective-c++","bridging","ownership","swift-5.9"],"question":"영상 처리 C++ 라이브러리를 Swift 앱에서 써야 합니다. 예전 방식(Objective-C++ 래퍼)과 Swift 5.9의 C++ 상호운용(interop) 중 무엇을 고르겠습니까?","source":{"kind":"community","company":"야놀자"},"since":"Swift 5.9"},{"id":"SWIFT-053","type":"short","category":"swift-language","difficulty":1,"topic":"강제 언래핑 금지 규칙과 예외","tags":["optional","force-unwrap","iuo","code-review","crash"],"question":"팀 코드 리뷰 규칙에 \"강제 언래핑(`!`) 금지\"가 있습니다. 왜 이런 규칙을 두나요?","source":{"kind":"community","company":"브랜디"}},{"id":"SUI-001","type":"short","category":"swiftui","difficulty":1,"topic":"SwiftUI vs UIKit 렌더링 모델","tags":["swiftui","uikit","declarative","rendering","diffing"],"question":"SwiftUI는 UIKit과 화면을 그리는 방식이 근본적으로 어떻게 다른가요?","source":{"kind":"community"}},{"id":"SUI-002","type":"short","category":"swiftui","difficulty":2,"topic":"View가 struct인 이유","tags":["view","struct","value-type","protocol","identity"],"question":"UIView는 class인데 SwiftUI의 View는 왜 struct로 설계됐나요?","source":{"kind":"community"}},{"id":"SUI-003","type":"mcq","category":"swiftui","difficulty":1,"topic":"@State와 @Binding","tags":["state","binding","data-flow","source-of-truth"],"question":"SwiftUI 설정 화면입니다. 토글 스위치를 가진 자식 뷰 `SettingsRow`가 부모가 소유한 `isOn` 값을 읽고 **변경도** 해야 합니다. 자식 뷰의 프로퍼티 선언으로 알맞은 것은?","source":{"kind":"community"}},{"id":"SUI-004","type":"short","category":"swiftui","difficulty":1,"topic":"@State 갱신 문제 진단","tags":["state","update","debugging","observable","main-actor"],"question":"SwiftUI 에서 @State 값을 바꿨는데 화면이 갱신되지 않는다는 주니어의 질문을 받았습니다. 먼저 @State가 무엇인지 설명해 주세요.","source":{"kind":"community"}},{"id":"SUI-005","type":"mcq","category":"swiftui","difficulty":2,"topic":"@StateObject vs @ObservedObject","tags":["stateobject","observedobject","observableobject","lifetime","combine"],"question":"SwiftUI 뷰입니다. 다음 코드에서 부모 뷰가 재평가될 때마다 `ItemListView`의 데이터가 초기화되는 버그가 있습니다. 원인과 올바른 수정은?\n\n```swift\nstruct ItemListView: View {\n    @ObservedObject var vm = ItemListViewModel()\n    var body: some View { List(vm.items) { Text($0.name) } }\n}\n```","source":{"kind":"community"},"since":"iOS 14"},{"id":"SUI-006","type":"short","category":"swiftui","difficulty":3,"topic":"Observation 프레임워크","tags":["observable","observation","observableobject","published","performance"],"question":"SwiftUI 에서 iOS 17의 `@Observable` 매크로가 기존 `ObservableObject` + `@Published` 방식에 비해 무엇이 좋은지, 내부 동작의 차이를 근거로 설명해 주세요.","source":{"kind":"community"},"since":"iOS 17"},{"id":"SUI-007","type":"mcq","category":"swiftui","difficulty":2,"topic":"Observation 마이그레이션","tags":["observable","migration","bindable","environment","state"],"question":"SwiftUI 앱의 `ObservableObject` 기반 코드를 `@Observable`로 옮길 때 올바른 대응을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 17"},{"id":"SUI-008","type":"short","category":"swiftui","difficulty":2,"topic":"데이터 흐름 설계","tags":["data-flow","source-of-truth","binding","environment","single-source"],"question":"SwiftUI에서 '단일 진실의 원천' 원칙을 기준으로, 어떤 상태를 어느 뷰가 소유하게 할지 어떻게 정하나요?","source":{"kind":"community"}},{"id":"SUI-009","type":"mcq","category":"swiftui","difficulty":2,"topic":"Environment 주입","tags":["environment","environmentobject","injection","crash","sheet"],"question":"SwiftUI 앱에서 아래처럼 `.environment(session)`을 중간 뷰(`HomeView`)에서 주입했습니다. `@Environment(Session.self) var session`을 쓰는 `ProfileView`를 NavigationStack 안에서 push하면 잘 동작하는데, `HomeView`의 `.sheet`로 띄우면 런타임에 크래시합니다. 가장 가능성 높은 원인은?\n\n```swift\nNavigationStack {\n    HomeView()          // 내부에서 .sheet { ProfileView() } 를 띄움\n}\n.environment(session)   // 루트가 아니라 여기서 주입했다고 가정\n```","source":{"kind":"community"},"since":"iOS 17"},{"id":"SUI-010","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI 뷰 생명주기","tags":["lifecycle","onappear","task","body","identity"],"question":"SwiftUI 뷰에는 UIKit 같은 viewDidLoad/viewWillAppear가 없습니다. 뷰가 '만들어지고, 나타나고, 갱신되고, 사라지는' 과정이 실제로 어떻게 진행되나요? 뷰 struct와 상태(@State)의 수명이 어떻게 다른지를 중심으로 설명해 주세요.","source":{"kind":"community"},"since":"iOS 15"},{"id":"SUI-011","type":"short","category":"swiftui","difficulty":3,"topic":"뷰 정체성(identity)","tags":["identity","structural-identity","explicit-identity","id","state-reset"],"question":"다음 코드에서 `isCompact`를 토글하면 텍스트 필드에 입력하던 내용이 사라집니다. 이유를 SwiftUI의 '정체성' 개념으로 설명해 주세요.\n\n```swift\nvar body: some View {\n    if isCompact {\n        SearchField().padding(4)\n    } else {\n        SearchField().padding(16)\n    }\n}\n```","source":{"kind":"original"}},{"id":"SUI-012","type":"mcq","category":"swiftui","difficulty":3,"topic":"ForEach 식별자","tags":["foreach","identifiable","id","list","animation"],"question":"SwiftUI 할 일 목록입니다. 다음 코드는 맨 앞에 항목을 삽입하면 삽입 애니메이션 대신 모든 행이 깜빡이고, 각 행의 토글 상태가 한 칸씩 밀립니다. 원인은?\n\n```swift\nForEach(items.indices, id: \\.self) { i in\n    TodoRow(item: items[i])\n}\n```","source":{"kind":"original"}},{"id":"SUI-013","type":"short","category":"swiftui","difficulty":2,"topic":"UIKit 연동","tags":["uiviewrepresentable","uihostingcontroller","interop","coordinator","bridge"],"question":"UIKit 앱에 SwiftUI 화면을 넣으려면 어떻게 하나요?","source":{"kind":"community"}},{"id":"SUI-014","type":"mcq","category":"swiftui","difficulty":2,"topic":"UIViewRepresentable 동작","tags":["uiviewrepresentable","coordinator","updateuiview","interop"],"question":"SwiftUI 의 `UIViewRepresentable`에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"SUI-015","type":"short","category":"swiftui","difficulty":1,"topic":"App 진입점과 Scene","tags":["main","app-protocol","scene","windowgroup","appdelegate"],"question":"SwiftUI 앱에서 `@main`은 무엇을 뜻하나요?","source":{"kind":"community"},"since":"iOS 14"},{"id":"SUI-016","type":"mcq","category":"swiftui","difficulty":1,"topic":"sheet 표시","tags":["sheet","modal","presentation","item","ispresented"],"question":"SwiftUI 목록에서 항목을 탭하면 그 항목의 상세를 sheet로 띄우려 합니다. 항목이 여러 개일 때 가장 적절한 방법은?","source":{"kind":"community"}},{"id":"SUI-017","type":"short","category":"swiftui","difficulty":3,"topic":"SwiftUI 레이아웃 알고리즘","tags":["layout","proposal","size","frame","geometryreader"],"question":"SwiftUI 레이아웃이 결정되는 3단계 과정을 설명해 주세요.","source":{"kind":"original"}},{"id":"SUI-018","type":"mcq","category":"swiftui","difficulty":2,"topic":"스택과 Spacer 레이아웃","tags":["hstack","spacer","frame","maxwidth","layout"],"question":"다음 SwiftUI 뷰의 레이아웃 결과에 대한 설명으로 옳은 것을 **모두** 고르세요.\n\n```swift\nHStack {\n    Text(\"제목\")\n    Spacer()\n    Button(\"저장\") {}\n}\n.frame(maxWidth: .infinity)\n.background(Color.yellow)\n```","source":{"kind":"original"}},{"id":"SUI-019","type":"short","category":"swiftui","difficulty":4,"topic":"SwiftUI 성능 진단","tags":["performance","body","printchanges","instruments","observable","equatable"],"question":"SwiftUI로 만든 대시보드 화면에서 텍스트 필드에 한 글자 칠 때마다 화면 전체가 버벅입니다. 무엇이 일어나고 있는지 가설을 세워 보세요.","source":{"kind":"original"},"since":"iOS 17"},{"id":"SUI-020","type":"short","category":"swiftui","difficulty":2,"topic":"재사용 컴포넌트 설계","tags":["viewmodifier","reusable","viewbuilder","style","component"],"question":"디자인 시스템의 '카드' 컴포넌트를 SwiftUI로 만들어 여러 화면에서 재사용하려 합니다. 어떤 방법(커스텀 View, ViewModifier, Style 프로토콜 등)을 언제 쓰는지 기준과 함께 설명해 주세요.","source":{"kind":"community"}},{"id":"SUI-021","type":"short","category":"swiftui","difficulty":3,"topic":"SwiftUI에서 MVVM","tags":["mvvm","viewmodel","observable","mainactor","testing"],"question":"iOS 17 이상을 지원하는 SwiftUI 앱의 화면에 MVVM을 적용한다면 ViewModel을 어떻게 정의하고 뷰가 어떻게 소유하나요?","source":{"kind":"community"},"since":"iOS 17"},{"id":"SUI-022","type":"short","category":"swiftui","difficulty":1,"topic":"NavigationStack 내비게이션","tags":["navigationstack","navigationpath","navigationlink","deep-link","navigationview"],"question":"SwiftUI에서 화면 간 이동은 어떻게 구현하나요?","source":{"kind":"community"},"since":"iOS 16"},{"id":"SUI-023","type":"mcq","category":"swiftui","difficulty":3,"topic":".task와 onAppear","tags":["task","onappear","cancellation","async","lifecycle"],"question":"SwiftUI 뷰에서 데이터를 로드하는 다음 두 코드의 동작 차이로 옳은 것은?\n\n```swift\n// A\n.onAppear { Task { await vm.load() } }\n// B\n.task { await vm.load() }\n```","source":{"kind":"original"},"since":"iOS 15"},{"id":"SUI-024","type":"short","category":"swiftui","difficulty":3,"topic":"SwiftData와 SwiftUI 통합","tags":["swiftdata","coredata","query","modelcontainer","persistence"],"question":"새 SwiftUI 앱의 로컬 저장소로 Core Data 대신 SwiftData를 골랐습니다. SwiftData는 SwiftUI와 어떻게 통합되나요?","source":{"kind":"community"},"since":"iOS 17"},{"id":"SUI-025","type":"short","category":"swiftui","difficulty":4,"topic":"SwiftUI 코드 결함 찾기","tags":["debugging","code-review","observedobject","foreach","onappear","state"],"question":"SwiftUI 라이브 코딩 리뷰입니다. 아래 피드 화면 코드에서 결함을 최대한 많이 찾아 각각 왜 문제인지, 어떻게 고칠지 말해 주세요.\n\n```swift\nstruct FeedView: View {\n    @ObservedObject var vm = FeedViewModel()\n    @State var items: [Post] = []\n    var body: some View {\n        List {\n            ForEach(0..<items.count) { i in\n                PostRow(post: items[i])\n                    .onAppear { if i == items.count - 1 { Task { await vm.loadMore() } } }\n            }\n        }\n        .onAppear { Task { items = await vm.fetch() } }\n    }\n}\n```","source":{"kind":"community","company":"PayPal"}},{"id":"SUI-026","type":"mcq","category":"swiftui","difficulty":4,"topic":"Observation 추적 세분화","tags":["observable","observation","tracking","body","performance"],"question":"SwiftUI + Observation 기반 다음 코드에서 `store.count`만 증가시켰을 때 body가 재평가되는 뷰를 **모두** 고르세요.\n\n```swift\n@Observable final class Store { var count = 0; var name = \"\" }\n\nstruct A: View { let store: Store\n    var body: some View { Text(\"\\(store.count)\") } }\nstruct B: View { let store: Store\n    var body: some View { Text(store.name) } }\nstruct C: View { let store: Store\n    var body: some View { Button(\"tap\") { store.count += 1 } } }\nstruct D: View { let store: Store\n    var body: some View { Text(store.name + \" \\(store.count)\") } }\n```","source":{"kind":"original"},"since":"iOS 17"},{"id":"SUI-027","type":"short","category":"swiftui","difficulty":4,"topic":"대용량 리스트 성능","tags":["list","lazyvstack","performance","anyview","scroll","identifiable"],"question":"수천 개 항목을 표시하는 SwiftUI 피드에서 스크롤이 끊깁니다. `List`와 `ScrollView + LazyVStack`의 내부 차이를 근거로 무엇을 선택하나요?","source":{"kind":"original"}},{"id":"SUI-028","type":"mcq","category":"swiftui","difficulty":2,"topic":"@Published와 뷰 갱신","tags":["published","observableobject","objectwillchange","combine","mainactor"],"question":"SwiftUI 에서 `ObservableObject`의 `@Published`가 뷰를 갱신하는 방식에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"},"since":"iOS 13"},{"id":"SUI-029","type":"mcq","category":"swiftui","difficulty":2,"topic":"onChange vs onReceive","tags":["onchange","onreceive","combine","modifier","side-effect"],"question":"SwiftUI 의 `onChange(of:)`와 `onReceive(_:)`에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Capital One"},"since":"iOS 17"},{"id":"SUI-030","type":"short","category":"swiftui","difficulty":3,"topic":"switchToLatest 검색 파이프라인","tags":["combine","switchtolatest","flatmap","debounce","search"],"question":"SwiftUI 검색 화면에서 입력할 때마다 API를 호출하는 Combine 파이프라인을 만들려 합니다. `map { query in api.search(query) }` 뒤에 `switchToLatest()`를 쓰는 것과 `flatMap`을 쓰는 것은 무엇이 다르고, 왜 검색에는 switchToLatest가 맞나요?","source":{"kind":"company","company":"Capital One"}},{"id":"SUI-031","type":"short","category":"swiftui","difficulty":3,"topic":"Combine 기반 목록·상세 앱 라이브 코딩","tags":["combine","live-coding","navigationstack","observableobject","datataskpublisher"],"question":"20분 라이브 코딩입니다. Combine만 사용해 API에서 목록을 받아 보여 주고, 항목을 탭하면 상세 화면으로 가는 2화면 SwiftUI 앱을 만들어 보세요. 뷰모델과 상태를 어떻게 잡고 시작하나요?","source":{"kind":"company","company":"Capital One"},"since":"iOS 16"},{"id":"SUI-032","type":"short","category":"swiftui","difficulty":2,"topic":"List 스크롤 이상 진단","tags":["list","lazyvstack","identifiable","performance","diagnosis"],"question":"SwiftUI `List`를 스크롤하면 끊기고, 행의 토글·이미지가 엉뚱하게 바뀌거나 깜빡인다는 제보를 받았습니다. 원인을 어떤 순서로 의심하고 무엇으로 해결하나요?","source":{"kind":"company","company":"Samsung"}},{"id":"SUI-033","type":"mcq","category":"swiftui","difficulty":2,"topic":"폼 검증 상태 설계","tags":["form","validation","alert","state","textfield","live-coding"],"question":"SwiftUI 라이브 코딩입니다. 이름·ID·비밀번호·비밀번호 확인 네 필드와 제출 버튼이 있는 가입 화면에서, 이름/ID가 비면 경고 alert, 비밀번호가 다르면 경고 alert, 모두 통과하면 성공 메시지를 띄워야 합니다. 상태 설계로 옳은 것을 **모두** 고르세요.","source":{"kind":"company","company":"Samsung"}},{"id":"SUI-034","type":"short","category":"swiftui","difficulty":2,"topic":"UIKit → SwiftUI 마이그레이션 난점","tags":["migration","uihostingcontroller","navigation","interop","adoption"],"question":"UIKit으로 만든 서비스 앱을 SwiftUI로 옮기려 합니다. 어떤 전략으로 도입하나요?","source":{"kind":"company","company":"Swiggy"}},{"id":"SUI-035","type":"short","category":"swiftui","difficulty":2,"topic":"상태 기반 뷰 전환(Add ↔ Stepper)","tags":["state","conditional-view","stepper","animation","live-coding"],"question":"SwiftUI 15분 라이브 코딩입니다. 'Add' 버튼을 탭하면 같은 자리에 수량 스테퍼(−/+)가 나타나고, 수량이 0이 되면 스테퍼가 사라지고 다시 'Add' 버튼이 보여야 합니다. 상태를 어떻게 잡고 뷰를 어떻게 구성하나요?","source":{"kind":"company","company":"Zomato"}},{"id":"SUI-036","type":"short","category":"swiftui","difficulty":2,"topic":"Swift Charts 구현","tags":["swift-charts","chart","linemark","visualization","live-coding"],"question":"온사이트 코딩입니다. 주식 앱의 최근 30일 종가 데이터를 Swift Charts로 선 그래프로 그리고 축·범위·오늘 값 강조까지 넣으려면 Chart를 어떻게 구성하나요?","source":{"kind":"company","company":"Robinhood"},"since":"iOS 16"},{"id":"SUI-037","type":"mcq","category":"swiftui","difficulty":1,"topic":"모디파이어 순서","tags":["modifier","background","padding","modifier-order"],"question":"SwiftUI 코드를 함께 보며 수정하는 면접입니다. 아래 두 코드의 렌더링 결과에 대한 설명으로 옳은 것은?\n\n```swift\n// A\nText(\"Pay\").padding().background(.blue)\n// B\nText(\"Pay\").background(.blue).padding()\n```","source":{"kind":"company","company":"PayPal"}},{"id":"SUI-038","type":"mcq","category":"swiftui","difficulty":1,"topic":"프로퍼티 래퍼 선택","tags":["state","stateobject","observedobject","environmentobject","binding"],"question":"SwiftUI 에서 상황과 프로퍼티 래퍼가 올바르게 짝지어진 것을 **모두** 고르세요. (iOS 16, ObservableObject 기준)","source":{"kind":"company","company":"Fidelity"}},{"id":"SUI-039","type":"short","category":"swiftui","difficulty":3,"topic":"@Observable 소유와 전달","tags":["observation","observable","state","bindable","environment","ownership"],"question":"iOS 17 `@Observable` 클래스를 SwiftUI 뷰에서 다룰 때, '누가 소유하는가'와 '어떻게 전달하는가'를 기준으로 `@State`·일반 프로퍼티·`@Bindable`·`@Environment`를 각각 언제 쓰는지 설명해 주세요.","source":{"kind":"company","company":"크림"},"since":"iOS 17"},{"id":"SUI-040","type":"short","category":"swiftui","difficulty":3,"topic":"검색 탭 설계(iTunes Search)","tags":["searchable","task-id","debounce","recent-searches","state-machine","take-home"],"question":"과제입니다. iTunes Search API로 앱스토어 '검색' 탭을 SwiftUI로 만드세요. 최근 검색어(로컬 저장), 검색 결과 리스트, 결과 상세 화면이 필요하고 외부 라이브러리는 금지입니다. 4~8시간 안에 '간결한 코드와 단순한 구조'로 끝내려면 화면 상태와 검색 요청 처리(입력 중 취소·중복)를 어떻게 설계하나요?","source":{"kind":"company","company":"휴레이포지티브"},"since":"iOS 16"},{"id":"SUI-041","type":"short","category":"swiftui","difficulty":2,"topic":"WidgetKit과 SwiftUI","tags":["widgetkit","widget","timeline","appintent","swiftui-only"],"question":"홈 화면 위젯 개발을 맡았습니다. 위젯은 왜 UIKit이 아니라 SwiftUI로만 만들 수 있나요?","source":{"kind":"company","company":"Alibaba"},"since":"iOS 14"},{"id":"SUI-042","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI 상태 소유권","tags":["swiftui","state","binding","observation"],"question":"SwiftUI 상품 편집 화면에서 부모 뷰가 상품 모델을 소유하고 자식 뷰는 가격 필드 하나만 고칩니다. `@State`, `@Binding`, `@Observable` 중 무엇을 어디에 두겠습니까?","source":{"kind":"company","company":"Mercari"}},{"id":"SUI-043","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI와 UIKit 선택","tags":["swiftui","uikit","integration","hosting-controller"],"question":"UIKit으로 만들어진 금융 앱에 계좌 상세 화면을 새로 추가합니다. 이 화면을 SwiftUI로 만들지 UIKit으로 만들지 어떤 기준으로 정하겠습니까?","source":{"kind":"community","company":"HSBC"}},{"id":"SUI-044","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI tally 화면의 단일 상태","tags":["swiftui","state","counter","single-source"],"question":"SwiftUI로 만든 카운터 화면에 증가, 감소, 초기화 버튼과 현재 값 표시가 있습니다. 버튼을 눌렀는데 표시 숫자와 실제 값이 어긋나는 일이 없게 하려면 상태를 어떻게 두겠습니까?","source":{"kind":"community","company":"Peloton"}},{"id":"SUI-045","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI API 로딩 상태","tags":["swiftui","task","loading-state","api"],"question":"SwiftUI 목록 화면이 호텔 API로 데이터를 불러옵니다. 로딩 중, 성공, 결과 없음, 오류 네 가지를 화면에서 빠짐없이 다루려면 상태를 어떻게 모델링하겠습니까?","source":{"kind":"community","company":"Expedia"}},{"id":"SUI-046","type":"short","category":"swiftui","difficulty":3,"topic":"Observation 의존성 추적","tags":["observation","observable","swiftui","ios17"],"question":"iOS 17 SwiftUI에서 `@Observable` 모델의 프로퍼티 하나가 바뀌었을 때, 그 모델을 쓰는 뷰 전부가 아니라 일부 뷰만 다시 그려집니다. SwiftUI는 어느 뷰를 다시 그릴지 무엇을 기준으로 정하나요?","source":{"kind":"company","company":"네이버웹툰"},"since":"iOS 17"},{"id":"SUI-047","type":"short","category":"swiftui","difficulty":2,"topic":"SwiftUI 비동기 MainActor 상태","tags":["swiftui","mainactor","async-await","error-state"],"question":"SwiftUI 주문 목록 ViewModel이 async API를 호출한 뒤 결과로 화면 상태를 바꿉니다. Swift 6 strict concurrency에서 이 ViewModel의 어느 부분을 `@MainActor`로 격리하겠습니까?","source":{"kind":"community","company":"요기요"}},{"id":"SUI-048","type":"short","category":"swiftui","difficulty":2,"topic":"List 항목 identity","tags":["swiftui","list","identity","realtime"],"question":"실시간 시세를 보여 주는 SwiftUI `List`에서 가격이 갱신될 때마다 행이 깜빡이며 다시 나타나고 스크롤 위치가 튑니다. 모델의 `Identifiable` id를 어떻게 정의해야 합니까?","source":{"kind":"community","company":"빗썸"}},{"id":"SUI-049","type":"short","category":"swiftui","difficulty":2,"topic":"단방향 상태 흐름","tags":["swiftui","unidirectional","state","validation"],"question":"SwiftUI로 만든 중고 거래 물품 등록 화면에 입력 필드, 검증, 제출, 오류 표시가 얽혀 있습니다. 단방향 상태 흐름으로 정리한다면 뷰의 이벤트와 상태가 각각 어느 방향으로 흐르게 하겠습니까?","source":{"kind":"community","company":"중고나라"}},{"id":"SYS-001","type":"short","category":"system-design","difficulty":3,"topic":"뉴스 피드 설계","tags":["feed","pagination","cache","offline","image-loading","realtime"],"question":"트위터 같은 무한 스크롤 피드 화면을 iOS 클라이언트 관점에서 설계해 주세요. 네트워크 응답이 화면에 그려지기까지 데이터가 어디를 거치고 화면은 무엇을 원본으로 읽는지를 중심으로 설명해 주세요.","source":{"kind":"community"},"estimatedMinutes":20},{"id":"SYS-002","type":"short","category":"system-design","difficulty":3,"topic":"이미지 로더·캐시 라이브러리","tags":["image-cache","lru","disk-cache","downsampling","deduplication","cancellation"],"question":"SDWebImage·Kingfisher 같은 이미지 로딩 라이브러리를 직접 설계한다면 컴포넌트와 캐시 계층을 어떻게 구성하겠습니까?","source":{"kind":"community"},"estimatedMinutes":15},{"id":"SYS-003","type":"short","category":"system-design","difficulty":2,"topic":"페이지네이션 전략","tags":["pagination","cursor","offset","keyset","prefetch"],"question":"모바일 피드의 페이지네이션을 offset 기반과 cursor(keyset) 기반 중 무엇으로 하겠습니까? 두 방식의 차이를 근거로 말해 주세요.","source":{"kind":"community"},"estimatedMinutes":10},{"id":"SYS-004","type":"mcq","category":"system-design","difficulty":2,"topic":"페이지네이션","tags":["pagination","offset","cursor"],"question":"offset 기반 페이지네이션으로 피드를 불러오는 중, 사용자가 2페이지를 보는 사이 피드 맨 앞에 새 글 3개가 추가되었습니다. 3페이지를 요청하면 어떤 일이 생기나요?","source":{"kind":"original"}},{"id":"SYS-005","type":"short","category":"system-design","difficulty":4,"topic":"1:1 채팅 앱 설계","tags":["chat","websocket","message-ordering","offline-queue","media-upload","idempotency"],"question":"WhatsApp 같은 1:1 채팅의 iOS 클라이언트를 설계해 주세요. 메시지 순서와 중복, 오프라인 전송 큐를 중심으로 다뤄 주세요.","source":{"kind":"company","company":"TikTok"},"estimatedMinutes":20},{"id":"SYS-006","type":"short","category":"system-design","difficulty":3,"topic":"썸네일 그리드 → 상세 화면","tags":["grid","detail","image-loading","prefetch","page-size","cache-policy"],"question":"첫 화면은 API로 받은 사진 썸네일 그리드이고, 탭하면 상세 화면(댓글·좋아요·공유, 좌우 스와이프로 다음 사진)이 열립니다. 클래스 구성과 데이터 흐름을 설계해 주세요.","source":{"kind":"company","company":"TikTok"},"estimatedMinutes":15},{"id":"SYS-007","type":"short","category":"system-design","difficulty":2,"topic":"노트 앱 설계","tags":["notes","offline-first","sync","conflict","swiftdata","cloudkit"],"question":"간단한 노트 앱을 설계해 주세요. 아키텍처, 저장 방식, 데이터 흐름을 중심으로 설명해 주세요.","source":{"kind":"community","company":"Apple"},"estimatedMinutes":15},{"id":"SYS-008","type":"short","category":"system-design","difficulty":3,"topic":"업로드 큐 설계","tags":["upload","background-urlsession","queue","retry","resumable","photos"],"question":"사용자가 사진 50장을 선택해 올리면 앱을 닫거나 네트워크가 끊겨도 결국 모두 업로드되어야 합니다. 업로드 큐를 어떻게 설계하겠습니까? 재시도, 재개, 순서, 진행률 표시, 중복 방지까지 다뤄 주세요.","source":{"kind":"original"},"estimatedMinutes":15},{"id":"SYS-009","type":"mcq","category":"system-design","difficulty":2,"topic":"실시간 업데이트 방식 선택","tags":["realtime","websocket","sse","polling","push"],"question":"주식 앱의 관심 종목 화면(포그라운드에서 초당 수 회 가격 갱신)과, 앱이 꺼져 있을 때의 '목표가 도달' 알림을 각각 구현합니다. 적절한 조합을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"SYS-010","type":"short","category":"system-design","difficulty":3,"topic":"실시간 가격 화면","tags":["realtime","websocket","throttle","diffable","battery","trading"],"question":"수백 개 종목의 가격이 초당 수십 번 바뀌는 포트폴리오·관심종목 화면을 설계해 주세요. UI 갱신 빈도를 어떻게 제어할지를 중심으로 설명해 주세요.","source":{"kind":"community","company":"Robinhood"},"estimatedMinutes":15},{"id":"SYS-011","type":"short","category":"system-design","difficulty":1,"topic":"요구사항 정리","tags":["requirements","interview-process","scope","non-functional"],"question":"모바일 시스템 디자인 면접에서 \"인스타그램 피드를 설계하세요\"라는 문제를 받았습니다. 설계를 시작하기 전 첫 5분 동안 면접관에게 무엇을 묻고 무엇을 정리하겠습니까?","source":{"kind":"community"},"estimatedMinutes":10},{"id":"SYS-012","type":"short","category":"system-design","difficulty":2,"topic":"날씨 앱 설계","tags":["weather","location","cache","widget","background-refresh","stale-while-revalidate"],"question":"현재 위치와 즐겨찾기 도시의 날씨를 보여주는 앱을 설계해 주세요. 컴포넌트와 데이터 소스, 캐시·갱신 정책을 중심으로 설명해 주세요.","source":{"kind":"community","company":"Google"},"estimatedMinutes":10},{"id":"SYS-013","type":"short","category":"system-design","difficulty":3,"topic":"온라인 상태 표시","tags":["presence","heartbeat","websocket","battery","contacts"],"question":"연락처 목록에 각 사용자의 '온라인/오프라인/마지막 접속' 표시를 넣으려 합니다. 앱이 강제 종료되거나 연결이 끊겨 오프라인을 스스로 알리지 못하는 경우까지 감안해, 클라이언트가 자기 상태를 서버에 어떻게 보고하게 설계하겠습니까?","source":{"kind":"community","company":"Meta"},"estimatedMinutes":15},{"id":"SYS-014","type":"short","category":"system-design","difficulty":2,"topic":"오프라인 우선 아키텍처","tags":["offline-first","sync","repository","single-source-of-truth","outbox"],"question":"\"오프라인 우선(offline-first)\" 앱 아키텍처는 일반적인 '네트워크 먼저, 실패하면 캐시' 방식과 무엇이 다른가요?","source":{"kind":"community","company":"Meta"},"estimatedMinutes":15},{"id":"SYS-015","type":"mcq","category":"system-design","difficulty":1,"topic":"캐시 계층","tags":["cache","memory","disk","network"],"question":"피드 화면 진입 시 데이터를 보여주는 순서로 가장 적절한 것은?","source":{"kind":"original"}},{"id":"SYS-016","type":"short","category":"system-design","difficulty":4,"topic":"대규모 앱 아키텍처","tags":["modularization","spm","feature-flags","observability","scalability","team"],"question":"사용자 수천만, 개발자 60명이 함께 만드는 iOS 앱의 아키텍처를 설계해 주세요. 모듈 구조와 팀 간 경계를 중심으로 설명해 주세요.","source":{"kind":"community","company":"Apple"},"estimatedMinutes":20},{"id":"SYS-017","type":"short","category":"system-design","difficulty":2,"topic":"검색 기능 설계","tags":["search","debounce","cancellation","autocomplete","recent-searches","race"],"question":"음악 앱의 검색 화면(입력 중 자동완성, 결과 목록, 최근 검색어)을 설계해 주세요. 타이핑할 때마다 요청이 나가지 않게 빈도를 어떻게 제어할지를 중심으로 설명해 주세요.","source":{"kind":"community","company":"Spotify"},"estimatedMinutes":10},{"id":"SYS-018","type":"short","category":"system-design","difficulty":3,"topic":"스토리 기능 설계","tags":["stories","media","preload","video","viewed-state","expiry"],"question":"인스타그램 스토리(24시간 후 사라지는 사진·짧은 영상, 좌우 탭으로 넘김, 본 스토리 표시)를 설계해 주세요. 탭했을 때 다음 스토리가 즉시 뜨게 하는 미디어 로딩을 중심으로 설명해 주세요.","source":{"kind":"community","company":"Meta"},"estimatedMinutes":15},{"id":"SYS-019","type":"short","category":"system-design","difficulty":1,"topic":"공통 기능 공유와 팀 협업","tags":["shared-component","notifications","team","merge-conflict","modularization"],"question":"앱의 여러 화면(홈, 프로필, 설정)에서 같은 '알림 센터' 기능(안 읽은 수 배지, 목록, 읽음 처리)을 써야 합니다. 화면마다 다시 만들지 않으면서 어느 화면에서 읽음 처리해도 다른 화면의 배지가 함께 맞으려면 어떻게 설계하겠습니까?","source":{"kind":"community"},"estimatedMinutes":10},{"id":"SYS-020","type":"short","category":"system-design","difficulty":4,"topic":"네이티브 vs 크로스플랫폼","tags":["cross-platform","native","flutter","react-native","kmp","decision"],"question":"스타트업 CTO로서 iOS·Android 앱을 새로 만듭니다. 네이티브, Flutter, React Native, Kotlin Multiplatform 중 무엇을 택할지 판단 기준을 세우고 당신의 결정을 말해 주세요.","source":{"kind":"community"},"estimatedMinutes":15},{"id":"SYS-021","type":"mcq","category":"system-design","difficulty":3,"topic":"오프라인 동기화 충돌","tags":["sync","conflict","lww","crdt","tombstone"],"question":"오프라인 우선 할 일(Todo) 앱에서 두 기기가 오프라인 상태로 같은 항목을 편집한 뒤 동기화됩니다. 데이터 손실 없이 처리하기 위해 **타당한** 전략을 **모두** 고르세요.","source":{"kind":"original"}},{"id":"SYS-022","type":"short","category":"system-design","difficulty":3,"topic":"성능·관측 설계","tags":["observability","metrics","metrickit","hitch","tti","logging","experiments"],"question":"새 피드 기능을 출시합니다. 출시 후 \"잘 동작한다\"를 어떤 클라이언트 지표와 목표값으로 정의하겠습니까?","source":{"kind":"community","company":"Netflix"},"estimatedMinutes":15},{"id":"SYS-023","type":"short","category":"system-design","difficulty":2,"topic":"사진 공유 앱 저장 시스템","tags":["photos","storage","disk","thumbnail","photokit","cache-eviction"],"question":"사진 공유 앱의 클라이언트 저장 시스템을 설계해 주세요. 원본·썸네일·메타데이터를 어디에 어떻게 저장할지를 중심으로 설명해 주세요.","source":{"kind":"community","company":"Meta"},"estimatedMinutes":15},{"id":"SYS-024","type":"mcq","category":"system-design","difficulty":1,"topic":"이미지 로딩 메모리","tags":["image","downsampling","memory","cache-key"],"question":"3열 그리드에 4000×3000 JPEG 썸네일 60장을 표시했더니 메모리가 수백 MB로 치솟습니다. 가장 효과적인 해결은?","source":{"kind":"original"}},{"id":"SYS-025","type":"short","category":"system-design","difficulty":1,"topic":"데이터 로드 시점","tags":["prefetch","loading-strategy","battery","bandwidth","memory","navigation"],"question":"여행 예약 앱에서 목록 → 상세 → 예약 화면으로 이어집니다. 각 화면의 데이터를 '화면이 표시될 때' 받을지 '이전 화면에서 미리' 받을지 어떤 기준으로 정하나요?","source":{"kind":"community"},"estimatedMinutes":10},{"id":"SYS-026","type":"short","category":"system-design","difficulty":4,"topic":"화면 간 상태 일관성","tags":["consistency","optimistic-update","single-source-of-truth","like","architecture","viper"],"question":"인스타그램 상세 화면에서 더블탭 '좋아요'를 누르면 피드·프로필·검색 결과에 같은 게시물이 있어도 모두 즉시 반영되어야 합니다. 이 이벤트가 아키텍처 계층을 어떻게 흐르는지 설명해 주세요.","source":{"kind":"company","company":"Uber"},"estimatedMinutes":20},{"id":"SYS-027","type":"short","category":"system-design","difficulty":3,"topic":"항공권 예약 플로우","tags":["booking","state-machine","idempotency","hold-expiry","checkout","offline"],"question":"백엔드는 이미 있다고 가정하고 항공권 예약 iOS 앱을 설계해 주세요. 검색 결과 → 항공편 선택 → 좌석·탑승객 입력 → 결제 → 확정까지 이어지는 흐름에서 화면 간 상태를 어떻게 관리할지를 중심으로 설명하세요.","source":{"kind":"company","company":"Meta"},"estimatedMinutes":15},{"id":"SYS-028","type":"short","category":"system-design","difficulty":3,"topic":"이미지 그리드 탐색 화면","tags":["discover","infinite-scroll","image-loading","prefetch","concurrency","memory"],"question":"Snapchat Discover처럼 썸네일 타일이 가득한 탐색 화면을 설계해 주세요. 무한 스크롤로 계속 내려가고, 각 타일은 네트워크 이미지를 보여 줍니다. 이미지 디코딩과 메모리 상한을 어느 스레드에서 어떻게 처리할지를 중심으로 설명하세요.","source":{"kind":"company","company":"Snap"},"estimatedMinutes":15},{"id":"SYS-029","type":"short","category":"system-design","difficulty":3,"topic":"기능 스켈레톤 설계(DI·오프라인·실험)","tags":["dependency-injection","offline","ab-testing","feature-flag","skeleton","protocol"],"question":"\"북마크 저장\" 기능 하나를 Swift 코드 골격으로 설계해 보세요. 화이트보드 대신 타입·프로토콜 시그니처 수준으로, 의존성을 어떻게 주입해 테스트 가능하게 만들지를 중심으로 보여 주세요.","source":{"kind":"company","company":"X (Twitter)"},"estimatedMinutes":15},{"id":"SYS-030","type":"short","category":"system-design","difficulty":3,"topic":"거래내역 화면","tags":["transaction-history","pagination","offline","realtime","low-end","source-of-truth"],"question":"송금 앱의 거래내역 화면 클라이언트를 설계해 주세요. 요구사항: 무한 스크롤 페이지네이션, 오프라인에서도 최근 내역 표시, 새 거래가 들어오면 실시간으로 맨 위에 반영, 그리고 저가 기기·불안정한 신호에서도 깜빡임과 중복 없이 잘 동작해야 합니다.","source":{"kind":"company","company":"PayPal"},"estimatedMinutes":15},{"id":"SYS-031","type":"short","category":"system-design","difficulty":3,"topic":"금융 앱의 오프라인 친화 기능","tags":["offline","freshness","cache","conflict","fintech","simplicity"],"question":"신용카드 앱의 '이번 달 사용액·남은 한도' 카드를 설계해 주세요. 네트워크가 불안정해도 화면은 열려야 하고 데이터는 신선하게 느껴져야 합니다. 무엇을 캐시하고 로컬 데이터를 언제 신뢰할지를 중심으로 말해 주세요.","source":{"kind":"company","company":"CRED"},"estimatedMinutes":15},{"id":"SYS-032","type":"short","category":"system-design","difficulty":4,"topic":"BLE 명령 직렬화 핸들러","tags":["ble","corebluetooth","serial-queue","timeout","continuation","actor","wearable"],"question":"웨어러블 기기와 BLE로 통신하는 앱의 명령 핸들러를 설계해 주세요. 제약: 명령은 한 번에 하나만 보낼 수 있고, 이전 명령의 응답이 오거나 타임아웃이 나기 전에는 다음 명령이 기다려야 합니다. 여러 화면이 동시에 명령을 보내고, 응답은 CoreBluetooth 델리게이트 콜백으로 비동기로 도착합니다. 이 핸들러의 타입 구조를 설명하세요.","source":{"kind":"company","company":"Whoop"},"estimatedMinutes":20},{"id":"SYS-033","type":"short","category":"system-design","difficulty":4,"topic":"타임스탬프 동기 오디오북","tags":["avplayer","audio","timed-metadata","prefetch","capability","seek","background"],"question":"오디오북 앱에 '강화 재생' 기능을 설계해 주세요. 지원하는 타이틀에서는 오디오가 재생되는 동안 정해진 타임스탬프마다 해당 이미지를 화면에 띄워야 합니다. 오디오 시계와 이미지 표시를 어떻게 동기화하겠습니까?","source":{"kind":"company","company":"Audible"},"estimatedMinutes":20},{"id":"SYS-034","type":"short","category":"system-design","difficulty":3,"topic":"재부팅에도 살아남는 알람","tags":["alarm","local-notification","critical-alert","reboot","background","platform-constraint"],"question":"\"사용자가 폰을 껐다 켜도 계속 울리는\" 기상 알람 앱을 iOS에서 설계해 주세요. 앱은 재부팅 후 자동 실행되지 않고 백그라운드 실행이 제한되는데, 이 제약 안에서 가장 견고한 설계를 제시하세요.","source":{"kind":"company","company":"Microsoft"},"since":"iOS 15","estimatedMinutes":10},{"id":"SYS-035","type":"short","category":"system-design","difficulty":3,"topic":"라이더용 배달 앱","tags":["delivery","rider","state-machine","location","offline-queue","api-design"],"question":"배달 라이더용 앱을 설계해 주세요. 화면 목업(주문 목록, 주문 상세·수락, 픽업, 배달 완료)은 주어졌습니다. 주문 상태 머신과 그것을 서버와 어떻게 맞출지를 중심으로 전체 흐름을 설명하세요.","source":{"kind":"company","company":"Deliveroo"},"estimatedMinutes":15},{"id":"SYS-036","type":"short","category":"system-design","difficulty":3,"topic":"앱 내 알림 센터","tags":["notification-center","unread","background-fetch","push-token","badge","pagination"],"question":"커머스 앱의 '알림' 탭(주문·프로모션·배송 알림 목록, 읽음/안읽음, 뱃지)을 설계해 주세요. 로컬 저장과 읽음 상태의 서버 동기화를 중심으로 설명해 주세요.","source":{"kind":"company","company":"Flipkart"},"estimatedMinutes":15},{"id":"SYS-037","type":"short","category":"system-design","difficulty":3,"topic":"IM 메시지 신뢰성과 로컬 스키마","tags":["im","chat","reliability","ack","sequence","sqlite","schema","outbox"],"question":"메신저 앱에서 메시지가 유실되지 않도록 클라이언트는 무엇을 보장해야 하나요? 전송·수신 양방향의 확인(ack)과 재전송, 순서, 중복 제거 관점에서 설명해 주세요.","source":{"kind":"company","company":"Tencent"},"estimatedMinutes":15},{"id":"SYS-038","type":"short","category":"system-design","difficulty":3,"topic":"다운로드 매니저","tags":["download","concurrency-limit","resume","urlsession","cache","lru","decoupling"],"question":"앱 공용 다운로드 매니저를 설계해 주세요. 요구사항: 태스크를 직렬 또는 병렬로 실행할 수 있고 최대 동시 실행 수를 제한하며, 호출 모듈과 결합되지 않아야 합니다.","source":{"kind":"company","company":"Kuaishou"},"estimatedMinutes":15},{"id":"SYS-039","type":"short","category":"system-design","difficulty":4,"topic":"댓글 피드 페이지","tags":["comments","ranking","pagination","cursor","collapse","persistence","animation"],"question":"커뮤니티 앱의 댓글 피드 페이지를 설계해 주세요. 제약: 댓글은 평탄하게(트리 아님) 표시, 좋아요·답글 수 등 상호작용 가중치로 전역 정렬, 첫 화면은 자동 로드. 정렬 기준이 계속 변하는데 서버 자료구조와 페이지네이션을 어떻게 설계하겠습니까?","source":{"kind":"company","company":"Xiaohongshu"},"estimatedMinutes":20},{"id":"SYS-040","type":"short","category":"system-design","difficulty":3,"topic":"사진 라이브러리","tags":["photos","grid","thumbnail","photokit","memory","backup","sync"],"question":"수만 장의 사진을 그리드로 보여 주고 클라우드에 백업하는 사진 라이브러리 앱을 설계해 주세요. 그리드 스크롤 성능(썸네일 생성·캐시·메모리)을 중심으로 설명하세요.","source":{"kind":"company","company":"Robinhood"},"estimatedMinutes":15},{"id":"SYS-041","type":"short","category":"system-design","difficulty":3,"topic":"디자인 시스템 컴포넌트 설계","tags":["design-system","component","api-design","theming","accessibility","snapshot-test","coupang"],"question":"디자인 시스템의 '토스트' 컴포넌트를 설계해 보세요. 여러 앱·팀이 쓰는 상황에서 호출자에게 노출할 공개 API(호출 방법·옵션)를 어떻게 정하겠습니까?","source":{"kind":"company","company":"쿠팡"},"estimatedMinutes":15},{"id":"SYS-042","type":"mcq","category":"system-design","difficulty":2,"topic":"과설계 판단","tags":["over-engineering","simplicity","architecture","two-screen"],"question":"\"목록 화면과 상세 화면, 두 개뿐인 앱을 설계하세요\"라는 시스템 디자인 라운드입니다. 다음 중 면접관이 **과설계(over-engineering)** 로 판단할 가능성이 높은 선택을 **모두** 고르세요.","source":{"kind":"company","company":"Booking.com"}},{"id":"SYS-043","type":"mcq","category":"system-design","difficulty":3,"topic":"클라이언트 SDK 설계","tags":["sdk","api-design","integration","chat-sdk","versioning","threading"],"question":"채팅·통화 기능을 제공하는 iOS 클라이언트 SDK를 다른 회사 앱들이 통합하기 쉽게 설계하려고 합니다. 통합 난이도를 낮추고 안정성을 높이는 설계 원칙으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community","company":"센드버드"}},{"id":"SYS-044","type":"short","category":"system-design","difficulty":3,"topic":"대규모 사진 피드 페이지네이션","tags":["feed","pagination","cursor","cache"],"question":"수억 사용자가 보는 사진 피드에서 iOS 앱이 무한 스크롤을 구현합니다. 서버 정렬이 바뀌어도 중복과 누락을 줄이는 페이지 키를 어떻게 설계하겠습니까?","source":{"kind":"community","company":"Roblox"}},{"id":"SYS-045","type":"short","category":"system-design","difficulty":3,"topic":"알람 앱의 시스템 스케줄링","tags":["notifications","alarm","ios","scheduling"],"question":"iPhone 알람 앱을 설계합니다. 지정 시각에 사용자에게 알림을 보장해야 할 때 앱 내부 Timer 대신 어떤 시스템 API를 쓰겠습니까?","source":{"kind":"community","company":"Electronic Arts"}},{"id":"SYS-046","type":"short","category":"system-design","difficulty":3,"topic":"실시간 뉴스피드 순서 보장","tags":["websocket","realtime","sequence","feed"],"question":"실시간 소셜 뉴스피드가 WebSocket 증분 이벤트와 REST 초기 목록을 함께 받습니다. 초기 동기화 중 이벤트가 유실되지 않게 하려면 두 채널을 어떤 순서로 붙이겠습니까?","source":{"kind":"community","company":"Zynga"}},{"id":"SYS-047","type":"short","category":"system-design","difficulty":3,"topic":"오프라인 채팅 Outbox","tags":["chat","offline","outbox","idempotency"],"question":"네트워크가 자주 끊기는 iOS 채팅 앱에서 사용자가 보낸 메시지를 잃지 않아야 합니다. 로컬 outbox의 상태 전이를 어떻게 설계하겠습니까?","source":{"kind":"community","company":"Niantic"}},{"id":"SYS-048","type":"short","category":"system-design","difficulty":3,"topic":"뉴스 피드 상태 모델","tags":["state-management","feed","stale-response","reducer"],"question":"게임 뉴스 피드에서 새로고침, 페이지네이션, 북마크가 동시에 일어납니다. 화면이 서로 다른 응답을 덮어쓰지 않도록 어떤 단일 상태와 이벤트 흐름을 정의하겠습니까?","source":{"kind":"community","company":"Riot Games"}},{"id":"SYS-049","type":"short","category":"system-design","difficulty":2,"topic":"기능 청사진과 요구사항","tags":["requirements","blueprint","state-machine","feature-design"],"question":"iOS 오디오 북마크 기능을 코드 없이 화이트보드에서 설계합니다. 모호한 요구를 어떤 질문으로 먼저 확인하겠습니까?","source":{"kind":"company","company":"SoundCloud"}},{"id":"SYS-050","type":"short","category":"system-design","difficulty":3,"topic":"모바일 기능 구현 청사진","tags":["banking","use-case","optimistic-ui","rollback"],"question":"은행 앱의 카드 동결 기능을 1시간 시스템 디자인에서 설명합니다. 화면, 도메인 유스케이스, API, 분석을 어떤 인터페이스로 분리하겠습니까?","source":{"kind":"community","company":"Monzo"}},{"id":"SYS-051","type":"short","category":"system-design","difficulty":3,"topic":"파일 관리자 동기화 모델","tags":["file-manager","sync","upload","metadata"],"question":"iOS 파일 관리자에서 목록, 오프라인 파일, 업로드 진행률을 보여 줍니다. 파일 메타데이터와 실제 바이트를 어떻게 분리해 저장하겠습니까?","source":{"kind":"community","company":"Hopper"}},{"id":"TEST-001","type":"short","category":"testing","difficulty":1,"topic":"단위 테스트의 목적","tags":["unit-test","xctest","why-test","regression"],"question":"\"테스트 쓸 시간에 기능 하나 더 만들자\"는 팀원에게 단위 테스트가 왜 필요한지 설득해야 합니다. 어떤 근거를 들겠습니까?","source":{"kind":"community"}},{"id":"TEST-002","type":"mcq","category":"testing","difficulty":1,"topic":"XCTest 기본 규칙","tags":["xctest","xctestcase","test-discovery"],"question":"XCTest가 **테스트 메서드로 인식해 실행**하기 위해 필요한 조건을 모두 고르세요.","source":{"kind":"community"}},{"id":"TEST-003","type":"short","category":"testing","difficulty":1,"topic":"테스트 유형과 피라미드","tags":["unit-test","integration-test","ui-test","test-pyramid"],"question":"단위 테스트, 통합 테스트, UI 테스트는 무엇이 다른가요?","source":{"kind":"community"}},{"id":"TEST-004","type":"short","category":"testing","difficulty":2,"topic":"테스트 구조와 TDD","tags":["aaa","given-when-then","tdd","red-green-refactor"],"question":"테스트 코드를 Arrange-Act-Assert(Given-When-Then)로 나누는 이유는 무엇인가요?","source":{"kind":"community"}},{"id":"TEST-005","type":"short","category":"testing","difficulty":2,"topic":"테스트 더블","tags":["test-double","mock","stub","fake","spy"],"question":"테스트 더블(Test Double)이란 무엇인가요?","source":{"kind":"community"}},{"id":"TEST-006","type":"short","category":"testing","difficulty":3,"topic":"네트워크 목킹","tags":["urlsession","urlprotocol","mock","network","dependency-injection"],"question":"URLSession을 직접 쓰는 네트워크 계층을 실제 서버 없이 테스트하고 싶습니다. 가능한 방법을 두 가지 이상 제시해 주세요.","source":{"kind":"community"}},{"id":"TEST-007","type":"short","category":"testing","difficulty":2,"topic":"API 의존 화면 테스트","tags":["view-model","dependency-injection","stub","mvvm","testability"],"question":"화면이 API 응답에 강하게 의존하는데, 서버 요청 없이 이 화면(뷰모델 포함)의 동작을 테스트하려면 코드를 어떻게 바꾸겠습니까?","source":{"kind":"community"}},{"id":"TEST-008","type":"short","category":"testing","difficulty":2,"topic":"private 메서드 테스트","tags":["private","testable","encapsulation","custom-view"],"question":"커스텀 뷰 안의 private 메서드에 복잡한 계산 로직이 있어서 테스트하고 싶습니다. 이 private 메서드를 어떻게 테스트하겠습니까, 아니면 하지 말아야 할까요?","source":{"kind":"community"}},{"id":"TEST-009","type":"short","category":"testing","difficulty":3,"topic":"UI 테스트를 단위 테스트로 대체","tags":["ui-test","unit-test","presentation-logic","snapshot","architecture"],"question":"느리고 자주 깨지는 UI 테스트가 수십 개 있습니다. 이 중 상당수를 단위 테스트로 대체하려면 코드와 테스트를 어떻게 재구성하겠습니까?","source":{"kind":"community"}},{"id":"TEST-010","type":"short","category":"testing","difficulty":2,"topic":"비동기 테스트","tags":["async","xctestexpectation","async-await","swift-testing","confirmation"],"question":"async/await 기반 API는 단위 테스트에서 어떻게 테스트하나요?","source":{"kind":"community"},"since":"Xcode 13"},{"id":"TEST-011","type":"mcq","category":"testing","difficulty":2,"topic":"XCTest 생명주기","tags":["xctest","setup","teardown","lifecycle"],"question":"다음 XCTestCase에서 `testA`와 `testB`가 실행될 때 호출되는 순서로 옳은 것은?\n\n```swift\nfinal class CartTests: XCTestCase {\n    override class func setUp() { /* 1 */ }\n    override func setUp() { /* 2 */ }\n    override func tearDown() { /* 3 */ }\n    override class func tearDown() { /* 4 */ }\n    func testA() {}\n    func testB() {}\n}\n```","source":{"kind":"community"}},{"id":"TEST-012","type":"mcq","category":"testing","difficulty":3,"topic":"불안정한(flaky) 테스트","tags":["flaky","determinism","shared-state","test-isolation"],"question":"CI에서 가끔만 실패하는 flaky 테스트를 만드는 **원인**을 모두 고르세요.","source":{"kind":"community"}},{"id":"TEST-013","type":"mcq","category":"testing","difficulty":2,"topic":"코드 커버리지","tags":["coverage","xcode","metrics"],"question":"코드 커버리지에 대해 **옳은 설명**을 모두 고르세요.","source":{"kind":"community"}},{"id":"TEST-014","type":"short","category":"testing","difficulty":3,"topic":"Core Data / SwiftData 테스트","tags":["core-data","swiftdata","in-memory","persistence-test"],"question":"Core Data(또는 SwiftData)에 의존하는 저장소 계층을 디스크에 아무것도 남기지 않고 단위 테스트하려면 어떻게 구성하나요?","source":{"kind":"community"},"since":"iOS 17"},{"id":"TEST-015","type":"short","category":"testing","difficulty":2,"topic":"뷰모델 테스트","tags":["mvvm","view-model","observation","state","main-actor"],"question":"다음 뷰모델의 `load()`를 테스트한다면 어떤 케이스를 검증하겠습니까?\n\n```swift\n@MainActor @Observable\nfinal class FeedViewModel {\n    enum State { case idle, loading, loaded([Post]), failed(String) }\n    private(set) var state: State = .idle\n    private let repo: PostRepository\n    init(repo: PostRepository) { self.repo = repo }\n    func load() async {\n        state = .loading\n        do { state = .loaded(try await repo.fetch()) }\n        catch { state = .failed(error.localizedDescription) }\n    }\n}\n```","source":{"kind":"community"},"since":"iOS 17"},{"id":"TEST-016","type":"short","category":"testing","difficulty":3,"topic":"Swift Testing vs XCTest","tags":["swift-testing","xctest","migration","macros"],"question":"Swift Testing은 XCTest와 무엇이 다른가요?","source":{"kind":"original"},"since":"Xcode 16"},{"id":"TEST-017","type":"mcq","category":"testing","difficulty":2,"topic":"Swift Testing 매크로","tags":["swift-testing","expect","require","macros"],"question":"Swift Testing의 `#expect`와 `#require`에 대해 **옳은 설명**을 모두 고르세요.","source":{"kind":"original"},"since":"Xcode 16"},{"id":"TEST-018","type":"mcq","category":"testing","difficulty":4,"topic":"Swift Testing 실행 모델","tags":["swift-testing","parallel","serialized","shared-state"],"question":"Swift Testing으로 작성한 스위트에서, 여러 테스트가 같은 파일 경로에 쓰고 읽는 바람에 간헐적으로 실패합니다. **가장 근본적인** 해결책은?","source":{"kind":"original"},"since":"Xcode 16"},{"id":"TEST-019","type":"short","category":"testing","difficulty":3,"topic":"스냅샷 테스트","tags":["snapshot-test","visual-regression","swift-snapshot-testing","ci"],"question":"스냅샷 테스트를 팀에 도입하려 합니다. 스냅샷 테스트는 어떤 문제를 해결해 주나요?","source":{"kind":"original"}},{"id":"TEST-020","type":"short","category":"testing","difficulty":3,"topic":"UI 테스트 안정화","tags":["xcuitest","accessibility-identifier","launch-arguments","flaky"],"question":"XCUITest로 만든 로그인 플로우 테스트가 CI에서 30%쯤 실패합니다. 안정화하기 위해 앱 코드 쪽에서는 무엇을 바꾸겠습니까?","source":{"kind":"original"}},{"id":"TEST-021","type":"mcq","category":"testing","difficulty":1,"topic":"테스트 더블 구분","tags":["test-double","spy","stub","mock"],"question":"\"분석 이벤트 전송 객체를 대체해, 뷰모델이 어떤 이벤트를 어떤 인자로 몇 번 보냈는지 테스트에서 검사하고 싶다.\" 이 목적에 가장 잘 맞는 테스트 더블은?","source":{"kind":"community"}},{"id":"TEST-022","type":"mcq","category":"testing","difficulty":3,"topic":"시간 의존 코드 테스트","tags":["clock","time","task-sleep","determinism"],"question":"\"3초 후 자동 재시도\" 로직이 `Task.sleep(for: .seconds(3))`을 쓰고 있어 테스트가 실제로 3초씩 기다립니다. 테스트를 빠르고 결정적으로 만드는 **올바른 접근**을 모두 고르세요.","source":{"kind":"original"},"since":"iOS 16"},{"id":"TEST-023","type":"short","category":"testing","difficulty":4,"topic":"동시성 코드 테스트","tags":["actor","sendable","data-race","thread-sanitizer","swift-concurrency"],"question":"actor와 Task를 사용하는 동시성 코드에서 데이터 레이스를 테스트로 재현하거나 검출하려면 어떻게 하나요?","source":{"kind":"original"},"since":"Swift 5.5"},{"id":"TEST-024","type":"short","category":"testing","difficulty":4,"topic":"대규모 프로젝트 테스트 전략","tags":["test-plan","modularization","ci","parallel","selective-testing"],"question":"모듈 40개, 테스트 8,000개인 앱에서 CI 테스트가 40분 걸립니다. 테스트 구조와 실행 전략을 어떻게 바꿔 PR당 10분 이내로 만들겠습니까?","source":{"kind":"original"}},{"id":"TEST-025","type":"mcq","category":"testing","difficulty":4,"topic":"XCTestCase 인스턴스 생명주기","tags":["xctest","lifecycle","memory","setup"],"question":"다음 테스트 클래스의 **문제점**을 모두 고르세요.\n\n```swift\nfinal class ImageCacheTests: XCTestCase {\n    let cache = ImageCache(directory: .temporaryDirectory, limitMB: 500)\n    func testStore() { /* cache 사용 */ }\n    func testEvict() { /* cache 사용 */ }\n    // ... 테스트 30개\n}\n```","source":{"kind":"original"}},{"id":"TEST-026","type":"mcq","category":"testing","difficulty":1,"topic":"@testable import","tags":["testable","access-control","test-target"],"question":"테스트 타깃에서 `@testable import MyApp`을 했을 때 **접근할 수 있게 되는** 선언은?","source":{"kind":"community"}},{"id":"TEST-027","type":"short","category":"testing","difficulty":2,"topic":"테이크홈 과제의 테스트 배치","tags":["take-home","unit-test","prioritization","architecture"],"question":"\"3~5시간 안에 끝내라\"는 안내와 함께 \"기본 단위 테스트를 포함한 최소 iOS 앱\"을 만드는 테이크홈 과제를 받았습니다. 시간이 빠듯할 때 **어디에 어떤 테스트를 넣겠습니까**?","source":{"kind":"company","company":"Twitter"}},{"id":"TEST-028","type":"short","category":"testing","difficulty":3,"topic":"실무 프로젝트에 TDD 적용","tags":["tdd","legacy","coverage","ui-test","workflow"],"question":"온사이트 질문입니다. \"지금 프로젝트에서 테스트를 어떻게 쓰고 있고, TDD를 실제 프로젝트에서 따르려면 어떻게 하겠어요?\" 이미 코드가 많은 기존 앱에 TDD를 도입하는 현실적인 방법을 중심으로 답해 주세요.","source":{"kind":"company","company":"Gojek"}},{"id":"TEST-029","type":"short","category":"testing","difficulty":3,"topic":"싱글톤 단위 테스트","tags":["singleton","dependency-injection","test-isolation","protocol"],"question":"`AuthManager.shared`를 코드 곳곳에서 직접 부르는 앱이 있습니다. 이 싱글톤에 의존하는 코드를 **단위 테스트**하려면 어떻게 하겠습니까?\n\n```swift\nfinal class AuthManager {\n    static let shared = AuthManager()\n    private(set) var token: String?\n    func login(_ id: String) async throws { token = try await API.login(id) }\n}\n```","source":{"kind":"company","company":"Walmart"}},{"id":"TEST-030","type":"short","category":"testing","difficulty":3,"topic":"테스트 추가가 쉬운 아키텍처","tags":["architecture","testability","dependency-injection","design-round"],"question":"아키텍처 라운드의 평가 항목 중 하나가 \"**큰 리팩터링 없이 단위 테스트를 추가할 수 있는 구조인가**\"입니다. 어떤 설계 결정이 이 조건을 만족시키는지 예를 들어 설명해 주세요.","source":{"kind":"company","company":"Discord"}},{"id":"TEST-031","type":"short","category":"testing","difficulty":3,"topic":"테스트 가치 판단","tags":["test-strategy","what-to-test","cost-benefit","priority"],"question":"라이브 코딩으로 상품 목록 화면(뷰모델 + 네트워크 + 가격 포맷팅 + 즐겨찾기 토글)을 만들었습니다. 면접관이 묻습니다. \"이 화면에서 **무엇은 테스트할 가치가 있고 무엇은 없나요?**\"","source":{"kind":"company","company":"CRED"}},{"id":"TEST-032","type":"short","category":"testing","difficulty":2,"topic":"테스트와 개발 워크플로 통합","tags":["workflow","ci","pull-request","test-plan","flaky"],"question":"테이크홈 과제의 서술 문항입니다. \"테스트를 개발 워크플로에 어떻게 통합하나요?\" 코드를 작성하는 순간부터 머지·릴리즈까지 테스트가 어느 시점에 어떻게 실행되는지 설명해 주세요.","source":{"kind":"company","company":"Headspace"}},{"id":"TEST-033","type":"mcq","category":"testing","difficulty":3,"topic":"URLProtocol 기반 네트워크 목킹","tags":["urlprotocol","mocking","urlsession","network-test"],"question":"네트워크 계층을 테스트하려고 `URLProtocol` 서브클래스로 응답을 가로채기로 했습니다. **옳은 설명**을 모두 고르세요.\n\n```swift\nfinal class StubProtocol: URLProtocol {\n    static var handler: ((URLRequest) throws -> (HTTPURLResponse, Data))?\n    override class func canInit(with request: URLRequest) -> Bool { true }\n    override class func canonicalRequest(for request: URLRequest) -> URLRequest { request }\n    override func startLoading() { /* ... */ }\n    override func stopLoading() {}\n}\n```","source":{"kind":"company","company":"Flipkart"}},{"id":"TEST-034","type":"mcq","category":"testing","difficulty":2,"topic":"자료구조 구현의 테스트 설계","tags":["xctest","test-design","edge-case","coderpad"],"question":"CoderPad에서 `push`·`pop`·`top`·`max`가 모두 O(1)인 `MaxStack`을 Swift 프로토콜 기반으로 구현하고 XCTest로 검증하라는 과제를 받았습니다. **적절한 테스트**를 모두 고르세요.","source":{"kind":"company","company":"Apple"}},{"id":"TEST-035","type":"short","category":"testing","difficulty":2,"topic":"PR 코드 리뷰에서 보는 것","tags":["code-review","pull-request","quality","take-home"],"question":"테이크홈 과제로 \"기존 PR을 리뷰하고 코멘트를 남기라\"는 과제를 받았습니다. iOS PR을 리뷰할 때 **무엇을 어떤 순서로** 보겠습니까?","source":{"kind":"company","company":"Deliveroo"}},{"id":"TEST-036","type":"short","category":"testing","difficulty":2,"topic":"테스트 가능한 코드 작성 원칙","tags":["testability","dependency-injection","pure-function","design"],"question":"\"단위 테스트를 고려한 코드를 작성해 본 경험과 거기서 얻은 철학·노하우\"를 묻는 질문입니다. 테스트를 염두에 두고 코드를 쓸 때 지키는 원칙을 **구체적인 코드 수준 습관**으로 말해 주세요.","source":{"kind":"community","company":"토스"}},{"id":"TEST-037","type":"short","category":"testing","difficulty":3,"topic":"SDK(라이브러리) 테스트 전략","tags":["sdk","integration-test","contract-test","backward-compatibility","sample-app"],"question":"앱이 아니라 **다른 회사 앱에 들어가는 채팅 SDK**를 만든다고 합시다. 테스트 관점에서 앱 테스트와 무엇이 달라지나요?","source":{"kind":"community","company":"센드버드"}},{"id":"TEST-038","type":"mcq","category":"testing","difficulty":2,"topic":"Quick·Nimble","tags":["quick","nimble","bdd","xctest","matcher"],"question":"팀 코드베이스가 Quick과 Nimble을 씁니다. 두 라이브러리에 대해 **옳은 설명**을 모두 고르세요.","source":{"kind":"community","company":"카카오뱅크"}},{"id":"TEST-039","type":"short","category":"testing","difficulty":2,"topic":"커버리지의 해석","tags":["testing","coverage","risk","unit-test"],"question":"iOS 결제 앱의 line coverage가 90%인데도 결제 실패 처리가 릴리스마다 회귀합니다. 이 90%라는 숫자가 보장하는 것과 보장하지 못하는 것은 무엇입니까?","source":{"kind":"community","company":"Barclays"}},{"id":"TEST-040","type":"short","category":"testing","difficulty":1,"topic":"오디오 ViewModel 단위 테스트","tags":["unit-test","fake","viewmodel","state"],"question":"음악 앱의 재생 목록 ViewModel이 Repository에서 곡 목록을 받아 로딩, 성공, 오류 상태를 만듭니다. 실제 네트워크 없이 이 상태 전이를 어떻게 테스트하겠습니까?","source":{"kind":"community","company":"Pandora"}},{"id":"TEST-041","type":"short","category":"testing","difficulty":2,"topic":"CI에서 신뢰할 수 있는 테스트","tags":["ci","flaky-test","fixture","test-plan"],"question":"배달 앱 iOS 프로젝트의 unit test와 UI test가 로컬에서는 통과하는데 CI에서만 가끔 실패합니다. 이런 flaky test를 어떻게 줄이겠습니까?","source":{"kind":"community","company":"요기요"}},{"id":"TEST-042","type":"short","category":"testing","difficulty":2,"topic":"UI 테스트의 범위","tags":["ui-test","stub","launch-arguments","testing-pyramid"],"question":"여행 예약 앱의 검색 화면 UI test가 모든 API를 실제 서버로 호출해 느리고 자주 깨집니다. UI test에 남길 것과 unit이나 integration test로 내려보낼 것을 어떻게 나누겠습니까?","source":{"kind":"community","company":"마이리얼트립"}},{"id":"TEST-043","type":"short","category":"testing","difficulty":2,"topic":"TDD의 작은 피드백 루프","tags":["tdd","red-green-refactor","unit-test","refactoring"],"question":"온라인 강의 앱에 쿠폰 할인 가격 계산 규칙을 TDD로 추가합니다. red-green-refactor 사이클에서 첫 번째 테스트로 어떤 예제를 고르겠습니까?","source":{"kind":"community","company":"클래스101"}},{"id":"TEST-044","type":"short","category":"testing","difficulty":2,"topic":"비동기 스트림 테스트","tags":["asyncstream","testing","cancellation","realtime"],"question":"라이브 방송 앱의 채팅 ViewModel이 `AsyncSequence`로 들어오는 메시지를 구독해 목록에 붙입니다. 테스트에서 이 메시지 스트림을 어떻게 제어하겠습니까?","source":{"kind":"community","company":"SOOP"}},{"id":"TEST-045","type":"short","category":"testing","difficulty":2,"topic":"코드 리뷰와 회귀 테스트","tags":["code-review","regression","behavior","testing"],"question":"미용 시술 예약 앱에서 버그를 고친 PR에 \"재현 테스트가 없다\"는 리뷰가 달렸습니다. 리뷰어가 코드를 이미 읽고 승인할 수 있는데도 재현 테스트를 따로 요구하는 이유는 무엇입니까?","source":{"kind":"community","company":"강남언니"}},{"id":"TEST-046","type":"short","category":"testing","difficulty":2,"topic":"테스트 자동화의 계층","tags":["test-pyramid","ci","automation","quality"],"question":"중고 거래 앱의 상품 등록 기능에 자동화 테스트를 처음 붙입니다. unit test, API 계약 test, UI test 세 층에 각각 무엇을 맡기겠습니까?","source":{"kind":"community","company":"번개장터"}},{"id":"UIKIT-001","type":"short","category":"uikit","difficulty":1,"topic":"frame과 bounds","tags":["frame","bounds","coordinate","scrollview","transform"],"question":"UIKit 커스텀 뷰를 디버깅하다 `bounds.origin`이 (0, 0)이 아닌 값을 봤습니다. frame과 bounds는 무엇이 다른가요?","source":{"kind":"community"}},{"id":"UIKIT-002","type":"mcq","category":"uikit","difficulty":1,"topic":"뷰 컨트롤러 생명주기","tags":["viewcontroller","lifecycle","viewdidload","viewdidappear"],"question":"화면이 처음 표시될 때 UIViewController 생명주기 메서드가 호출되는 순서로 올바른 것은?","source":{"kind":"community"}},{"id":"UIKIT-003","type":"short","category":"uikit","difficulty":2,"topic":"viewDidLoad와 네트워크 요청","tags":["viewdidload","lifecycle","network","task","cancellation"],"question":"UIKit 화면에서 동료가 viewDidLoad에서 바로 네트워크 요청을 시작하고 응답을 받으면 UI를 갱신하는 코드를 짰습니다. 이 방식에서 생길 수 있는 문제는 무엇인가요?","source":{"kind":"community"}},{"id":"UIKIT-004","type":"short","category":"uikit","difficulty":1,"topic":"오토레이아웃 기본","tags":["autolayout","constraint","nslayoutanchor","visual-format"],"question":"오토레이아웃의 제약(constraint)이 내부적으로 어떤 식(공식)으로 표현되는지 설명해 주세요.","source":{"kind":"community"}},{"id":"UIKIT-005","type":"mcq","category":"uikit","difficulty":2,"topic":"Content Hugging / Compression Resistance","tags":["autolayout","hugging","compression-resistance","priority"],"question":"오토레이아웃으로 한 줄에 `titleLabel`과 `dateLabel`을 가로로 나란히 두었습니다. 제목이 길어지면 제목은 줄어들고(말줄임) 날짜는 항상 온전히 보여야 합니다. 어떤 우선순위를 조정해야 하나요?","source":{"kind":"community"}},{"id":"UIKIT-006","type":"short","category":"uikit","difficulty":2,"topic":"Intrinsic Content Size","tags":["autolayout","intrinsic-content-size","custom-view","invalidate"],"question":"직접 만든 커스텀 뷰(예: 태그 칩 뷰)를 UIStackView에 넣었더니 크기가 0으로 잡혀 보이지 않습니다. 원인과 해결 방법을 intrinsic content size 관점에서 설명해 주세요.","source":{"kind":"community"}},{"id":"UIKIT-007","type":"mcq","category":"uikit","difficulty":1,"topic":"Safe Area","tags":["safe-area","layout-guide","notch","autolayout"],"question":"Safe Area에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"UIKIT-008","type":"mcq","category":"uikit","difficulty":1,"topic":"Leading vs Left","tags":["autolayout","leading","rtl","localization"],"question":"오토레이아웃 제약을 걸 때 `leadingAnchor` 대신 `leftAnchor`를 써도 되는 경우로 가장 적절한 것은?","source":{"kind":"community"}},{"id":"UIKIT-009","type":"short","category":"uikit","difficulty":1,"topic":"스토리보드 vs 코드 UI","tags":["storyboard","xib","programmatic-ui","git-conflict"],"question":"팀에서 스토리보드를 쓸지 코드로만 UI를 짤지 논의 중입니다. 각각의 장단점을 말해 주세요.","source":{"kind":"company","company":"Uber"}},{"id":"UIKIT-010","type":"short","category":"uikit","difficulty":2,"topic":"레이아웃 갱신 메서드","tags":["setneedslayout","layoutifneeded","layoutsubviews","setneedsdisplay","runloop"],"question":"UIKit의 `setNeedsLayout`과 `layoutIfNeeded`는 각각 무엇을 하고 언제 호출해야 하나요?","source":{"kind":"company","company":"TikTok"}},{"id":"UIKIT-011","type":"mcq","category":"uikit","difficulty":2,"topic":"제약 애니메이션","tags":["autolayout","animation","layoutifneeded","constraint"],"question":"UIKit 오토레이아웃 기반 아래 코드는 패널을 위로 슬라이드시키려는 의도지만 애니메이션 없이 즉시 이동합니다. 원인은?\n\n```swift\nbottomConstraint.constant = -300\nview.layoutIfNeeded()\nUIView.animate(withDuration: 0.3) {\n    self.view.layoutIfNeeded()\n}\n```","source":{"kind":"community"}},{"id":"UIKIT-012","type":"short","category":"uikit","difficulty":2,"topic":"셀 재사용과 비동기 이미지","tags":["tableview","collectionview","cell-reuse","async-image","prepareforreuse"],"question":"UITableView 기반 피드에서 빠르게 스크롤하면 이미지가 엉뚱한 셀에 잠깐 표시됐다가 바뀌는 앱을 받았습니다. 원인은 무엇인가요?","source":{"kind":"community"}},{"id":"UIKIT-013","type":"mcq","category":"uikit","difficulty":2,"topic":"dequeueReusableCell API","tags":["tableview","dequeue","reuse-identifier","register"],"question":"UITableView 의 `dequeueReusableCell(withIdentifier:for:)`와 `dequeueReusableCell(withIdentifier:)`에 대한 설명으로 옳은 것을 **모두** 고르세요.","source":{"kind":"community"}},{"id":"UIKIT-014","type":"short","category":"uikit","difficulty":2,"topic":"동적 셀 높이","tags":["tableview","self-sizing","automatic-dimension","estimated-height"],"question":"UITableView 에서 댓글 길이에 따라 높이가 달라지는 셀을 만들어야 합니다. 셀 높이를 콘텐츠에 맞춰 자동으로 잡으려면 무엇을 설정해야 하나요?","source":{"kind":"community"}},{"id":"UIKIT-015","type":"short","category":"uikit","difficulty":2,"topic":"리스폰더 체인과 히트 테스트","tags":["responder-chain","hit-test","touch","first-responder","uievent"],"question":"UIKit 앱에서 화면을 탭했을 때 그 터치가 어떤 뷰에 전달되는지 결정되는 과정(hit testing)을 설명해 주세요.","source":{"kind":"company","company":"TikTok"}},{"id":"UIKIT-016","type":"mcq","category":"uikit","difficulty":3,"topic":"hitTest 오버라이드","tags":["hit-test","touch","custom-view","bounds"],"question":"UIKit 커스텀 탭바 가운데에 위로 20pt 튀어나온 원형 버튼을 두었습니다. 튀어나온 부분을 탭하면 반응이 없습니다. 아래 오버라이드 중 이 문제를 올바르게 해결하는 것은?\n\n```swift\n// 탭바(부모 뷰) 안\noverride func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n    /* ??? */\n}\n```","source":{"kind":"original"}},{"id":"UIKIT-017","type":"short","category":"uikit","difficulty":3,"topic":"UIView와 CALayer","tags":["calayer","uiview","core-animation","rendering","layer"],"question":"UIView와 CALayer는 어떤 관계이고 왜 역할이 나뉘어 있나요?","source":{"kind":"community"}},{"id":"UIKIT-018","type":"short","category":"uikit","difficulty":3,"topic":"중첩 스크롤 셀 설계","tags":["tableview","collectionview","nested","cell-reuse","content-offset"],"question":"UITableViewCell 안에 가로 스크롤 UICollectionView를 코드로 넣어야 합니다(앱스토어 '오늘' 탭 같은 캐러셀 행). 내부 컬렉션뷰의 dataSource와 delegate는 누가 맡도록 설계하나요?","source":{"kind":"community","company":"Airbnb"}},{"id":"UIKIT-019","type":"short","category":"uikit","difficulty":3,"topic":"스크롤 성능 진단","tags":["performance","scroll","instruments","hitch","offscreen-rendering"],"question":"이미지와 텍스트가 섞인 피드 화면에서 스크롤이 버벅인다는 제보를 받았습니다. 어디부터 어떻게 확인하나요?","source":{"kind":"community","company":"Snap"}},{"id":"UIKIT-020","type":"short","category":"uikit","difficulty":3,"topic":"Compositional Layout과 Diffable Data Source","tags":["collectionview","compositional-layout","diffable-datasource","snapshot"],"question":"기존 UICollectionViewFlowLayout + 인덱스 기반 dataSource로 만든 화면을 UICollectionViewCompositionalLayout + UICollectionViewDiffableDataSource로 옮기려 합니다. 무엇이 좋아지나요?","source":{"kind":"original"},"since":"iOS 13"},{"id":"UIKIT-021","type":"mcq","category":"uikit","difficulty":3,"topic":"Diffable Data Source 동작","tags":["diffable-datasource","snapshot","hashable","collectionview"],"question":"UICollectionViewDiffableDataSource 사용 시 옳은 설명을 **모두** 고르세요.","source":{"kind":"original"},"since":"iOS 13"},{"id":"UIKIT-022","type":"short","category":"uikit","difficulty":2,"topic":"뷰 계층 순회","tags":["view-hierarchy","bfs","dfs","subviews","coding"],"question":"루트 뷰에서 시작해 특정 조건(예: `tag == 99` 또는 특정 타입)을 만족하는 뷰를 찾는 함수를 어떻게 작성하겠습니까?\n\n```swift\nfunc findView(in root: UIView, where predicate: (UIView) -> Bool) -> UIView?\n```","source":{"kind":"community"}},{"id":"UIKIT-023","type":"short","category":"uikit","difficulty":3,"topic":"공통 superview 찾기","tags":["view-hierarchy","superview","lca","algorithm","coding"],"question":"여러 개의 UIView가 주어졌을 때 이들의 가장 가까운 공통 superview를 반환하는 함수를 어떻게 설계하겠습니까?","source":{"kind":"community"}},{"id":"UIKIT-024","type":"short","category":"uikit","difficulty":4,"topic":"오프스크린 렌더링과 렌더 파이프라인","tags":["rendering","offscreen","core-animation","gpu","shadow","cornerradius"],"question":"UIKit 목록 화면에서 프로필 이미지가 있는 셀에 `layer.cornerRadius` + `masksToBounds` + `shadow`를 함께 적용했더니 스크롤 프레임이 떨어집니다. 렌더 파이프라인 관점에서 왜 비싼가요?","source":{"kind":"original"}},{"id":"UIKIT-025","type":"mcq","category":"uikit","difficulty":2,"topic":"다크 모드 대응","tags":["dark-mode","trait-collection","dynamic-color","cgcolor"],"question":"UIKit 앱에서 다크 모드를 지원할 때 옳은 설명을 **모두** 고르세요.","source":{"kind":"community"},"since":"iOS 13"},{"id":"UIKIT-026","type":"short","category":"uikit","difficulty":4,"topic":"Core Animation 모델/프레젠테이션 레이어","tags":["core-animation","presentation-layer","model-layer","animation","touch"],"question":"UIView 애니메이션으로 화면을 가로질러 3초 동안 이동하는 뷰가 있습니다. 이동 중에 뷰를 탭해도 반응이 없고, 애니메이션 중간에 `view.frame`을 찍어 보면 이미 목적지 값입니다. 이 두 현상은 왜 생기나요?","source":{"kind":"community"}},{"id":"UIKIT-027","type":"short","category":"uikit","difficulty":4,"topic":"오토레이아웃 성능 최적화","tags":["autolayout","performance","cassowary","constraint","layout-pass"],"question":"제약이 수백 개인 복잡한 셀로 구성된 화면에서 레이아웃 패스가 병목으로 잡혔습니다. 오토레이아웃 엔진의 동작을 근거로 무엇이 비용을 키우는지 설명해 주세요.","source":{"kind":"community"}},{"id":"UIKIT-028","type":"mcq","category":"uikit","difficulty":4,"topic":"UIKit 렌더 루프 패스 순서","tags":["runloop","layout-pass","update-constraints","display","core-animation"],"question":"메인 런루프 한 사이클에서 UIKit이 화면 갱신을 위해 처리하는 패스의 순서로 올바른 것은? (setNeedsUpdateConstraints / setNeedsLayout / setNeedsDisplay로 각각 표시된 뷰가 있다고 가정)","source":{"kind":"original"}},{"id":"UIKIT-029","type":"short","category":"uikit","difficulty":2,"topic":"코드 제약으로 네 모서리 배치","tags":["autolayout","nslayoutconstraint","anchor","programmatic-ui","live-coding"],"question":"라이브 코딩입니다. `[UIImage]`를 받아 커스텀 `UIView`의 네 모서리에 하나씩 고정(pin)하는 뷰를 코드 제약만으로 어떻게 만들겠습니까?\n\n```swift\nfinal class CornerImagesView: UIView {\n    init(images: [UIImage]) { /* ... */ }\n}\n```","source":{"kind":"company","company":"Google"}},{"id":"UIKIT-030","type":"short","category":"uikit","difficulty":3,"topic":"UIScrollView 원리 재구현","tags":["uiscrollview","bounds","pan-gesture","contentoffset","internals"],"question":"UIScrollView가 없다고 가정하고, 손가락을 따라 콘텐츠가 움직이는 스크롤 뷰를 UIView 서브클래스로 직접 만들어야 합니다. 어떤 프로퍼티를 바꿔서 콘텐츠를 움직이겠습니까?","source":{"kind":"company","company":"Meta"}},{"id":"UIKIT-031","type":"short","category":"uikit","difficulty":3,"topic":"셀 노출(impression) 측정","tags":["uitableview","impression","analytics","willdisplay","visible-rect"],"question":"피드의 각 게시물이 '화면에 50% 이상, 1초 이상 보였을 때' 노출 이벤트를 한 번만 보내야 합니다. UITableView/UICollectionView 위에서 이 노출 측정기를 어떻게 설계하나요?","source":{"kind":"company","company":"Reddit"}},{"id":"UIKIT-032","type":"short","category":"uikit","difficulty":3,"topic":"코너 순환 애니메이션","tags":["uiview-animate","animation","completion","uiviewpropertyanimator","live-coding"],"question":"UIKit 25분 과제입니다. 화면의 작은 로고 뷰가 옛날 DVD 화면 보호기처럼 좌상→우상→우하→좌하 네 모서리를 순서대로 무한히 이동해야 합니다. 어떻게 구현하나요?","source":{"kind":"company","company":"Zomato"}},{"id":"UIKIT-033","type":"mcq","category":"uikit","difficulty":1,"topic":"UIResponder 상속 계층","tags":["uiresponder","uicontrol","inheritance","uibutton"],"question":"`NSObject`에서 출발해 `UIButton`까지 내려가는 상속 계층으로 올바른 것은?","source":{"kind":"company","company":"Zomato"}},{"id":"UIKIT-034","type":"short","category":"uikit","difficulty":2,"topic":"스티키 헤더·캐러셀·당겨서 새로고침","tags":["uicollectionview","compositional-layout","sticky-header","carousel","uirefreshcontrol"],"question":"테이크홈 과제 리뷰입니다. 홈 화면에 (1) 스크롤해도 상단에 붙어 있는 필터 헤더, (2) 배너·식당 두 줄의 가로 스크롤 캐러셀이 있어야 합니다. UIKit에서 각각 어떤 API로 구현하겠습니까?","source":{"kind":"company","company":"Swiggy"}},{"id":"UIKIT-035","type":"short","category":"uikit","difficulty":4,"topic":"UITableView → UICollectionView 전환 설득","tags":["uitableview","uicollectionview","migration","list-configuration","tech-lead"],"question":"프로젝트에 UITableView 화면이 수백 개 있습니다. 당신은 이를 UICollectionView로 바꾸자고 제안하려 합니다. 반대하는 팀원들을 어떤 근거로 설득하겠습니까?","source":{"kind":"company","company":"네이버웹툰"}},{"id":"UIKIT-036","type":"mcq","category":"uikit","difficulty":2,"topic":"viewDidLoad 이전 호출","tags":["lifecycle","loadview","awakefromnib","init-coder","uiviewcontroller"],"question":"스토리보드에서 인스턴스화되는 UIViewController에서 `viewDidLoad()`보다 **먼저** 호출되는 메서드를 **모두** 고르세요.","source":{"kind":"company","company":"라인"}},{"id":"UIKIT-037","type":"short","category":"uikit","difficulty":3,"topic":"UICollectionView 내부 구조","tags":["uicollectionview","uicollectionviewlayout","layout-attributes","custom-layout","prefetching"],"question":"UICollectionView를 UITableView 대신 쓰는 이유를 내부 구조(레이아웃 객체·attributes·재사용) 관점에서 설명해 주세요.","source":{"kind":"company","company":"크림"}},{"id":"UIKIT-038","type":"short","category":"uikit","difficulty":2,"topic":"dataSource와 delegate 분리 설계","tags":["uitableview","datasource","delegate","protocol","api-design","objective-c"],"question":"Apple은 왜 UITableView에 데이터 배열을 그냥 넘기게 하지 않고, `dataSource`와 `delegate`라는 두 프로토콜로 나눠 설계했을까요?","source":{"kind":"company","company":"ByteDance"}},{"id":"UIKIT-039","type":"short","category":"uikit","difficulty":3,"topic":"재사용 셀의 개별 카운트다운","tags":["uitableview","timer","cell-reuse","prepareforreuse","runloop","objective-c"],"question":"UITableView 로 만든 타임세일 목록의 각 셀에 '남은 시간 00:12:34'가 1초마다 줄어드는 카운트다운이 있습니다. 셀마다 Timer를 두는 대신 어떻게 설계하겠습니까?","source":{"kind":"company","company":"Baidu"}},{"id":"UIKIT-040","type":"mcq","category":"uikit","difficulty":2,"topic":"테이블뷰 메서드 호출 순서","tags":["uitableview","datasource","heightforrow","estimatedrowheight","reloaddata","objective-c"],"question":"`estimatedRowHeight`를 쓰지 않는 UITableView에서 `reloadData()` 직후 다음 네 메서드가 호출되는 순서로 올바른 것은?\n\n- `numberOfSections(in:)`\n- `tableView(_:numberOfRowsInSection:)`\n- `tableView(_:heightForRowAt:)`\n- `tableView(_:cellForRowAt:)`","source":{"kind":"company","company":"Tencent"}},{"id":"UIKIT-041","type":"short","category":"uikit","difficulty":3,"topic":"컬렉션뷰·테이블뷰 연동 스크롤","tags":["uicollectionview","uitableview","scrollviewdidscroll","synchronized-scroll","code-review"],"question":"연락처 화면 코드 리뷰입니다. 상단에는 알파벳 인덱스가 가로로 스크롤되는 UICollectionView, 아래에는 섹션별 연락처 UITableView가 있고, 테이블을 스크롤하면 상단 인덱스가 따라 선택되고 상단을 탭하면 테이블이 해당 섹션으로 이동해야 합니다. 이 양방향 연동에서 두 방향이 서로를 트리거해 무한 왕복하는 버그는 어떻게 찾아 고치나요?","source":{"kind":"company","company":"Microsoft"}},{"id":"UIKIT-042","type":"mcq","category":"uikit","difficulty":3,"topic":"재사용 셀과 CALayer","tags":["cell-reuse","calayer","shadowpath","gradient","prepareforreuse","objective-c"],"question":"UIKit 의 재사용되는 셀에 그라데이션·그림자·애니메이션 같은 layer 효과를 넣을 때 생기는 문제와 올바른 대응을 **모두** 고르세요.","source":{"kind":"company","company":"Alibaba"}},{"id":"UIKIT-043","type":"short","category":"uikit","difficulty":2,"topic":"이미지 셀 재사용과 취소","tags":["uikit","collection-view","image-loading","reuse"],"question":"UIKit 컬렉션 뷰의 이미지 셀에서 빠르게 스크롤하면 이전 요청의 응답이 재사용된 셀에 잠깐 떴다가 바뀝니다. 셀이 재사용되는 시점에 무엇을 취소하겠습니까?","source":{"kind":"company","company":"Lyft"}},{"id":"UIKIT-044","type":"short","category":"uikit","difficulty":2,"topic":"UIView 공통 부모 찾기","tags":["uiview","view-hierarchy","ancestor","set"],"question":"두 `UIView`가 주어졌을 때 가장 가까운 공통 부모 뷰를 찾는 함수를 작성합니다. 한쪽 뷰의 superview 체인은 어떤 자료구조에 담아 두겠습니까?","source":{"kind":"community","company":"Oracle"}},{"id":"UIKIT-045","type":"short","category":"uikit","difficulty":2,"topic":"완료 상태의 목록 UI","tags":["uitableview","diffable-data-source","state","snapshot"],"question":"개표 결과를 보여 주는 UIKit 테이블 화면입니다. 모든 지역 결과가 도착하면 새로고침 버튼을 숨기고 승자 행을 강조해야 합니다. 이 '개표 완료' 조건을 네트워크 콜백 안의 임시 플래그가 아니라 무엇으로 표현하겠습니까?","source":{"kind":"community","company":"BBC"}},{"id":"UIKIT-046","type":"short","category":"uikit","difficulty":2,"topic":"Auto Layout 우선순위","tags":["autolayout","constraint-priority","hugging","compression-resistance"],"question":"좁은 화면에서 제목 레이블과 가격 레이블이 한 줄에 놓여야 하는데 둘 다 자기 글자 폭을 전부 요구합니다. Auto Layout에서 어느 레이블이 잘리고 어느 레이블이 온전히 보일지 무엇으로 정하겠습니까?","source":{"kind":"community","company":"더스윙"}},{"id":"UIKIT-047","type":"short","category":"uikit","difficulty":2,"topic":"Undo 가능한 게임 상태","tags":["state-management","undo","snapshot","uikit"],"question":"UIKit으로 만든 틱택토에서 횟수 제한 없는 undo를 지원해야 합니다. 되돌리기를 위해 무엇을 저장해 두겠습니까?","source":{"kind":"company","company":"Instacart"}},{"id":"UIKIT-048","type":"short","category":"uikit","difficulty":3,"topic":"대형 그리드 Flood Fill","tags":["collection-view","flood-fill","bfs","batch-updates"],"question":"컬렉션 뷰로 그린 큰 픽셀 그리드(예: 500×500)에 flood fill을 구현합니다. 재귀 DFS를 쓰지 않는다면 탐색을 무엇으로 짜겠습니까?","source":{"kind":"community","company":"Pinterest"}},{"id":"UIKIT-049","type":"short","category":"uikit","difficulty":2,"topic":"채팅 입력창과 키보드 레이아웃","tags":["keyboard","autolayout","chat","safe-area"],"question":"UIKit 채팅 화면에서 키보드가 올라올 때 입력창이 키보드 바로 위에 붙어 따라 움직여야 합니다. 키보드 높이 변화를 Auto Layout 제약에 어떻게 연결하겠습니까?","source":{"kind":"company","company":"JD.com"},"since":"iOS 15"},{"id":"UIKIT-050","type":"short","category":"uikit","difficulty":2,"topic":"자기 크기 셀과 Dynamic Type","tags":["dynamic-type","self-sizing","uikit","accessibility"],"question":"UIKit 차량 목록 셀이 접근성 큰 글자 설정에서도 잘리지 않고 높이가 늘어나야 합니다. 셀 높이가 글자 크기에 따라 자동으로 계산되게 하려면 제약을 어떻게 걸어야 합니까?","source":{"kind":"community","company":"카카오모빌리티"}}]