요즘 iOS 채용공고의 기술 스택은 다섯 개로 수렴합니다 — SwiftUI · Swift Concurrency · TCA · Tuist · Combine. 이 다섯은 따로 노는 목록이 아니라 한 화면을 만들 때 각자 다른 층을 맡는 한 벌입니다. 면접에서 갈리는 지점도 개별 API 암기가 아니라 이 층들이 어디서 만나고 어디서 충돌하는가입니다.
다섯 스택은 어느 층을 맡는가
Concurrency와 Combine이 같은 층에 나란히 있는 게 포인트입니다. 둘은 대체재가 아니라 "한 번 응답"과 "계속 흐름"이라는 다른 모양의 비동기를 맡습니다. 이 구분을 못 하면 "왜 여기는 async/await이고 저기는 Publisher냐"는 질문에서 막힙니다.
이 코스가 다루는 범위
다섯 스택 중 Concurrency와 SwiftUI는 이 허브에 이미 전용 코스가 있습니다. 같은 내용을 두 벌 만들지 않기 위해, 이 코스는 아직 전용 문서가 없던 다섯 주제를 깊게 다루고 나머지는 기존 코스로 연결합니다.
| 주제 | 어디서 배우나 | 상태 |
|---|---|---|
| TCA | 이 코스 01장 | 신규 |
| Tuist · 모듈 아키텍처 | 이 코스 02장 | 신규 |
| 모듈 간 화면 이동 · DI | 이 코스 03장 | 신규 |
| Combine | 이 코스 04장 | 신규 |
| 라이브코딩 · 설계 토론 | 이 코스 05장 | 신규 |
| Swift Concurrency | Swift Concurrency 면접 꼬리질문 10선 | 기존 코스 |
| SwiftUI | SwiftUI 로드맵 | 기존 코스 |
| Swift 언어 · 메모리 | Swift & Foundation 로드맵 | 기존 코스 |
챕터
State·Action·Reducer·Effect의 실제 구조, Scope/ifLet/forEach 합성,
TestStore의 완전성 검증, 그리고 언제 쓰지 말아야 하는지까지.
MVVM·ReactorKit과의 계보 비교를 함께 다룹니다.
Interface/Implementation 분리가 왜 빌드를 빠르게 하는지, static과 dynamic 링킹의 트레이드오프, 동적 프레임워크 개수가 앱 시작 시간에 미치는 영향, 그리고 모듈을 너무 잘게 쪼갤 때 생기는 역효과.
모듈을 나누면 바로 부딪히는 벽 — 다른 모듈의 화면을 못 띄운다.
Factory·클로저·Route enum·DI 컨테이너 네 방식을 결합 범위 축에서 비교하고,
AnyView의 실제 비용과 반론까지 짚습니다.
대응표로 끝내면 안 되는 진짜 차이 세 가지 — 타입에 박힌 Failure,
demand 기반 백프레셔, 리플레이 없는 share(). 메모리 누수 함정과 async/await 브릿지까지.
검색 화면·무한 스크롤·이미지 캐시 같은 단골 과제의 채점 포인트, "불가능한 상태를 표현 불가능하게" 만드는 상태 모델링, 그리고 설계 토론에서 쓸 레이어 뼈대.
추천 학습 경로
코드 예시는 TCA 1.x(@Reducer·@ObservableState 기준),
Swift 6.x, iOS 17+ API를 기준으로 씁니다. 그 이전 버전과 문법이 다른 지점은 본문에서 따로 표시합니다.